diff options
author | Clement Courbet <courbet@google.com> | 2018-05-15 13:07:05 +0000 |
---|---|---|
committer | Clement Courbet <courbet@google.com> | 2018-05-15 13:07:05 +0000 |
commit | a66bfaa4c037ce4e64d24549a566ec5d29110577 (patch) | |
tree | 7feca562f099977213549d142ef968f2a1f581bc /llvm | |
parent | 2aa395abcf4ef11b508b99ed5c9dc48c5278780d (diff) | |
download | bcm5719-llvm-a66bfaa4c037ce4e64d24549a566ec5d29110577.tar.gz bcm5719-llvm-a66bfaa4c037ce4e64d24549a566ec5d29110577.zip |
[llvm-exegesis] Split AsmTemplate.Name into components.
Summary:
AsmTemplate becomes IntructionBenchmarkKey, which has three components.
This allows retreiving the opcode for analysis.
Reviewers: gchatelet
Subscribers: tschuett, llvm-commits
Differential Revision: https://reviews.llvm.org/D46873
llvm-svn: 332348
Diffstat (limited to 'llvm')
-rw-r--r-- | llvm/tools/llvm-exegesis/lib/Analysis.cpp | 22 | ||||
-rw-r--r-- | llvm/tools/llvm-exegesis/lib/BenchmarkResult.cpp | 11 | ||||
-rw-r--r-- | llvm/tools/llvm-exegesis/lib/BenchmarkResult.h | 13 | ||||
-rw-r--r-- | llvm/tools/llvm-exegesis/lib/BenchmarkRunner.cpp | 7 | ||||
-rw-r--r-- | llvm/unittests/tools/llvm-exegesis/BenchmarkResultTest.cpp | 15 |
5 files changed, 44 insertions, 24 deletions
diff --git a/llvm/tools/llvm-exegesis/lib/Analysis.cpp b/llvm/tools/llvm-exegesis/lib/Analysis.cpp index d6b39027445..acc30ab7912 100644 --- a/llvm/tools/llvm-exegesis/lib/Analysis.cpp +++ b/llvm/tools/llvm-exegesis/lib/Analysis.cpp @@ -7,8 +7,8 @@ // //===----------------------------------------------------------------------===// -#include "BenchmarkResult.h" #include "Analysis.h" +#include "BenchmarkResult.h" #include "llvm/Support/FormatVariadic.h" #include <vector> @@ -16,7 +16,7 @@ namespace exegesis { static const char kCsvSep = ','; -static void writeCsvEscaped(llvm::raw_ostream& OS, const std::string& S) { +static void writeCsvEscaped(llvm::raw_ostream &OS, const std::string &S) { if (std::find(S.begin(), S.end(), kCsvSep) == S.end()) { OS << S; } else { @@ -35,10 +35,12 @@ static void writeCsvEscaped(llvm::raw_ostream& OS, const std::string& S) { // Prints a row representing an instruction, along with scheduling info and // point coordinates (measurements). static void printInstructionRow(const InstructionBenchmark &Point, - const llvm::MCSubtargetInfo &STI, - const size_t ClusterId, llvm::raw_ostream &OS) { + const llvm::MCSubtargetInfo &STI, + const size_t ClusterId, llvm::raw_ostream &OS) { OS << ClusterId << kCsvSep; - writeCsvEscaped(OS, Point.AsmTmpl.Name); + writeCsvEscaped(OS, Point.Key.OpcodeName); + OS << kCsvSep; + writeCsvEscaped(OS, Point.Key.Config); // FIXME: Print the sched class once InstructionBenchmark separates key into // (mnemonic, mode, opaque). for (const auto &Measurement : Point.Measurements) { @@ -49,9 +51,10 @@ static void printInstructionRow(const InstructionBenchmark &Point, } static void printCluster(const std::vector<InstructionBenchmark> &Points, - const llvm::MCSubtargetInfo &STI, const size_t ClusterId, - const InstructionBenchmarkClustering::Cluster &Cluster, - llvm::raw_ostream &OS) { + const llvm::MCSubtargetInfo &STI, + const size_t ClusterId, + const InstructionBenchmarkClustering::Cluster &Cluster, + llvm::raw_ostream &OS) { // Print all points. for (const auto &PointId : Cluster.PointIndices) { printInstructionRow(Points[PointId], STI, ClusterId, OS); @@ -65,7 +68,8 @@ printAnalysisClusters(const InstructionBenchmarkClustering &Clustering, return llvm::Error::success(); // Write the header. - OS << "cluster_id;key,sched_class"; + OS << "cluster_id" << kCsvSep << "opcode_name" << kCsvSep << "config" + << kCsvSep << "sched_class"; for (const auto &Measurement : Clustering.getPoints().front().Measurements) { OS << kCsvSep; writeCsvEscaped(OS, Measurement.Key); diff --git a/llvm/tools/llvm-exegesis/lib/BenchmarkResult.cpp b/llvm/tools/llvm-exegesis/lib/BenchmarkResult.cpp index dcc798d71c0..a043ea40c27 100644 --- a/llvm/tools/llvm-exegesis/lib/BenchmarkResult.cpp +++ b/llvm/tools/llvm-exegesis/lib/BenchmarkResult.cpp @@ -34,20 +34,23 @@ template <> struct MappingTraits<exegesis::BenchmarkMeasure> { static const bool flow = true; }; -template <> struct MappingTraits<exegesis::AsmTemplate> { - static void mapping(IO &Io, exegesis::AsmTemplate &Obj) { - Io.mapRequired("name", Obj.Name); +template <> struct MappingTraits<exegesis::InstructionBenchmarkKey> { + static void mapping(IO &Io, exegesis::InstructionBenchmarkKey &Obj) { + Io.mapRequired("opcode_name", Obj.OpcodeName); + 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("asm_template", Obj.AsmTmpl); + Io.mapRequired("key", Obj.Key); Io.mapRequired("cpu_name", Obj.CpuName); Io.mapRequired("llvm_triple", Obj.LLVMTriple); Io.mapRequired("num_repetitions", Obj.NumRepetitions); Io.mapRequired("measurements", Obj.Measurements); Io.mapRequired("error", Obj.Error); + Io.mapOptional("info", Obj.Info); } }; diff --git a/llvm/tools/llvm-exegesis/lib/BenchmarkResult.h b/llvm/tools/llvm-exegesis/lib/BenchmarkResult.h index d6b93f4703a..cf9bcece99a 100644 --- a/llvm/tools/llvm-exegesis/lib/BenchmarkResult.h +++ b/llvm/tools/llvm-exegesis/lib/BenchmarkResult.h @@ -23,8 +23,14 @@ namespace exegesis { -struct AsmTemplate { - std::string Name; +struct InstructionBenchmarkKey { + // The LLVM opcode name. + std::string OpcodeName; + // The benchmark mode. + std::string Mode; + // An opaque configuration, that can be used to separate several benchmarks of + // the same instruction under different configurations. + std::string Config; }; struct BenchmarkMeasure { @@ -35,12 +41,13 @@ struct BenchmarkMeasure { // The result of an instruction benchmark. struct InstructionBenchmark { - AsmTemplate AsmTmpl; + InstructionBenchmarkKey Key; std::string CpuName; std::string LLVMTriple; int NumRepetitions = 0; std::vector<BenchmarkMeasure> Measurements; std::string Error; + std::string Info; static InstructionBenchmark readYamlOrDie(llvm::StringRef Filename); static std::vector<InstructionBenchmark> readYamlsOrDie(llvm::StringRef Filename); diff --git a/llvm/tools/llvm-exegesis/lib/BenchmarkRunner.cpp b/llvm/tools/llvm-exegesis/lib/BenchmarkRunner.cpp index bdce72c1c11..2615a829902 100644 --- a/llvm/tools/llvm-exegesis/lib/BenchmarkRunner.cpp +++ b/llvm/tools/llvm-exegesis/lib/BenchmarkRunner.cpp @@ -26,11 +26,8 @@ BenchmarkRunner::run(const LLVMState &State, const unsigned Opcode, const InstructionFilter &Filter) const { InstructionBenchmark InstrBenchmark; - InstrBenchmark.AsmTmpl.Name = - llvm::Twine(getDisplayName()) - .concat(" ") - .concat(State.getInstrInfo().getName(Opcode)) - .str(); + InstrBenchmark.Key.OpcodeName = State.getInstrInfo().getName(Opcode); + InstrBenchmark.Key.Mode = getDisplayName(); InstrBenchmark.CpuName = State.getCpuName(); InstrBenchmark.LLVMTriple = State.getTriple(); InstrBenchmark.NumRepetitions = NumRepetitions; diff --git a/llvm/unittests/tools/llvm-exegesis/BenchmarkResultTest.cpp b/llvm/unittests/tools/llvm-exegesis/BenchmarkResultTest.cpp index 52bc0e94357..9e00510c7c0 100644 --- a/llvm/unittests/tools/llvm-exegesis/BenchmarkResultTest.cpp +++ b/llvm/unittests/tools/llvm-exegesis/BenchmarkResultTest.cpp @@ -27,13 +27,16 @@ namespace { TEST(BenchmarkResultTest, WriteToAndReadFromDisk) { InstructionBenchmark ToDisk; - ToDisk.AsmTmpl.Name = "name"; + ToDisk.Key.OpcodeName = "name"; + ToDisk.Key.Mode = "mode"; + ToDisk.Key.Config = "config"; ToDisk.CpuName = "cpu_name"; ToDisk.LLVMTriple = "llvm_triple"; ToDisk.NumRepetitions = 1; ToDisk.Measurements.push_back(BenchmarkMeasure{"a", 1, "debug a"}); ToDisk.Measurements.push_back(BenchmarkMeasure{"b", 2, ""}); ToDisk.Error = "error"; + ToDisk.Info = "info"; llvm::SmallString<64> Filename; std::error_code EC; @@ -47,24 +50,30 @@ TEST(BenchmarkResultTest, WriteToAndReadFromDisk) { // One-element version. const auto FromDisk = InstructionBenchmark::readYamlOrDie(Filename); - EXPECT_EQ(FromDisk.AsmTmpl.Name, ToDisk.AsmTmpl.Name); + EXPECT_EQ(FromDisk.Key.OpcodeName, ToDisk.Key.OpcodeName); + EXPECT_EQ(FromDisk.Key.Mode, ToDisk.Key.Mode); + EXPECT_EQ(FromDisk.Key.Config, ToDisk.Key.Config); EXPECT_EQ(FromDisk.CpuName, ToDisk.CpuName); EXPECT_EQ(FromDisk.LLVMTriple, ToDisk.LLVMTriple); EXPECT_EQ(FromDisk.NumRepetitions, ToDisk.NumRepetitions); EXPECT_THAT(FromDisk.Measurements, ToDisk.Measurements); EXPECT_THAT(FromDisk.Error, ToDisk.Error); + EXPECT_EQ(FromDisk.Info, ToDisk.Info); } { // Vector version. const auto FromDiskVector = InstructionBenchmark::readYamlsOrDie(Filename); ASSERT_EQ(FromDiskVector.size(), size_t{1}); const auto FromDisk = FromDiskVector[0]; - EXPECT_EQ(FromDisk.AsmTmpl.Name, ToDisk.AsmTmpl.Name); + EXPECT_EQ(FromDisk.Key.OpcodeName, ToDisk.Key.OpcodeName); + EXPECT_EQ(FromDisk.Key.Mode, ToDisk.Key.Mode); + EXPECT_EQ(FromDisk.Key.Config, ToDisk.Key.Config); EXPECT_EQ(FromDisk.CpuName, ToDisk.CpuName); EXPECT_EQ(FromDisk.LLVMTriple, ToDisk.LLVMTriple); EXPECT_EQ(FromDisk.NumRepetitions, ToDisk.NumRepetitions); EXPECT_THAT(FromDisk.Measurements, ToDisk.Measurements); EXPECT_THAT(FromDisk.Error, ToDisk.Error); + EXPECT_EQ(FromDisk.Info, ToDisk.Info); } } |