diff options
-rw-r--r-- | llvm/tools/llvm-exegesis/lib/Analysis.cpp | 14 | ||||
-rw-r--r-- | llvm/tools/llvm-exegesis/lib/Analysis.h | 7 | ||||
-rw-r--r-- | llvm/tools/llvm-exegesis/llvm-exegesis.cpp | 47 |
3 files changed, 47 insertions, 21 deletions
diff --git a/llvm/tools/llvm-exegesis/lib/Analysis.cpp b/llvm/tools/llvm-exegesis/lib/Analysis.cpp index 5b609257f59..a02ea29e3d1 100644 --- a/llvm/tools/llvm-exegesis/lib/Analysis.cpp +++ b/llvm/tools/llvm-exegesis/lib/Analysis.cpp @@ -91,7 +91,9 @@ Analysis::Analysis(const llvm::Target &Target, MnemonicToOpcode_.emplace(InstrInfo_->getName(I), I); } -llvm::Error Analysis::printClusters(llvm::raw_ostream &OS) const { +template <> +llvm::Error +Analysis::run<Analysis::PrintClusters>(llvm::raw_ostream &OS) const { if (Clustering_.getPoints().empty()) return llvm::Error::success(); @@ -133,8 +135,9 @@ Analysis::makePointsPerSchedClass() const { return PointsPerSchedClass; } -llvm::Error -Analysis::printSchedClassInconsistencies(llvm::raw_ostream &OS) const { +template <> +llvm::Error Analysis::run<Analysis::PrintSchedClassInconsistencies>( + llvm::raw_ostream &OS) const { // All the points in a scheduling class should be in the same cluster. // Print any scheduling class for which this is not the case. for (const auto &SchedClassAndPoints : makePointsPerSchedClass()) { @@ -167,4 +170,9 @@ Analysis::printSchedClassInconsistencies(llvm::raw_ostream &OS) const { return llvm::Error::success(); } +template llvm::Error +Analysis::run<Analysis::PrintClusters>(llvm::raw_ostream &OS) const; +template llvm::Error Analysis::run<Analysis::PrintSchedClassInconsistencies>( + llvm::raw_ostream &OS) const; + } // namespace exegesis diff --git a/llvm/tools/llvm-exegesis/lib/Analysis.h b/llvm/tools/llvm-exegesis/lib/Analysis.h index dcfaf3469dd..d8046e54a70 100644 --- a/llvm/tools/llvm-exegesis/lib/Analysis.h +++ b/llvm/tools/llvm-exegesis/lib/Analysis.h @@ -33,10 +33,11 @@ public: const InstructionBenchmarkClustering &Clustering); // Prints a csv of instructions for each cluster. - llvm::Error printClusters(llvm::raw_ostream &OS) const; - + struct PrintClusters {}; // Find potential errors in the scheduling information given measurements. - llvm::Error printSchedClassInconsistencies(llvm::raw_ostream &OS) const; + struct PrintSchedClassInconsistencies {}; + + template <typename Pass> llvm::Error run(llvm::raw_ostream &OS) const; private: void printInstructionRow(bool PrintSchedClass, size_t PointId, diff --git a/llvm/tools/llvm-exegesis/llvm-exegesis.cpp b/llvm/tools/llvm-exegesis/llvm-exegesis.cpp index 23453747e6d..90b2ebb18cc 100644 --- a/llvm/tools/llvm-exegesis/llvm-exegesis.cpp +++ b/llvm/tools/llvm-exegesis/llvm-exegesis.cpp @@ -70,9 +70,12 @@ static llvm::cl::opt<float> llvm::cl::desc("dbscan epsilon for analysis clustering"), llvm::cl::init(0.1)); -static llvm::cl::opt<std::string> AnalysisClustersFile("analysis-clusters-file", - llvm::cl::desc(""), - llvm::cl::init("-")); +static llvm::cl::opt<std::string> + AnalysisClustersOutputFile("analysis-clusters-output-file", + llvm::cl::desc(""), llvm::cl::init("-")); +static llvm::cl::opt<std::string> + AnalysisInconsistenciesOutputFile("analysis-inconsistencies-output-file", + llvm::cl::desc(""), llvm::cl::init("-")); namespace exegesis { @@ -125,7 +128,27 @@ void benchmarkMain() { exegesis::pfm::pfmTerminate(); } -void analysisMain() { +// Prints the results of running analysis pass `Pass` to file `OutputFilename` +// if OutputFilename is non-empty. +template <typename Pass> +static void maybeRunAnalysis(const Analysis &Analyzer, const std::string &Name, + const std::string &OutputFilename) { + if (OutputFilename.empty()) + return; + if (OutputFilename != "-") { + llvm::errs() << "Printing " << Name << " results to file '" + << OutputFilename << "'\n"; + } + std::error_code ErrorCode; + llvm::raw_fd_ostream ClustersOS(OutputFilename, ErrorCode, + llvm::sys::fs::F_RW); + if (ErrorCode) + llvm::report_fatal_error("cannot open out file: " + OutputFilename); + if (auto Err = Analyzer.run<Pass>(ClustersOS)) + llvm::report_fatal_error(std::move(Err)); +} + +static void analysisMain() { // Read benchmarks. const std::vector<InstructionBenchmark> Points = InstructionBenchmark::readYamlsOrDie(BenchmarkFile); @@ -152,17 +175,11 @@ void analysisMain() { const Analysis Analyzer(*TheTarget, Clustering); - std::error_code ErrorCode; - llvm::raw_fd_ostream ClustersOS(AnalysisClustersFile, ErrorCode, - llvm::sys::fs::F_RW); - if (ErrorCode) - llvm::report_fatal_error("cannot open out file: " + AnalysisClustersFile); - - if (auto Err = Analyzer.printClusters(ClustersOS)) - llvm::report_fatal_error(std::move(Err)); - - if (auto Err = Analyzer.printSchedClassInconsistencies(llvm::outs())) - llvm::report_fatal_error(std::move(Err)); + maybeRunAnalysis<Analysis::PrintClusters>(Analyzer, "analysis clusters", + AnalysisClustersOutputFile); + maybeRunAnalysis<Analysis::PrintSchedClassInconsistencies>( + Analyzer, "sched class consistency analysis", + AnalysisInconsistenciesOutputFile); } } // namespace exegesis |