diff --git a/llvm/include/llvm/CodeGen/MIRFSDiscriminator.h b/llvm/include/llvm/CodeGen/MIRFSDiscriminator.h --- a/llvm/include/llvm/CodeGen/MIRFSDiscriminator.h +++ b/llvm/include/llvm/CodeGen/MIRFSDiscriminator.h @@ -31,6 +31,7 @@ using namespace sampleprof; class MIRAddFSDiscriminators : public MachineFunctionPass { MachineFunction *MF = nullptr; + FSDiscriminatorPass Pass; unsigned LowBit; unsigned HighBit; @@ -38,7 +39,7 @@ static char ID; /// PassNum is the sequence number this pass is called, start from 1. MIRAddFSDiscriminators(FSDiscriminatorPass P = FSDiscriminatorPass::Pass1) - : MachineFunctionPass(ID) { + : MachineFunctionPass(ID), Pass(P) { LowBit = getFSPassBitBegin(P); HighBit = getFSPassBitEnd(P); assert(LowBit < HighBit && "HighBit needs to be greater than Lowbit"); diff --git a/llvm/lib/CodeGen/MIRFSDiscriminator.cpp b/llvm/lib/CodeGen/MIRFSDiscriminator.cpp --- a/llvm/lib/CodeGen/MIRFSDiscriminator.cpp +++ b/llvm/lib/CodeGen/MIRFSDiscriminator.cpp @@ -150,6 +150,12 @@ if (LineNo == 0) continue; unsigned Discriminator = DIL->getDiscriminator(); + // Clean up discriminators for pseudo probes at the first FS discriminator + // pass as their discriminators should not ever be used. + if ((Pass == FSDiscriminatorPass::Pass1) && I.isPseudoProbe()) { + Discriminator = 0; + I.setDebugLoc(DIL->cloneWithDiscriminator(0)); + } uint64_t CallStackHashVal = 0; if (ImprovedFSDiscriminator) CallStackHashVal = getCallStackHash(DIL); diff --git a/llvm/test/CodeGen/X86/fsafdo_probe.ll b/llvm/test/CodeGen/X86/fsafdo_probe.ll --- a/llvm/test/CodeGen/X86/fsafdo_probe.ll +++ b/llvm/test/CodeGen/X86/fsafdo_probe.ll @@ -65,7 +65,8 @@ !6 = distinct !DISubprogram(name: "foo", scope: !1, file: !1, line: 5, type: !7, isLocal: false, isDefinition: true, scopeLine: 5, flags: DIFlagPrototyped, isOptimized: true, unit: !0, retainedNodes: !2) !7 = !DISubroutineType(types: !2) !8 = !DILocation(line: 7, column: 15, scope: !9) -!9 = !DILexicalBlockFile(scope: !6, file: !1, discriminator: 0) +;; The discriminator with value 2 is to test that it can be cleaned up by the first FS discriminator pass. +!9 = !DILexicalBlockFile(scope: !6, file: !1, discriminator: 2) !10 = !DILocation(line: 7, column: 3, scope: !9) !11 = !DILocation(line: 9, column: 5, scope: !9) !12 = !DILocation(line: 14, column: 3, scope: !6)