summaryrefslogtreecommitdiff
path: root/llvm/lib/Transforms/IPO/SampleProfile.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib/Transforms/IPO/SampleProfile.cpp')
-rw-r--r--llvm/lib/Transforms/IPO/SampleProfile.cpp24
1 files changed, 20 insertions, 4 deletions
diff --git a/llvm/lib/Transforms/IPO/SampleProfile.cpp b/llvm/lib/Transforms/IPO/SampleProfile.cpp
index b2fa66f2a6d3..603beb3b883d 100644
--- a/llvm/lib/Transforms/IPO/SampleProfile.cpp
+++ b/llvm/lib/Transforms/IPO/SampleProfile.cpp
@@ -529,7 +529,7 @@ protected:
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;
}