[llvm] [BOLT] Report adjusted program stats from perf2bolt in BAT mode (PR #91683)
Amir Ayupov via llvm-commits
llvm-commits at lists.llvm.org
Thu May 9 17:03:09 PDT 2024
https://github.com/aaupov created https://github.com/llvm/llvm-project/pull/91683
In BOLTed binaries split functions are non-simple (due to non-relocation
mode), but the original function is known to be simple and we have a
valid profile for it. Take that into account to accurately report the
number of functions in the profile.
Test Plan: updated bolt-address-translation-yaml.test
>From 1171fdde14bdb4904893594669df1ca8c67041ec Mon Sep 17 00:00:00 2001
From: Amir Ayupov <aaupov at fb.com>
Date: Wed, 8 May 2024 11:57:18 -0700
Subject: [PATCH] [BOLT] Report adjusted program stats from perf2bolt in BAT
mode
In BOLTed binaries split functions are non-simple (due to non-relocation
mode), but the original function is known to be simple and we have a
valid profile for it. Take that into account to accurately report the
number of functions in the profile.
Test Plan: updated bolt-address-translation-yaml.test
---
bolt/include/bolt/Passes/BinaryPasses.h | 5 ++++-
bolt/lib/Passes/BinaryPasses.cpp | 12 +++++++++++-
bolt/lib/Profile/DataAggregator.cpp | 3 ++-
bolt/test/X86/bolt-address-translation-yaml.test | 1 +
4 files changed, 18 insertions(+), 3 deletions(-)
diff --git a/bolt/include/bolt/Passes/BinaryPasses.h b/bolt/include/bolt/Passes/BinaryPasses.h
index 5d7692559eda8..9b4c690018171 100644
--- a/bolt/include/bolt/Passes/BinaryPasses.h
+++ b/bolt/include/bolt/Passes/BinaryPasses.h
@@ -16,6 +16,7 @@
#include "bolt/Core/BinaryContext.h"
#include "bolt/Core/BinaryFunction.h"
#include "bolt/Core/DynoStats.h"
+#include "bolt/Profile/BoltAddressTranslation.h"
#include "llvm/Support/CommandLine.h"
#include <atomic>
#include <set>
@@ -399,8 +400,10 @@ class PrintProfileStats : public BinaryFunctionPass {
/// Prints a list of the top 100 functions sorted by a set of
/// dyno stats categories.
class PrintProgramStats : public BinaryFunctionPass {
+ BoltAddressTranslation *BAT = nullptr;
public:
- explicit PrintProgramStats() : BinaryFunctionPass(false) {}
+ explicit PrintProgramStats(BoltAddressTranslation *BAT = nullptr)
+ : BinaryFunctionPass(false), BAT(BAT) {}
const char *getName() const override { return "print-stats"; }
bool shouldPrint(const BinaryFunction &) const override { return false; }
diff --git a/bolt/lib/Passes/BinaryPasses.cpp b/bolt/lib/Passes/BinaryPasses.cpp
index c0ba73108f577..666020bc86ba2 100644
--- a/bolt/lib/Passes/BinaryPasses.cpp
+++ b/bolt/lib/Passes/BinaryPasses.cpp
@@ -1378,9 +1378,19 @@ Error PrintProgramStats::runOnFunctions(BinaryContext &BC) {
if (Function.isPLTFunction())
continue;
+ // Adjustment for BAT mode: the profile for BOLT split fragments is combined
+ // so only count the hot fragment.
+ const uint64_t Address = Function.getAddress();
+ bool IsHotParentOfBOLTSplitFunction = !Function.getFragments().empty() &&
+ BAT && BAT->isBATFunction(Address) &&
+ !BAT->fetchParentAddress(Address);
+
++NumRegularFunctions;
- if (!Function.isSimple()) {
+ // In BOLTed binaries split functions are non-simple (due to non-relocation
+ // mode), but the original function is known to be simple and we have a
+ // valid profile for it.
+ if (!Function.isSimple() && !IsHotParentOfBOLTSplitFunction) {
if (Function.hasProfile())
++NumNonSimpleProfiledFunctions;
continue;
diff --git a/bolt/lib/Profile/DataAggregator.cpp b/bolt/lib/Profile/DataAggregator.cpp
index 5108392c824c1..4d98d35210b64 100644
--- a/bolt/lib/Profile/DataAggregator.cpp
+++ b/bolt/lib/Profile/DataAggregator.cpp
@@ -612,7 +612,8 @@ Error DataAggregator::readProfile(BinaryContext &BC) {
if (std::error_code EC = writeBATYAML(BC, opts::SaveProfile))
report_error("cannot create output data file", EC);
}
- BC.logBOLTErrorsAndQuitOnFatal(PrintProgramStats().runOnFunctions(BC));
+ PrintProgramStats PPS(BAT);
+ BC.logBOLTErrorsAndQuitOnFatal(PPS.runOnFunctions(BC));
}
return Error::success();
diff --git a/bolt/test/X86/bolt-address-translation-yaml.test b/bolt/test/X86/bolt-address-translation-yaml.test
index af24c3d84a0f1..61b65852b2097 100644
--- a/bolt/test/X86/bolt-address-translation-yaml.test
+++ b/bolt/test/X86/bolt-address-translation-yaml.test
@@ -23,6 +23,7 @@ WRITE-BAT-CHECK: BOLT-INFO: BAT section size (bytes): 384
READ-BAT-CHECK-NOT: BOLT-ERROR: unable to save profile in YAML format for input file processed by BOLT
READ-BAT-CHECK: BOLT-INFO: Parsed 5 BAT entries
READ-BAT-CHECK: PERF2BOLT: read 79 aggregated LBR entries
+READ-BAT-CHECK: BOLT-INFO: 5 out of 21 functions in the binary (23.8%) have non-empty execution profile
YAML-BAT-CHECK: functions:
# Function not covered by BAT - has insns in basic block
More information about the llvm-commits
mailing list