Skip to content

Commit

Permalink
[PseudoProbe] Fix cleanup for pseudo probe after annotation (#119660)
Browse files Browse the repository at this point in the history
When using -sample-profile-remove-probe, pseudo probe desc should
also be removed and dwarf discriminator for call instruction should
be restored.
  • Loading branch information
HaohaiWen authored Dec 13, 2024
1 parent 4c597d4 commit ccc8e45
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 4 deletions.
24 changes: 20 additions & 4 deletions llvm/lib/Transforms/IPO/SampleProfile.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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;
}
Expand Down
2 changes: 2 additions & 0 deletions llvm/test/Transforms/SampleProfile/pseudo-probe-profile.ll
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down

0 comments on commit ccc8e45

Please sign in to comment.