-
Notifications
You must be signed in to change notification settings - Fork 14.3k
[BOLT] Set InitialDynoStats after EstimateEdgeCounts #93218
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
InitialDynoStats used to be assigned inside `runAllPasses`, but the assignment executed before any of the passes. As we've moved `EstimateEdgeCounts` into a pass out of ProfileReader, it needs to execute before initial dyno stats are set. Thus move `InitialDynoStats` into BinaryContext and assignment into `DynoStatsSetPass`.
@llvm/pr-subscribers-bolt Author: Amir Ayupov (aaupov) ChangesInitialDynoStats used to be assigned inside Thus move Full diff: https://github.com/llvm/llvm-project/pull/93218.diff 4 Files Affected:
diff --git a/bolt/include/bolt/Core/BinaryContext.h b/bolt/include/bolt/Core/BinaryContext.h
index 633d83a4368cb..a3f1e6ca08053 100644
--- a/bolt/include/bolt/Core/BinaryContext.h
+++ b/bolt/include/bolt/Core/BinaryContext.h
@@ -17,6 +17,7 @@
#include "bolt/Core/BinaryData.h"
#include "bolt/Core/BinarySection.h"
#include "bolt/Core/DebugData.h"
+#include "bolt/Core/DynoStats.h"
#include "bolt/Core/JumpTable.h"
#include "bolt/Core/MCPlusBuilder.h"
#include "bolt/RuntimeLibs/RuntimeLibrary.h"
@@ -717,6 +718,9 @@ class BinaryContext {
uint64_t NumStaleBlocksWithEqualIcount{0};
} Stats;
+ // Original binary execution count stats.
+ DynoStats InitialDynoStats;
+
// Address of the first allocated segment.
uint64_t FirstAllocAddress{std::numeric_limits<uint64_t>::max()};
diff --git a/bolt/include/bolt/Passes/BinaryPasses.h b/bolt/include/bolt/Passes/BinaryPasses.h
index a07c9130041fd..ad8473c4aae02 100644
--- a/bolt/include/bolt/Passes/BinaryPasses.h
+++ b/bolt/include/bolt/Passes/BinaryPasses.h
@@ -53,15 +53,31 @@ class BinaryFunctionPass {
virtual Error runOnFunctions(BinaryContext &BC) = 0;
};
+/// A pass to set initial program-wide dynostats.
+class DynoStatsSetPass : public BinaryFunctionPass {
+public:
+ DynoStatsSetPass() : BinaryFunctionPass(false) {}
+
+ const char *getName() const override {
+ return "set dyno-stats before optimizations";
+ }
+
+ bool shouldPrint(const BinaryFunction &BF) const override { return false; }
+
+ Error runOnFunctions(BinaryContext &BC) override {
+ BC.InitialDynoStats = getDynoStats(BC.getBinaryFunctions(), BC.isAArch64());
+ return Error::success();
+ }
+};
+
/// A pass to print program-wide dynostats.
class DynoStatsPrintPass : public BinaryFunctionPass {
protected:
- DynoStats PrevDynoStats;
std::string Title;
public:
- DynoStatsPrintPass(const DynoStats &PrevDynoStats, const char *Title)
- : BinaryFunctionPass(false), PrevDynoStats(PrevDynoStats), Title(Title) {}
+ DynoStatsPrintPass(const char *Title)
+ : BinaryFunctionPass(false), Title(Title) {}
const char *getName() const override {
return "print dyno-stats after optimizations";
@@ -70,6 +86,7 @@ class DynoStatsPrintPass : public BinaryFunctionPass {
bool shouldPrint(const BinaryFunction &BF) const override { return false; }
Error runOnFunctions(BinaryContext &BC) override {
+ const DynoStats PrevDynoStats = BC.InitialDynoStats;
const DynoStats NewDynoStats =
getDynoStats(BC.getBinaryFunctions(), BC.isAArch64());
const bool Changed = (NewDynoStats != PrevDynoStats);
diff --git a/bolt/lib/Core/BinaryContext.cpp b/bolt/lib/Core/BinaryContext.cpp
index 876934b4ddf10..c18f188fa77cf 100644
--- a/bolt/lib/Core/BinaryContext.cpp
+++ b/bolt/lib/Core/BinaryContext.cpp
@@ -142,7 +142,7 @@ BinaryContext::BinaryContext(std::unique_ptr<MCContext> Ctx,
AsmInfo(std::move(AsmInfo)), MII(std::move(MII)), STI(std::move(STI)),
InstPrinter(std::move(InstPrinter)), MIA(std::move(MIA)),
MIB(std::move(MIB)), MRI(std::move(MRI)), DisAsm(std::move(DisAsm)),
- Logger(Logger) {
+ Logger(Logger), InitialDynoStats(isAArch64()) {
Relocation::Arch = this->TheTriple->getArch();
RegularPageSize = isAArch64() ? RegularPageSizeAArch64 : RegularPageSizeX86;
PageAlign = opts::NoHugePages ? RegularPageSize : HugePageSize;
diff --git a/bolt/lib/Rewrite/BinaryPassManager.cpp b/bolt/lib/Rewrite/BinaryPassManager.cpp
index 0712330a524b0..aaa0e1ff4d46f 100644
--- a/bolt/lib/Rewrite/BinaryPassManager.cpp
+++ b/bolt/lib/Rewrite/BinaryPassManager.cpp
@@ -343,8 +343,7 @@ Error BinaryFunctionPassManager::runAllPasses(BinaryContext &BC) {
Manager.registerPass(
std::make_unique<EstimateEdgeCounts>(PrintEstimateEdgeCounts));
- const DynoStats InitialDynoStats =
- getDynoStats(BC.getBinaryFunctions(), BC.isAArch64());
+ Manager.registerPass(std::make_unique<DynoStatsSetPass>());
Manager.registerPass(std::make_unique<AsmDumpPass>(),
opts::AsmDump.getNumOccurrences());
@@ -456,10 +455,9 @@ Error BinaryFunctionPassManager::runAllPasses(BinaryContext &BC) {
Manager.registerPass(std::make_unique<SplitFunctions>(PrintSplit));
// Print final dyno stats right while CFG and instruction analysis are intact.
- Manager.registerPass(
- std::make_unique<DynoStatsPrintPass>(
- InitialDynoStats, "after all optimizations before SCTC and FOP"),
- opts::PrintDynoStats || opts::DynoStatsAll);
+ Manager.registerPass(std::make_unique<DynoStatsPrintPass>(
+ "after all optimizations before SCTC and FOP"),
+ opts::PrintDynoStats || opts::DynoStatsAll);
// Add the StokeInfo pass, which extract functions for stoke optimization and
// get the liveness information for them
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LG
InitialDynoStats used to be assigned inside
runAllPasses
, but theassignment executed before any of the passes. As we've moved
EstimateEdgeCounts
into a pass out of ProfileReader, it needs toexecute before initial dyno stats are set.
Thus move
InitialDynoStats
into BinaryContext and assignment intoDynoStatsSetPass
.