[llvm] 62a3f6c - [CSSPGO] Retire FlattenProfileForMatching
via llvm-commits
llvm-commits at lists.llvm.org
Wed Aug 30 18:01:38 PDT 2023
Author: wlei
Date: 2023-08-30T18:00:23-07:00
New Revision: 62a3f6c96eb3051fda0a84e2419fc80244c9aca2
URL: https://github.com/llvm/llvm-project/commit/62a3f6c96eb3051fda0a84e2419fc80244c9aca2
DIFF: https://github.com/llvm/llvm-project/commit/62a3f6c96eb3051fda0a84e2419fc80244c9aca2.diff
LOG: [CSSPGO] Retire FlattenProfileForMatching
- Always use flattened profile to find the profile anchors. Since profile under different contexts may have different inlined callsites, to get more profile anchors, we use a merged profile from all the contexts(the flattened profile) to find callsite anchors.
- Compute the staleness metrics based on the original nested profile, as currently once a callsite is mismatched, all its children profile are dropped.(TODO: in future, we can improve to reuse the children valid profile)
Reviewed By: hoy, wenlei
Differential Revision: https://reviews.llvm.org/D158891
Added:
Modified:
llvm/lib/Transforms/IPO/SampleProfile.cpp
llvm/test/Transforms/SampleProfile/profile-mismatch.ll
Removed:
llvm/test/Transforms/SampleProfile/profile-mismatch-flattened-profile.ll
################################################################################
diff --git a/llvm/lib/Transforms/IPO/SampleProfile.cpp b/llvm/lib/Transforms/IPO/SampleProfile.cpp
index 6deee9a2134cd2..ccf69d5e752488 100644
--- a/llvm/lib/Transforms/IPO/SampleProfile.cpp
+++ b/llvm/lib/Transforms/IPO/SampleProfile.cpp
@@ -142,11 +142,6 @@ static cl::opt<bool> PersistProfileStaleness(
cl::desc("Compute stale profile statistical metrics and write it into the "
"native object file(.llvm_stats section)."));
-static cl::opt<bool> FlattenProfileForMatching(
- "flatten-profile-for-matching", cl::Hidden, cl::init(true),
- cl::desc(
- "Use flattened profile for stale profile detection and matching."));
-
static cl::opt<bool> ProfileSampleAccurate(
"profile-sample-accurate", cl::Hidden, cl::init(false),
cl::desc("If the sample profile is accurate, we will mark all un-sampled "
@@ -466,12 +461,7 @@ class SampleProfileMatcher {
public:
SampleProfileMatcher(Module &M, SampleProfileReader &Reader,
const PseudoProbeManager *ProbeManager)
- : M(M), Reader(Reader), ProbeManager(ProbeManager) {
- if (FlattenProfileForMatching) {
- ProfileConverter::flattenProfile(Reader.getProfiles(), FlattenedProfiles,
- FunctionSamples::ProfileIsCS);
- }
- }
+ : M(M), Reader(Reader), ProbeManager(ProbeManager){};
void runOnModule();
private:
@@ -482,7 +472,7 @@ class SampleProfileMatcher {
return &It->second;
return nullptr;
}
- void runOnFunction(const Function &F, const FunctionSamples &FS);
+ void runOnFunction(const Function &F);
void findIRAnchors(const Function &F,
std::map<LineLocation, StringRef> &IRAnchors);
void findProfileAnchors(const FunctionSamples &FS,
@@ -2385,8 +2375,17 @@ void SampleProfileMatcher::runStaleProfileMatching(
}
}
-void SampleProfileMatcher::runOnFunction(const Function &F,
- const FunctionSamples &FS) {
+void SampleProfileMatcher::runOnFunction(const Function &F) {
+ // We need to use flattened function samples for matching.
+ // Unlike IR, which includes all callsites from the source code, the callsites
+ // in profile only show up when they are hit by samples, i,e. the profile
+ // callsites in one context may
diff er from those in another context. To get
+ // the maximum number of callsites, we merge the function profiles from all
+ // contexts, aka, the flattened profile to find profile anchors.
+ const auto *FSFlattened = getFlattenedSamplesFor(F);
+ if (!FSFlattened)
+ return;
+
// Anchors for IR. It's a map from IR location to callee name, callee name is
// empty for non-call instruction and use a dummy name(UnknownIndirectCallee)
// for unknown indrect callee name.
@@ -2395,17 +2394,21 @@ void SampleProfileMatcher::runOnFunction(const Function &F,
// Anchors for profile. It's a map from callsite location to a set of callee
// name.
std::map<LineLocation, StringSet<>> ProfileAnchors;
- findProfileAnchors(FS, ProfileAnchors);
+ findProfileAnchors(*FSFlattened, ProfileAnchors);
// Detect profile mismatch for profile staleness metrics report.
if (ReportProfileStaleness || PersistProfileStaleness) {
- countProfileMismatches(F, FS, IRAnchors, ProfileAnchors);
+ // Use top-level nested FS for counting profile mismatch metrics since
+ // currently once a callsite is mismatched, all its children profiles are
+ // dropped.
+ if (const auto *FS = Reader.getSamplesFor(F))
+ countProfileMismatches(F, *FS, IRAnchors, ProfileAnchors);
}
// Run profile matching for checksum mismatched profile, currently only
// support for pseudo-probe.
if (SalvageStaleProfile && FunctionSamples::ProfileIsProbeBased &&
- !ProbeManager->profileIsValid(F, FS)) {
+ !ProbeManager->profileIsValid(F, *FSFlattened)) {
// The matching result will be saved to IRToProfileLocationMap, create a new
// map for each function.
runStaleProfileMatching(F, IRAnchors, ProfileAnchors,
@@ -2414,17 +2417,12 @@ void SampleProfileMatcher::runOnFunction(const Function &F,
}
void SampleProfileMatcher::runOnModule() {
+ ProfileConverter::flattenProfile(Reader.getProfiles(), FlattenedProfiles,
+ FunctionSamples::ProfileIsCS);
for (auto &F : M) {
if (F.isDeclaration() || !F.hasFnAttribute("use-sample-profile"))
continue;
- FunctionSamples *FS = nullptr;
- if (FlattenProfileForMatching)
- FS = getFlattenedSamplesFor(F);
- else
- FS = Reader.getSamplesFor(F);
- if (!FS)
- continue;
- runOnFunction(F, *FS);
+ runOnFunction(F);
}
if (SalvageStaleProfile)
distributeIRToProfileLocationMap();
diff --git a/llvm/test/Transforms/SampleProfile/profile-mismatch-flattened-profile.ll b/llvm/test/Transforms/SampleProfile/profile-mismatch-flattened-profile.ll
deleted file mode 100644
index ef11652fd1a87b..00000000000000
--- a/llvm/test/Transforms/SampleProfile/profile-mismatch-flattened-profile.ll
+++ /dev/null
@@ -1,13 +0,0 @@
-; REQUIRES: x86_64-linux
-; RUN: opt < %S/profile-mismatch.ll -passes=sample-profile -sample-profile-file=%S/Inputs/profile-mismatch.prof -report-profile-staleness -persist-profile-staleness -flatten-profile-for-matching=1 -S 2>%t -o %t.ll
-; RUN: FileCheck %s --input-file %t
-; RUN: FileCheck %s --input-file %t.ll -check-prefix=CHECK-MD
-
-; RUN: opt < %S/profile-mismatch.ll -passes=sample-profile -sample-profile-file=%S/Inputs/profile-mismatch-cs.prof -report-profile-staleness -persist-profile-staleness -flatten-profile-for-matching=1 -S 2>%t -o %t.ll
-; RUN: FileCheck %s --input-file %t
-; RUN: FileCheck %s --input-file %t.ll -check-prefix=CHECK-MD
-
-
-; CHECK: (3/4) of callsites' profile are invalid and (20/30) of samples are discarded due to callsite location mismatch.
-
-; CHECK-MD: ![[#]] = !{!"NumMismatchedCallsites", i64 3, !"TotalProfiledCallsites", i64 4, !"MismatchedCallsiteSamples", i64 20, !"TotalCallsiteSamples", i64 30}
diff --git a/llvm/test/Transforms/SampleProfile/profile-mismatch.ll b/llvm/test/Transforms/SampleProfile/profile-mismatch.ll
index 4ce24f4491f79d..d86175c02dbb42 100644
--- a/llvm/test/Transforms/SampleProfile/profile-mismatch.ll
+++ b/llvm/test/Transforms/SampleProfile/profile-mismatch.ll
@@ -1,5 +1,5 @@
; REQUIRES: x86_64-linux
-; RUN: opt < %s -passes=sample-profile -sample-profile-file=%S/Inputs/profile-mismatch.prof -report-profile-staleness -persist-profile-staleness -flatten-profile-for-matching=0 -S 2>%t -o %t.ll
+; RUN: opt < %s -passes=sample-profile -sample-profile-file=%S/Inputs/profile-mismatch.prof -report-profile-staleness -persist-profile-staleness -S 2>%t -o %t.ll
; RUN: FileCheck %s --input-file %t
; RUN: FileCheck %s --input-file %t.ll -check-prefix=CHECK-MD
; RUN: llc < %t.ll -filetype=obj -o %t.obj
More information about the llvm-commits
mailing list