From 9fd16a5a95705cd6bccc6e2537655862ae27e957 Mon Sep 17 00:00:00 2001 From: Amir Ayupov Date: Mon, 22 Apr 2024 19:22:55 -0700 Subject: [PATCH 1/2] [BOLT] Print program stats in perf2bolt/aggregate-only mode Produce the message with profiled functions in perf2bolt. Test Plan: updated pre-aggregated-perf.test --- bolt/lib/Profile/DataAggregator.cpp | 4 ++++ bolt/test/X86/pre-aggregated-perf.test | 9 ++++++++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/bolt/lib/Profile/DataAggregator.cpp b/bolt/lib/Profile/DataAggregator.cpp index 0b2a4e86561f3..2dbfa5d691850 100644 --- a/bolt/lib/Profile/DataAggregator.cpp +++ b/bolt/lib/Profile/DataAggregator.cpp @@ -14,6 +14,7 @@ #include "bolt/Profile/DataAggregator.h" #include "bolt/Core/BinaryContext.h" #include "bolt/Core/BinaryFunction.h" +#include "bolt/Passes/BinaryPasses.h" #include "bolt/Profile/BoltAddressTranslation.h" #include "bolt/Profile/Heatmap.h" #include "bolt/Profile/YAMLProfileWriter.h" @@ -85,6 +86,7 @@ MaxSamples("max-samples", cl::Hidden, cl::cat(AggregatorCategory)); +extern cl::opt NeverPrint; extern cl::opt ProfileFormat; extern cl::opt SaveProfile; @@ -611,6 +613,8 @@ Error DataAggregator::readProfile(BinaryContext &BC) { if (std::error_code EC = writeBATYAML(BC, opts::SaveProfile)) report_error("cannot create output data file", EC); } + PrintProgramStats PPS(opts::NeverPrint); + BC.logBOLTErrorsAndQuitOnFatal(PPS.runOnFunctions(BC)); } return Error::success(); diff --git a/bolt/test/X86/pre-aggregated-perf.test b/bolt/test/X86/pre-aggregated-perf.test index e8c3f64239a27..0bd44720f1b7a 100644 --- a/bolt/test/X86/pre-aggregated-perf.test +++ b/bolt/test/X86/pre-aggregated-perf.test @@ -11,7 +11,14 @@ REQUIRES: system-linux RUN: yaml2obj %p/Inputs/blarge.yaml &> %t.exe RUN: perf2bolt %t.exe -o %t --pa -p %p/Inputs/pre-aggregated.txt -w %t.new \ -RUN: --profile-use-dfs +RUN: --profile-use-dfs | FileCheck %s + +RUN: llvm-bolt %t.exe -data %t -o %t.null | FileCheck %s +RUN: llvm-bolt %t.exe -data %t.new -o %t.null | FileCheck %s +RUN: llvm-bolt %t.exe -p %p/Inputs/pre-aggregated.txt --pa -o %t.null | FileCheck %s + +CHECK: BOLT-INFO: 4 out of 7 functions in the binary (57.1%) have non-empty execution profile + RUN: cat %t | sort | FileCheck %s -check-prefix=PERF2BOLT RUN: cat %t.new | FileCheck %s -check-prefix=NEWFORMAT From fdb6a8e4f1734dbad2ac164da16169a33c0baf67 Mon Sep 17 00:00:00 2001 From: Amir Ayupov Date: Tue, 23 Apr 2024 07:18:16 -0700 Subject: [PATCH 2/2] [BOLT] Drop unused parameter from PrintProgramStats ctor --- bolt/include/bolt/Passes/BinaryPasses.h | 3 +-- bolt/lib/Profile/DataAggregator.cpp | 4 +--- bolt/lib/Rewrite/BinaryPassManager.cpp | 2 +- bolt/lib/Rewrite/BoltDiff.cpp | 2 +- 4 files changed, 4 insertions(+), 7 deletions(-) diff --git a/bolt/include/bolt/Passes/BinaryPasses.h b/bolt/include/bolt/Passes/BinaryPasses.h index 8d89ef8b5484f..5d7692559eda8 100644 --- a/bolt/include/bolt/Passes/BinaryPasses.h +++ b/bolt/include/bolt/Passes/BinaryPasses.h @@ -400,8 +400,7 @@ class PrintProfileStats : public BinaryFunctionPass { /// dyno stats categories. class PrintProgramStats : public BinaryFunctionPass { public: - explicit PrintProgramStats(const cl::opt &PrintPass) - : BinaryFunctionPass(PrintPass) {} + explicit PrintProgramStats() : BinaryFunctionPass(false) {} const char *getName() const override { return "print-stats"; } bool shouldPrint(const BinaryFunction &) const override { return false; } diff --git a/bolt/lib/Profile/DataAggregator.cpp b/bolt/lib/Profile/DataAggregator.cpp index 2dbfa5d691850..70e324cc0165b 100644 --- a/bolt/lib/Profile/DataAggregator.cpp +++ b/bolt/lib/Profile/DataAggregator.cpp @@ -86,7 +86,6 @@ MaxSamples("max-samples", cl::Hidden, cl::cat(AggregatorCategory)); -extern cl::opt NeverPrint; extern cl::opt ProfileFormat; extern cl::opt SaveProfile; @@ -613,8 +612,7 @@ Error DataAggregator::readProfile(BinaryContext &BC) { if (std::error_code EC = writeBATYAML(BC, opts::SaveProfile)) report_error("cannot create output data file", EC); } - PrintProgramStats PPS(opts::NeverPrint); - BC.logBOLTErrorsAndQuitOnFatal(PPS.runOnFunctions(BC)); + BC.logBOLTErrorsAndQuitOnFatal(PrintProgramStats().runOnFunctions(BC)); } return Error::success(); diff --git a/bolt/lib/Rewrite/BinaryPassManager.cpp b/bolt/lib/Rewrite/BinaryPassManager.cpp index be4888ccfa564..cbb7199a53ddd 100644 --- a/bolt/lib/Rewrite/BinaryPassManager.cpp +++ b/bolt/lib/Rewrite/BinaryPassManager.cpp @@ -356,7 +356,7 @@ Error BinaryFunctionPassManager::runAllPasses(BinaryContext &BC) { // order they're registered. // Run this pass first to use stats for the original functions. - Manager.registerPass(std::make_unique(NeverPrint)); + Manager.registerPass(std::make_unique()); if (opts::PrintProfileStats) Manager.registerPass(std::make_unique(NeverPrint)); diff --git a/bolt/lib/Rewrite/BoltDiff.cpp b/bolt/lib/Rewrite/BoltDiff.cpp index fa43b7a2f92c2..74b5ca18abce4 100644 --- a/bolt/lib/Rewrite/BoltDiff.cpp +++ b/bolt/lib/Rewrite/BoltDiff.cpp @@ -292,7 +292,7 @@ class RewriteInstanceDiff { } } } - PrintProgramStats PPS(opts::NeverPrint); + PrintProgramStats PPS; outs() << "* BOLT-DIFF: Starting print program stats pass for binary 1\n"; RI1.BC->logBOLTErrorsAndQuitOnFatal(PPS.runOnFunctions(*RI1.BC)); outs() << "* BOLT-DIFF: Starting print program stats pass for binary 2\n";