using namespace sampleprof;
class MIRAddFSDiscriminators : public MachineFunctionPass {
MachineFunction *MF = nullptr;
+ FSDiscriminatorPass Pass;
unsigned LowBit;
unsigned HighBit;
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");
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);
!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)