From: Clement Courbet Date: Thu, 17 May 2018 13:41:28 +0000 (+0000) Subject: [llvm-exegesis] Write out inconsistencies to a file. X-Git-Tag: llvmorg-7.0.0-rc1~5750 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=cf210746038b4b7a31b8dffb937611d6d9afc4df;p=platform%2Fupstream%2Fllvm.git [llvm-exegesis] Write out inconsistencies to a file. Reviewers: gchatelet Subscribers: tschuett, llvm-commits Differential Revision: https://reviews.llvm.org/D47013 llvm-svn: 332608 --- diff --git a/llvm/tools/llvm-exegesis/lib/Analysis.cpp b/llvm/tools/llvm-exegesis/lib/Analysis.cpp index 5b609257f59f..a02ea29e3d17 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(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( + 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(llvm::raw_ostream &OS) const; +template llvm::Error Analysis::run( + 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 dcfaf3469dda..d8046e54a705 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 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 23453747e6db..90b2ebb18cce 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 llvm::cl::desc("dbscan epsilon for analysis clustering"), llvm::cl::init(0.1)); -static llvm::cl::opt AnalysisClustersFile("analysis-clusters-file", - llvm::cl::desc(""), - llvm::cl::init("-")); +static llvm::cl::opt + AnalysisClustersOutputFile("analysis-clusters-output-file", + llvm::cl::desc(""), llvm::cl::init("-")); +static llvm::cl::opt + 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 +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(ClustersOS)) + llvm::report_fatal_error(std::move(Err)); +} + +static void analysisMain() { // Read benchmarks. const std::vector 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(Analyzer, "analysis clusters", + AnalysisClustersOutputFile); + maybeRunAnalysis( + Analyzer, "sched class consistency analysis", + AnalysisInconsistenciesOutputFile); } } // namespace exegesis