[llvm] [PseudoProbe] Fix cleanup for pseudo probe desc and discriminator (PR #119660)
Haohai Wen via llvm-commits
llvm-commits at lists.llvm.org
Wed Dec 11 21:49:49 PST 2024
https://github.com/HaohaiWen created https://github.com/llvm/llvm-project/pull/119660
When using -sample-profile-remove-probe, pseudo probe desc should
also be removed and dwarf discriminator for call instruction should
be restored.
>From 2eb4dca3165f664e088dec8aab521edcac449524 Mon Sep 17 00:00:00 2001
From: Haohai Wen <haohai.wen at intel.com>
Date: Thu, 12 Dec 2024 13:36:32 +0800
Subject: [PATCH] [PseudoProbe] Fix cleanup for pseudo probe desc and
discriminator
When using -sample-profile-remove-probe, pseudo probe desc should
also be removed and dwarf discriminator for call instruction should
be restored.
---
llvm/lib/Transforms/IPO/SampleProfile.cpp | 24 +++++++++++++++----
.../SampleProfile/pseudo-probe-profile.ll | 2 ++
2 files changed, 22 insertions(+), 4 deletions(-)
diff --git a/llvm/lib/Transforms/IPO/SampleProfile.cpp b/llvm/lib/Transforms/IPO/SampleProfile.cpp
index b2fa66f2a6d379..603beb3b883d7f 100644
--- a/llvm/lib/Transforms/IPO/SampleProfile.cpp
+++ b/llvm/lib/Transforms/IPO/SampleProfile.cpp
@@ -529,7 +529,7 @@ class SampleProfileLoader final : public SampleProfileLoaderBaseImpl<Function> {
void generateMDProfMetadata(Function &F);
bool rejectHighStalenessProfile(Module &M, ProfileSummaryInfo *PSI,
const SampleProfileMap &Profiles);
- void removePseudoProbeInsts(Module &M);
+ void removePseudoProbeInstsDiscriminator(Module &M);
/// Map from function name to Function *. Used to find the function from
/// the function name. If the function name contains suffix, additional
@@ -2138,13 +2138,25 @@ bool SampleProfileLoader::rejectHighStalenessProfile(
return false;
}
-void SampleProfileLoader::removePseudoProbeInsts(Module &M) {
+void SampleProfileLoader::removePseudoProbeInstsDiscriminator(Module &M) {
for (auto &F : M) {
std::vector<Instruction *> InstsToDel;
for (auto &BB : F) {
for (auto &I : BB) {
if (isa<PseudoProbeInst>(&I))
InstsToDel.push_back(&I);
+ else if (isa<CallBase>(&I))
+ if (const DILocation *DIL = I.getDebugLoc().get()) {
+ // Restore dwarf discriminator for call.
+ unsigned Discriminator = DIL->getDiscriminator();
+ if (DILocation::isPseudoProbeDiscriminator(Discriminator)) {
+ std::optional<uint32_t> DwarfDiscriminator =
+ PseudoProbeDwarfDiscriminator::extractDwarfBaseDiscriminator(
+ Discriminator);
+ I.setDebugLoc(DIL->cloneWithDiscriminator(
+ DwarfDiscriminator ? *DwarfDiscriminator : 0));
+ }
+ }
}
}
for (auto *I : InstsToDel)
@@ -2224,8 +2236,12 @@ bool SampleProfileLoader::runOnModule(Module &M, ModuleAnalysisManager *AM,
notInlinedCallInfo)
updateProfileCallee(pair.first, pair.second.entryCount);
- if (RemoveProbeAfterProfileAnnotation && FunctionSamples::ProfileIsProbeBased)
- removePseudoProbeInsts(M);
+ if (RemoveProbeAfterProfileAnnotation &&
+ FunctionSamples::ProfileIsProbeBased) {
+ removePseudoProbeInstsDiscriminator(M);
+ if (auto *FuncInfo = M.getNamedMetadata(PseudoProbeDescMetadataName))
+ M.eraseNamedMetadata(FuncInfo);
+ }
return retval;
}
diff --git a/llvm/test/Transforms/SampleProfile/pseudo-probe-profile.ll b/llvm/test/Transforms/SampleProfile/pseudo-probe-profile.ll
index b52f93763d4926..66dbc49a1d210a 100644
--- a/llvm/test/Transforms/SampleProfile/pseudo-probe-profile.ll
+++ b/llvm/test/Transforms/SampleProfile/pseudo-probe-profile.ll
@@ -4,6 +4,8 @@
; RUN: opt < %t -passes=sample-profile -sample-profile-file=%S/Inputs/pseudo-probe-profile.prof -sample-profile-remove-probe -S | FileCheck %s -check-prefix=REMOVE-PROBE
; REMOVE-PROBE-NOT: call void @llvm.pseudoprobe
+; REMOVE-PROBE-NOT: !llvm.pseudo_probe_desc
+; REMOVE-PROBE: !DILexicalBlockFile({{.*}}, discriminator: 0)
define dso_local i32 @foo(i32 %x, ptr %f) #0 !dbg !4 {
entry:
More information about the llvm-commits
mailing list