[llvm-exegesis] move Mode from Key to BenchmarResult.
authorClement Courbet <courbet@google.com>
Wed, 6 Jun 2018 09:42:36 +0000 (09:42 +0000)
committerClement Courbet <courbet@google.com>
Wed, 6 Jun 2018 09:42:36 +0000 (09:42 +0000)
Moves the Mode field out of the Key. The existing yaml benchmark results can be fixed with the following script:

```
readonly FILE=$1
readonly MODE=latency # Change to uops to fix a uops benchmark.
cat $FILE | \
  sed "/^\ \+mode:\ \+$MODE$/d" | \
  sed "/^cpu_name.*$/i mode:            $MODE"
```

Differential Revision: https://reviews.llvm.org/D47813

Authored by: Guillaume Chatelet

llvm-svn: 334079

llvm/tools/llvm-exegesis/lib/Analysis.cpp
llvm/tools/llvm-exegesis/lib/BenchmarkResult.cpp
llvm/tools/llvm-exegesis/lib/BenchmarkResult.h
llvm/tools/llvm-exegesis/lib/BenchmarkRunner.cpp
llvm/tools/llvm-exegesis/lib/BenchmarkRunner.h
llvm/tools/llvm-exegesis/lib/Latency.cpp
llvm/tools/llvm-exegesis/lib/Latency.h
llvm/tools/llvm-exegesis/lib/Uops.cpp
llvm/tools/llvm-exegesis/lib/Uops.h
llvm/unittests/tools/llvm-exegesis/BenchmarkResultTest.cpp

index bf13272..df353dc 100644 (file)
@@ -319,9 +319,8 @@ bool Analysis::SchedClassCluster::measurementsMatch(
   std::vector<BenchmarkMeasure> SchedClassPoint(NumMeasurements);
   // Latency case.
   assert(!Clustering.getPoints().empty());
-  const InstructionBenchmarkKey::ModeE Mode =
-      Clustering.getPoints()[0].Key.Mode;
-  if (Mode == InstructionBenchmarkKey::Latency) {
+  const InstructionBenchmark::ModeE Mode = Clustering.getPoints()[0].Mode;
+  if (Mode == InstructionBenchmark::Latency) {
     if (NumMeasurements != 1) {
       llvm::errs()
           << "invalid number of measurements in latency mode: expected 1, got "
@@ -337,7 +336,7 @@ bool Analysis::SchedClassCluster::measurementsMatch(
           std::max<double>(SchedClassPoint[0].Value, WLE->Cycles);
     }
     ClusterCenterPoint[0].Value = Representative[0].avg();
-  } else if (Mode == InstructionBenchmarkKey::Uops) {
+  } else if (Mode == InstructionBenchmark::Uops) {
     for (int I = 0, E = Representative.size(); I < E; ++I) {
       // Find the pressure on ProcResIdx `Key`.
       uint16_t ProcResIdx = 0;
index 441aee0..87b25b4 100644 (file)
@@ -68,12 +68,12 @@ template <> struct MappingTraits<exegesis::BenchmarkMeasure> {
 };
 
 template <>
-struct ScalarEnumerationTraits<exegesis::InstructionBenchmarkKey::ModeE> {
+struct ScalarEnumerationTraits<exegesis::InstructionBenchmark::ModeE> {
   static void enumeration(IO &Io,
-                          exegesis::InstructionBenchmarkKey::ModeE &Value) {
-    Io.enumCase(Value, "", exegesis::InstructionBenchmarkKey::Unknown);
-    Io.enumCase(Value, "latency", exegesis::InstructionBenchmarkKey::Latency);
-    Io.enumCase(Value, "uops", exegesis::InstructionBenchmarkKey::Uops);
+                          exegesis::InstructionBenchmark::ModeE &Value) {
+    Io.enumCase(Value, "", exegesis::InstructionBenchmark::Unknown);
+    Io.enumCase(Value, "latency", exegesis::InstructionBenchmark::Latency);
+    Io.enumCase(Value, "uops", exegesis::InstructionBenchmark::Uops);
   }
 };
 
@@ -81,13 +81,13 @@ template <> struct MappingTraits<exegesis::InstructionBenchmarkKey> {
   static void mapping(IO &Io, exegesis::InstructionBenchmarkKey &Obj) {
     Io.mapRequired("opcode_name", Obj.OpcodeName);
     Io.mapOptional("instructions", Obj.Instructions);
-    Io.mapRequired("mode", Obj.Mode);
     Io.mapOptional("config", Obj.Config);
   }
 };
 
 template <> struct MappingTraits<exegesis::InstructionBenchmark> {
   static void mapping(IO &Io, exegesis::InstructionBenchmark &Obj) {
+    Io.mapRequired("mode", Obj.Mode);
     Io.mapRequired("key", Obj.Key);
     Io.mapRequired("cpu_name", Obj.CpuName);
     Io.mapRequired("llvm_triple", Obj.LLVMTriple);
index 9b87482..421e210 100644 (file)
@@ -34,8 +34,6 @@ struct InstructionBenchmarkKey {
   // The LLVM opcode name.
   std::string OpcodeName; // FIXME: Deprecated, use Instructions below.
   std::vector<llvm::MCInst> Instructions;
-  enum ModeE { Unknown, Latency, Uops };
-  ModeE Mode;
   // An opaque configuration, that can be used to separate several benchmarks of
   // the same instruction under different configurations.
   std::string Config;
@@ -50,6 +48,8 @@ struct BenchmarkMeasure {
 // The result of an instruction benchmark.
 struct InstructionBenchmark {
   InstructionBenchmarkKey Key;
+  enum ModeE { Unknown, Latency, Uops };
+  ModeE Mode;
   std::string CpuName;
   std::string LLVMTriple;
   int NumRepetitions = 0;
index 75b2a1d..0599c8e 100644 (file)
@@ -37,7 +37,7 @@ InstructionBenchmark BenchmarkRunner::run(unsigned Opcode,
   InstructionBenchmark InstrBenchmark;
 
   InstrBenchmark.Key.OpcodeName = State.getInstrInfo().getName(Opcode);
-  InstrBenchmark.Key.Mode = getMode();
+  InstrBenchmark.Mode = getMode();
   InstrBenchmark.CpuName = State.getCpuName();
   InstrBenchmark.LLVMTriple = State.getTriple();
   InstrBenchmark.NumRepetitions = NumRepetitions;
index 1382951..5dfd05e 100644 (file)
@@ -54,7 +54,7 @@ protected:
   const llvm::MCRegisterInfo &MCRegisterInfo;
 
 private:
-  virtual InstructionBenchmarkKey::ModeE getMode() const = 0;
+  virtual InstructionBenchmark::ModeE getMode() const = 0;
 
   virtual llvm::Expected<std::vector<llvm::MCInst>>
   createSnippet(RegisterAliasingTrackerCache &RATC, unsigned Opcode,
index 633189e..9c4ed56 100644 (file)
@@ -52,8 +52,8 @@ static llvm::Error makeError(llvm::Twine Msg) {
 
 LatencyBenchmarkRunner::~LatencyBenchmarkRunner() = default;
 
-InstructionBenchmarkKey::ModeE LatencyBenchmarkRunner::getMode() const {
-  return InstructionBenchmarkKey::Latency;
+InstructionBenchmark::ModeE LatencyBenchmarkRunner::getMode() const {
+  return InstructionBenchmark::Latency;
 }
 
 llvm::Expected<std::vector<llvm::MCInst>>
index 9dd0039..1e6150e 100644 (file)
@@ -25,7 +25,7 @@ public:
   ~LatencyBenchmarkRunner() override;
 
 private:
-  InstructionBenchmarkKey::ModeE getMode() const override;
+  InstructionBenchmark::ModeE getMode() const override;
 
   llvm::Expected<std::vector<llvm::MCInst>>
   createSnippet(RegisterAliasingTrackerCache &RATC, unsigned OpcodeIndex,
index 145bfad..b90ab1a 100644 (file)
@@ -141,8 +141,8 @@ static llvm::Error makeError(llvm::Twine Msg) {
 
 UopsBenchmarkRunner::~UopsBenchmarkRunner() = default;
 
-InstructionBenchmarkKey::ModeE UopsBenchmarkRunner::getMode() const {
-  return InstructionBenchmarkKey::Uops;
+InstructionBenchmark::ModeE UopsBenchmarkRunner::getMode() const {
+  return InstructionBenchmark::Uops;
 }
 
 llvm::Expected<std::vector<llvm::MCInst>>
index 4fe7cb4..a58fa1c 100644 (file)
@@ -25,7 +25,7 @@ public:
   ~UopsBenchmarkRunner() override;
 
 private:
-  InstructionBenchmarkKey::ModeE getMode() const override;
+  InstructionBenchmark::ModeE getMode() const override;
 
   llvm::Expected<std::vector<llvm::MCInst>>
   createSnippet(RegisterAliasingTrackerCache &RATC, unsigned Opcode,
index 2c12c82..181b5af 100644 (file)
@@ -45,8 +45,8 @@ TEST(BenchmarkResultTest, WriteToAndReadFromDisk) {
 
   ToDisk.Key.OpcodeName = "name";
   ToDisk.Key.Instructions.push_back(llvm::MCInstBuilder(kInstrId));
-  ToDisk.Key.Mode = InstructionBenchmarkKey::Latency;
   ToDisk.Key.Config = "config";
+  ToDisk.Mode = InstructionBenchmark::Latency;
   ToDisk.CpuName = "cpu_name";
   ToDisk.LLVMTriple = "llvm_triple";
   ToDisk.NumRepetitions = 1;
@@ -69,8 +69,8 @@ TEST(BenchmarkResultTest, WriteToAndReadFromDisk) {
     EXPECT_EQ(FromDisk.Key.OpcodeName, ToDisk.Key.OpcodeName);
     EXPECT_THAT(FromDisk.Key.Instructions,
                 Pointwise(EqMCInst(), ToDisk.Key.Instructions));
-    EXPECT_EQ(FromDisk.Key.Mode, ToDisk.Key.Mode);
     EXPECT_EQ(FromDisk.Key.Config, ToDisk.Key.Config);
+    EXPECT_EQ(FromDisk.Mode, ToDisk.Mode);
     EXPECT_EQ(FromDisk.CpuName, ToDisk.CpuName);
     EXPECT_EQ(FromDisk.LLVMTriple, ToDisk.LLVMTriple);
     EXPECT_EQ(FromDisk.NumRepetitions, ToDisk.NumRepetitions);
@@ -87,8 +87,8 @@ TEST(BenchmarkResultTest, WriteToAndReadFromDisk) {
     EXPECT_EQ(FromDisk.Key.OpcodeName, ToDisk.Key.OpcodeName);
     EXPECT_THAT(FromDisk.Key.Instructions,
                 Pointwise(EqMCInst(), ToDisk.Key.Instructions));
-    EXPECT_EQ(FromDisk.Key.Mode, ToDisk.Key.Mode);
     EXPECT_EQ(FromDisk.Key.Config, ToDisk.Key.Config);
+    EXPECT_EQ(FromDisk.Mode, ToDisk.Mode);
     EXPECT_EQ(FromDisk.CpuName, ToDisk.CpuName);
     EXPECT_EQ(FromDisk.LLVMTriple, ToDisk.LLVMTriple);
     EXPECT_EQ(FromDisk.NumRepetitions, ToDisk.NumRepetitions);