[llvm] [LLVM/PGO] Preserve pseudo-probe discriminators in cloneWithBaseDiscriminator (PR #178267)

via llvm-commits llvm-commits at lists.llvm.org
Tue Jan 27 09:55:48 PST 2026


llvmbot wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-debuginfo

Author: Grigory Pastukhov (grigorypas)

<details>
<summary>Changes</summary>

In the O0 pipeline, `SampleProfileProbePass` runs before `AddDiscriminatorsPass`. The 
pseudo-probe pass stores probe IDs in the discriminator field using a special encoding 
(bits [2:0] = 0x7 as marker). When `AddDiscriminatorsPass` later processes instructions 
on the same source line, it calls `cloneWithBaseDiscriminator()` which overwrites these 
pseudo-probe discriminators with DWARF base discriminators, breaking sample profile 
matching.

This patch adds a check to `cloneWithBaseDiscriminator()` to detect and preserve 
pseudo-probe discriminators, similar to the existing check in 
`cloneByMultiplyingDuplicationFactor()`.

In optimized pipelines (O1+), AddDiscriminators runs before pseudo-probe instrumentation,
so this issue doesn't manifest. However, the fix makes the code robust regardless of 
pass ordering.


---
Full diff: https://github.com/llvm/llvm-project/pull/178267.diff


2 Files Affected:

- (modified) llvm/include/llvm/IR/DebugInfoMetadata.h (+6) 
- (added) llvm/test/Transforms/AddDiscriminators/pseudo-probe-discriminator.ll (+33) 


``````````diff
diff --git a/llvm/include/llvm/IR/DebugInfoMetadata.h b/llvm/include/llvm/IR/DebugInfoMetadata.h
index a41379b974069..220b6e28fd225 100644
--- a/llvm/include/llvm/IR/DebugInfoMetadata.h
+++ b/llvm/include/llvm/IR/DebugInfoMetadata.h
@@ -3010,6 +3010,12 @@ unsigned DILocation::getCopyIdentifier() const {
 
 std::optional<const DILocation *>
 DILocation::cloneWithBaseDiscriminator(unsigned D) const {
+  // Do not interfere with pseudo probes. Pseudo probe at a callsite uses
+  // the dwarf discriminator to store pseudo probe related information,
+  // such as the probe id.
+  if (isPseudoProbeDiscriminator(getDiscriminator()))
+    return this;
+
   unsigned BD, DF, CI;
 
   if (EnableFSDiscriminator) {
diff --git a/llvm/test/Transforms/AddDiscriminators/pseudo-probe-discriminator.ll b/llvm/test/Transforms/AddDiscriminators/pseudo-probe-discriminator.ll
new file mode 100644
index 0000000000000..14285793be153
--- /dev/null
+++ b/llvm/test/Transforms/AddDiscriminators/pseudo-probe-discriminator.ll
@@ -0,0 +1,33 @@
+; RUN: opt < %s -passes=add-discriminators -S | FileCheck %s
+
+; Test that AddDiscriminators preserves pseudo-probe discriminators.
+; Pseudo-probe discriminators use bits [2:0] = 0x7 as a marker.
+
+define void @foo() !dbg !4 {
+entry:
+  call void @bar(), !dbg !10
+  call void @bar(), !dbg !11
+  ret void
+}
+
+declare void @bar()
+
+!llvm.dbg.cu = !{!0}
+!llvm.module.flags = !{!7, !8}
+
+!0 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus, file: !1, isOptimized: false, runtimeVersion: 0, emissionKind: NoDebug)
+!1 = !DIFile(filename: "test.cpp", directory: "/tmp")
+!4 = distinct !DISubprogram(name: "foo", scope: !1, file: !1, line: 1, type: !5, scopeLine: 1, unit: !0)
+!5 = !DISubroutineType(types: !6)
+!6 = !{null}
+!7 = !{i32 2, !"Dwarf Version", i32 4}
+!8 = !{i32 2, !"Debug Info Version", i32 3}
+
+; Two calls on the same line with pseudo-probe discriminators (bits [2:0] = 0x7)
+!9 = !DILexicalBlockFile(scope: !4, file: !1, discriminator: 455081999)
+!10 = !DILocation(line: 2, column: 3, scope: !9)
+!12 = !DILexicalBlockFile(scope: !4, file: !1, discriminator: 455082007)
+!11 = !DILocation(line: 2, column: 3, scope: !12)
+
+; CHECK-DAG: !DILexicalBlockFile({{.*}}discriminator: 455081999)
+; CHECK-DAG: !DILexicalBlockFile({{.*}}discriminator: 455082007)

``````````

</details>


https://github.com/llvm/llvm-project/pull/178267


More information about the llvm-commits mailing list