[llvm] [BOLT] Add extra staleness logging (PR #80225)
Amir Ayupov via llvm-commits
llvm-commits at lists.llvm.org
Wed Jan 31 17:30:52 PST 2024
https://github.com/aaupov created https://github.com/llvm/llvm-project/pull/80225
Report two extra metrics:
- # of stale functions with matching block count,
- # of stale blocks with matching instruction count.
>From d3a928ef919a9d9ed3be5a207f89356532ae184f Mon Sep 17 00:00:00 2001
From: Amir Ayupov <aaupov at fb.com>
Date: Sat, 27 Jan 2024 19:00:42 -0800
Subject: [PATCH] [BOLT] Add extra staleness logging
Report two extra metrics:
- # of stale functions with matching block count,
- # of stale blocks with matching instruction count.
---
bolt/include/bolt/Core/BinaryContext.h | 5 +++++
bolt/lib/Passes/BinaryPasses.cpp | 16 ++++++++++++++++
bolt/lib/Profile/StaleProfileMatching.cpp | 3 +++
bolt/lib/Profile/YAMLProfileReader.cpp | 20 ++++++++++----------
4 files changed, 34 insertions(+), 10 deletions(-)
diff --git a/bolt/include/bolt/Core/BinaryContext.h b/bolt/include/bolt/Core/BinaryContext.h
index f0e7a8272ad0e..d6849cb8cc0eb 100644
--- a/bolt/include/bolt/Core/BinaryContext.h
+++ b/bolt/include/bolt/Core/BinaryContext.h
@@ -665,6 +665,11 @@ class BinaryContext {
uint64_t StaleSampleCount{0};
/// the count of matched samples
uint64_t MatchedSampleCount{0};
+ /// the number of stale functions that have matching number of blocks in
+ /// the profile
+ uint64_t NumStaleFuncsWithEqualBlockCount{0};
+ /// the number of blocks that have matching size but a differing hash
+ uint64_t NumStaleBlocksWithEqualIcount{0};
} Stats;
// Address of the first allocated segment.
diff --git a/bolt/lib/Passes/BinaryPasses.cpp b/bolt/lib/Passes/BinaryPasses.cpp
index 955cd3726ad41..8505d37491415 100644
--- a/bolt/lib/Passes/BinaryPasses.cpp
+++ b/bolt/lib/Passes/BinaryPasses.cpp
@@ -1420,6 +1420,12 @@ void PrintProgramStats::runOnFunctions(BinaryContext &BC) {
if (NumAllStaleFunctions) {
const float PctStale =
NumAllStaleFunctions / (float)NumAllProfiledFunctions * 100.0f;
+ const float PctStaleFuncsWithEqualBlockCount =
+ (float)BC.Stats.NumStaleFuncsWithEqualBlockCount /
+ NumAllStaleFunctions * 100.0f;
+ const float PctStaleBlocksWithEqualIcount =
+ (float)BC.Stats.NumStaleBlocksWithEqualIcount /
+ BC.Stats.NumStaleBlocks * 100.0f;
auto printErrorOrWarning = [&]() {
if (PctStale > opts::StaleThreshold)
errs() << "BOLT-ERROR: ";
@@ -1442,6 +1448,16 @@ void PrintProgramStats::runOnFunctions(BinaryContext &BC) {
<< "%) belong to functions with invalid"
" (possibly stale) profile.\n";
}
+ outs() << "BOLT-INFO: " << BC.Stats.NumStaleFuncsWithEqualBlockCount
+ << " stale function"
+ << (BC.Stats.NumStaleFuncsWithEqualBlockCount == 1 ? "" : "s")
+ << format(" (%.1f%% of all stale)", PctStaleFuncsWithEqualBlockCount)
+ << " have matching block count.\n";
+ outs() << "BOLT-INFO: " << BC.Stats.NumStaleBlocksWithEqualIcount
+ << " stale block"
+ << (BC.Stats.NumStaleBlocksWithEqualIcount == 1 ? "" : "s")
+ << format(" (%.1f%% of all stale)", PctStaleBlocksWithEqualIcount)
+ << " have matching icount.\n";
if (PctStale > opts::StaleThreshold) {
errs() << "BOLT-ERROR: stale functions exceed specified threshold of "
<< opts::StaleThreshold << "%. Exiting.\n";
diff --git a/bolt/lib/Profile/StaleProfileMatching.cpp b/bolt/lib/Profile/StaleProfileMatching.cpp
index 26180f1321477..631ccaec6ae61 100644
--- a/bolt/lib/Profile/StaleProfileMatching.cpp
+++ b/bolt/lib/Profile/StaleProfileMatching.cpp
@@ -418,6 +418,7 @@ void matchWeightsByHashes(BinaryContext &BC,
if (MatchedBlock == nullptr && YamlBB.Index == 0)
MatchedBlock = Blocks[0];
if (MatchedBlock != nullptr) {
+ const BinaryBasicBlock *BB = BlockOrder[MatchedBlock->Index - 1];
MatchedBlocks[YamlBB.Index] = MatchedBlock;
BlendedBlockHash BinHash = BlendedHashes[MatchedBlock->Index - 1];
LLVM_DEBUG(dbgs() << "Matched yaml block (bid = " << YamlBB.Index << ")"
@@ -433,6 +434,8 @@ void matchWeightsByHashes(BinaryContext &BC,
} else {
LLVM_DEBUG(dbgs() << " loose match\n");
}
+ if (YamlBB.NumInstructions == BB->size())
+ ++BC.Stats.NumStaleBlocksWithEqualIcount;
} else {
LLVM_DEBUG(
dbgs() << "Couldn't match yaml block (bid = " << YamlBB.Index << ")"
diff --git a/bolt/lib/Profile/YAMLProfileReader.cpp b/bolt/lib/Profile/YAMLProfileReader.cpp
index a4a401fd3cabf..e4673f6e3c301 100644
--- a/bolt/lib/Profile/YAMLProfileReader.cpp
+++ b/bolt/lib/Profile/YAMLProfileReader.cpp
@@ -246,20 +246,20 @@ bool YAMLProfileReader::parseFunctionProfile(
ProfileMatched &= !MismatchedBlocks && !MismatchedCalls && !MismatchedEdges;
- if (ProfileMatched)
- BF.markProfiled(YamlBP.Header.Flags);
+ if (!ProfileMatched) {
+ if (opts::Verbosity >= 1)
+ errs() << "BOLT-WARNING: " << MismatchedBlocks << " blocks, "
+ << MismatchedCalls << " calls, and " << MismatchedEdges
+ << " edges in profile did not match function " << BF << '\n';
- if (!ProfileMatched && opts::Verbosity >= 1)
- errs() << "BOLT-WARNING: " << MismatchedBlocks << " blocks, "
- << MismatchedCalls << " calls, and " << MismatchedEdges
- << " edges in profile did not match function " << BF << '\n';
+ if (YamlBF.NumBasicBlocks != BF.size())
+ ++BC.Stats.NumStaleFuncsWithEqualBlockCount;
- if (!ProfileMatched && opts::InferStaleProfile) {
- if (inferStaleProfile(BF, YamlBF)) {
+ if (opts::InferStaleProfile && inferStaleProfile(BF, YamlBF))
ProfileMatched = true;
- BF.markProfiled(YamlBP.Header.Flags);
- }
}
+ if (ProfileMatched)
+ BF.markProfiled(YamlBP.Header.Flags);
return ProfileMatched;
}
More information about the llvm-commits
mailing list