Clement Courbet | ac74acd | 2018-04-04 11:37:06 +0000 | [diff] [blame] | 1 | //===-- BenchmarkResultTest.cpp ---------------------------------*- C++ -*-===// |
| 2 | // |
Chandler Carruth | 2946cd7 | 2019-01-19 08:50:56 +0000 | [diff] [blame] | 3 | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| 4 | // See https://llvm.org/LICENSE.txt for license information. |
| 5 | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
Clement Courbet | ac74acd | 2018-04-04 11:37:06 +0000 | [diff] [blame] | 6 | // |
| 7 | //===----------------------------------------------------------------------===// |
| 8 | |
| 9 | #include "BenchmarkResult.h" |
Guillaume Chatelet | 55ad087 | 2018-09-25 12:18:08 +0000 | [diff] [blame] | 10 | #include "X86InstrInfo.h" |
Clement Courbet | ac74acd | 2018-04-04 11:37:06 +0000 | [diff] [blame] | 11 | #include "llvm/ADT/SmallString.h" |
| 12 | #include "llvm/Support/Error.h" |
Clement Courbet | 308f8b7 | 2018-04-13 13:37:07 +0000 | [diff] [blame] | 13 | #include "llvm/Support/Path.h" |
Guillaume Chatelet | 55ad087 | 2018-09-25 12:18:08 +0000 | [diff] [blame] | 14 | #include "llvm/Support/TargetRegistry.h" |
| 15 | #include "llvm/Support/TargetSelect.h" |
Clement Courbet | ac74acd | 2018-04-04 11:37:06 +0000 | [diff] [blame] | 16 | #include "llvm/Support/YAMLTraits.h" |
| 17 | #include "llvm/Support/raw_ostream.h" |
| 18 | #include "gmock/gmock.h" |
| 19 | #include "gtest/gtest.h" |
| 20 | |
Clement Courbet | 53d35d2 | 2018-06-05 10:56:19 +0000 | [diff] [blame] | 21 | using ::testing::AllOf; |
| 22 | using ::testing::Eq; |
| 23 | using ::testing::get; |
| 24 | using ::testing::Pointwise; |
| 25 | using ::testing::Property; |
| 26 | |
Fangrui Song | 32401af | 2018-10-22 17:10:47 +0000 | [diff] [blame] | 27 | namespace llvm { |
Clement Courbet | ac74acd | 2018-04-04 11:37:06 +0000 | [diff] [blame] | 28 | namespace exegesis { |
| 29 | |
| 30 | bool operator==(const BenchmarkMeasure &A, const BenchmarkMeasure &B) { |
Clement Courbet | 684a5f6 | 2018-09-26 08:37:21 +0000 | [diff] [blame] | 31 | return std::tie(A.Key, A.PerInstructionValue, A.PerSnippetValue) == |
| 32 | std::tie(B.Key, B.PerInstructionValue, B.PerSnippetValue); |
Clement Courbet | ac74acd | 2018-04-04 11:37:06 +0000 | [diff] [blame] | 33 | } |
| 34 | |
Clement Courbet | d422d3a | 2019-10-09 11:29:21 +0000 | [diff] [blame] | 35 | static std::string Dump(const MCInst &McInst) { |
Guillaume Chatelet | 083a0c16 | 2018-06-07 07:40:40 +0000 | [diff] [blame] | 36 | std::string Buffer; |
Clement Courbet | d422d3a | 2019-10-09 11:29:21 +0000 | [diff] [blame] | 37 | raw_string_ostream OS(Buffer); |
Guillaume Chatelet | 083a0c16 | 2018-06-07 07:40:40 +0000 | [diff] [blame] | 38 | McInst.print(OS); |
| 39 | return Buffer; |
| 40 | } |
| 41 | |
Clement Courbet | 53d35d2 | 2018-06-05 10:56:19 +0000 | [diff] [blame] | 42 | MATCHER(EqMCInst, "") { |
Guillaume Chatelet | 083a0c16 | 2018-06-07 07:40:40 +0000 | [diff] [blame] | 43 | const std::string Lhs = Dump(get<0>(arg)); |
| 44 | const std::string Rhs = Dump(get<1>(arg)); |
| 45 | if (Lhs != Rhs) { |
| 46 | *result_listener << Lhs << " <=> " << Rhs; |
| 47 | return false; |
| 48 | } |
| 49 | return true; |
Clement Courbet | 53d35d2 | 2018-06-05 10:56:19 +0000 | [diff] [blame] | 50 | } |
| 51 | |
Clement Courbet | ac74acd | 2018-04-04 11:37:06 +0000 | [diff] [blame] | 52 | namespace { |
| 53 | |
| 54 | TEST(BenchmarkResultTest, WriteToAndReadFromDisk) { |
Guillaume Chatelet | 55ad087 | 2018-09-25 12:18:08 +0000 | [diff] [blame] | 55 | LLVMInitializeX86TargetInfo(); |
| 56 | LLVMInitializeX86Target(); |
| 57 | LLVMInitializeX86TargetMC(); |
| 58 | |
| 59 | // Read benchmarks. |
Guillaume Chatelet | eece405 | 2018-09-25 13:18:10 +0000 | [diff] [blame] | 60 | const LLVMState State("x86_64-unknown-linux", "haswell"); |
Guillaume Chatelet | 55ad087 | 2018-09-25 12:18:08 +0000 | [diff] [blame] | 61 | |
Clement Courbet | d422d3a | 2019-10-09 11:29:21 +0000 | [diff] [blame] | 62 | ExitOnError ExitOnErr; |
Clement Courbet | 53d35d2 | 2018-06-05 10:56:19 +0000 | [diff] [blame] | 63 | |
Clement Courbet | ac74acd | 2018-04-04 11:37:06 +0000 | [diff] [blame] | 64 | InstructionBenchmark ToDisk; |
| 65 | |
Clement Courbet | d422d3a | 2019-10-09 11:29:21 +0000 | [diff] [blame] | 66 | ToDisk.Key.Instructions.push_back(MCInstBuilder(X86::XOR32rr) |
| 67 | .addReg(X86::AL) |
| 68 | .addReg(X86::AH) |
Guillaume Chatelet | 083a0c16 | 2018-06-07 07:40:40 +0000 | [diff] [blame] | 69 | .addImm(123) |
| 70 | .addFPImm(0.5)); |
Clement Courbet | a66bfaa4 | 2018-05-15 13:07:05 +0000 | [diff] [blame] | 71 | ToDisk.Key.Config = "config"; |
Guillaume Chatelet | 345fae5 | 2018-09-25 15:15:54 +0000 | [diff] [blame] | 72 | ToDisk.Key.RegisterInitialValues = { |
Clement Courbet | d422d3a | 2019-10-09 11:29:21 +0000 | [diff] [blame] | 73 | RegisterValue{X86::AL, APInt(8, "-1", 10)}, |
| 74 | RegisterValue{X86::AH, APInt(8, "123", 10)}}; |
Clement Courbet | 62b34fa | 2018-06-06 09:42:36 +0000 | [diff] [blame] | 75 | ToDisk.Mode = InstructionBenchmark::Latency; |
Clement Courbet | ac74acd | 2018-04-04 11:37:06 +0000 | [diff] [blame] | 76 | ToDisk.CpuName = "cpu_name"; |
| 77 | ToDisk.LLVMTriple = "llvm_triple"; |
| 78 | ToDisk.NumRepetitions = 1; |
Clement Courbet | 28d4f85 | 2018-09-26 13:35:10 +0000 | [diff] [blame] | 79 | ToDisk.Measurements.push_back(BenchmarkMeasure{"a", 1, 1}); |
| 80 | ToDisk.Measurements.push_back(BenchmarkMeasure{"b", 2, 2}); |
Clement Courbet | ac74acd | 2018-04-04 11:37:06 +0000 | [diff] [blame] | 81 | ToDisk.Error = "error"; |
Clement Courbet | a66bfaa4 | 2018-05-15 13:07:05 +0000 | [diff] [blame] | 82 | ToDisk.Info = "info"; |
Clement Courbet | ac74acd | 2018-04-04 11:37:06 +0000 | [diff] [blame] | 83 | |
Clement Courbet | d422d3a | 2019-10-09 11:29:21 +0000 | [diff] [blame] | 84 | SmallString<64> Filename; |
Clement Courbet | 308f8b7 | 2018-04-13 13:37:07 +0000 | [diff] [blame] | 85 | std::error_code EC; |
Clement Courbet | d422d3a | 2019-10-09 11:29:21 +0000 | [diff] [blame] | 86 | EC = sys::fs::createUniqueDirectory("BenchmarkResultTestDir", Filename); |
Clement Courbet | 308f8b7 | 2018-04-13 13:37:07 +0000 | [diff] [blame] | 87 | ASSERT_FALSE(EC); |
Clement Courbet | d422d3a | 2019-10-09 11:29:21 +0000 | [diff] [blame] | 88 | sys::path::append(Filename, "data.yaml"); |
| 89 | errs() << Filename << "-------\n"; |
Guillaume Chatelet | 55ad087 | 2018-09-25 12:18:08 +0000 | [diff] [blame] | 90 | ExitOnErr(ToDisk.writeYaml(State, Filename)); |
Clement Courbet | ac74acd | 2018-04-04 11:37:06 +0000 | [diff] [blame] | 91 | |
| 92 | { |
Clement Courbet | 7b7c27a | 2018-05-14 09:01:22 +0000 | [diff] [blame] | 93 | // One-element version. |
Guillaume Chatelet | 8c91d4c | 2018-06-07 07:51:16 +0000 | [diff] [blame] | 94 | const auto FromDisk = |
Guillaume Chatelet | 55ad087 | 2018-09-25 12:18:08 +0000 | [diff] [blame] | 95 | ExitOnErr(InstructionBenchmark::readYaml(State, Filename)); |
Clement Courbet | ac74acd | 2018-04-04 11:37:06 +0000 | [diff] [blame] | 96 | |
Clement Courbet | 53d35d2 | 2018-06-05 10:56:19 +0000 | [diff] [blame] | 97 | EXPECT_THAT(FromDisk.Key.Instructions, |
| 98 | Pointwise(EqMCInst(), ToDisk.Key.Instructions)); |
Clement Courbet | a66bfaa4 | 2018-05-15 13:07:05 +0000 | [diff] [blame] | 99 | EXPECT_EQ(FromDisk.Key.Config, ToDisk.Key.Config); |
Clement Courbet | 62b34fa | 2018-06-06 09:42:36 +0000 | [diff] [blame] | 100 | EXPECT_EQ(FromDisk.Mode, ToDisk.Mode); |
Clement Courbet | ac74acd | 2018-04-04 11:37:06 +0000 | [diff] [blame] | 101 | EXPECT_EQ(FromDisk.CpuName, ToDisk.CpuName); |
| 102 | EXPECT_EQ(FromDisk.LLVMTriple, ToDisk.LLVMTriple); |
| 103 | EXPECT_EQ(FromDisk.NumRepetitions, ToDisk.NumRepetitions); |
| 104 | EXPECT_THAT(FromDisk.Measurements, ToDisk.Measurements); |
| 105 | EXPECT_THAT(FromDisk.Error, ToDisk.Error); |
Clement Courbet | a66bfaa4 | 2018-05-15 13:07:05 +0000 | [diff] [blame] | 106 | EXPECT_EQ(FromDisk.Info, ToDisk.Info); |
Clement Courbet | ac74acd | 2018-04-04 11:37:06 +0000 | [diff] [blame] | 107 | } |
Clement Courbet | 7b7c27a | 2018-05-14 09:01:22 +0000 | [diff] [blame] | 108 | { |
| 109 | // Vector version. |
Clement Courbet | 53d35d2 | 2018-06-05 10:56:19 +0000 | [diff] [blame] | 110 | const auto FromDiskVector = |
Guillaume Chatelet | 55ad087 | 2018-09-25 12:18:08 +0000 | [diff] [blame] | 111 | ExitOnErr(InstructionBenchmark::readYamls(State, Filename)); |
Clement Courbet | 4c0fb1d | 2018-05-14 12:00:35 +0000 | [diff] [blame] | 112 | ASSERT_EQ(FromDiskVector.size(), size_t{1}); |
Clement Courbet | 7b7c27a | 2018-05-14 09:01:22 +0000 | [diff] [blame] | 113 | const auto FromDisk = FromDiskVector[0]; |
Clement Courbet | 53d35d2 | 2018-06-05 10:56:19 +0000 | [diff] [blame] | 114 | EXPECT_THAT(FromDisk.Key.Instructions, |
| 115 | Pointwise(EqMCInst(), ToDisk.Key.Instructions)); |
Clement Courbet | a66bfaa4 | 2018-05-15 13:07:05 +0000 | [diff] [blame] | 116 | EXPECT_EQ(FromDisk.Key.Config, ToDisk.Key.Config); |
Clement Courbet | 62b34fa | 2018-06-06 09:42:36 +0000 | [diff] [blame] | 117 | EXPECT_EQ(FromDisk.Mode, ToDisk.Mode); |
Clement Courbet | 7b7c27a | 2018-05-14 09:01:22 +0000 | [diff] [blame] | 118 | EXPECT_EQ(FromDisk.CpuName, ToDisk.CpuName); |
| 119 | EXPECT_EQ(FromDisk.LLVMTriple, ToDisk.LLVMTriple); |
| 120 | EXPECT_EQ(FromDisk.NumRepetitions, ToDisk.NumRepetitions); |
| 121 | EXPECT_THAT(FromDisk.Measurements, ToDisk.Measurements); |
| 122 | EXPECT_THAT(FromDisk.Error, ToDisk.Error); |
Clement Courbet | a66bfaa4 | 2018-05-15 13:07:05 +0000 | [diff] [blame] | 123 | EXPECT_EQ(FromDisk.Info, ToDisk.Info); |
Clement Courbet | 7b7c27a | 2018-05-14 09:01:22 +0000 | [diff] [blame] | 124 | } |
Clement Courbet | ac74acd | 2018-04-04 11:37:06 +0000 | [diff] [blame] | 125 | } |
| 126 | |
Clement Courbet | 684a5f6 | 2018-09-26 08:37:21 +0000 | [diff] [blame] | 127 | TEST(BenchmarkResultTest, PerInstructionStats) { |
| 128 | PerInstructionStats Stats; |
Clement Courbet | 28d4f85 | 2018-09-26 13:35:10 +0000 | [diff] [blame] | 129 | Stats.push(BenchmarkMeasure{"a", 0.5, 0.0}); |
| 130 | Stats.push(BenchmarkMeasure{"a", 1.5, 0.0}); |
| 131 | Stats.push(BenchmarkMeasure{"a", -1.0, 0.0}); |
| 132 | Stats.push(BenchmarkMeasure{"a", 0.0, 0.0}); |
Clement Courbet | ae8ae5dc | 2018-05-24 12:41:02 +0000 | [diff] [blame] | 133 | EXPECT_EQ(Stats.min(), -1.0); |
| 134 | EXPECT_EQ(Stats.max(), 1.5); |
| 135 | EXPECT_EQ(Stats.avg(), 0.25); // (0.5+1.5-1.0+0.0) / 4 |
| 136 | } |
Clement Courbet | ac74acd | 2018-04-04 11:37:06 +0000 | [diff] [blame] | 137 | } // namespace |
| 138 | } // namespace exegesis |
Fangrui Song | 32401af | 2018-10-22 17:10:47 +0000 | [diff] [blame] | 139 | } // namespace llvm |