[llvm] 5612c27 - [IR] Mark llvm.pseudoprobe arguments as immarg (#224669)

via llvm-commits llvm-commits at lists.llvm.org
Mon Sep 21 00:16:09 PDT 2026


Author: Timur Baidusenov
Date: 2026-09-21T09:16:02+02:00
New Revision: 5612c2710b855cccaa277890a281fdd43f3ee92b

URL: https://github.com/llvm/llvm-project/commit/5612c2710b855cccaa277890a281fdd43f3ee92b
DIFF: https://github.com/llvm/llvm-project/commit/5612c2710b855cccaa277890a281fdd43f3ee92b.diff

LOG: [IR] Mark llvm.pseudoprobe arguments as immarg (#224669)

Per LangRef, llvm.pseudoprobe requires constant integer arguments.
Enforce this by marking them as immarg.

In particular, this prevents invalid sinking of llvm.pseudprobe calls in
GVNSink, which would introduce a phi node for a pseudoprobe argument.

Fixes #166306.

Added: 
    llvm/test/Transforms/GVNSink/pseudo-probe.ll

Modified: 
    llvm/include/llvm/IR/Intrinsics.td
    llvm/test/Transforms/SampleProfile/pseudo-probe-emit-macho.ll
    llvm/test/Transforms/SampleProfile/pseudo-probe-emit.ll

Removed: 
    


################################################################################
diff  --git a/llvm/include/llvm/IR/Intrinsics.td b/llvm/include/llvm/IR/Intrinsics.td
index 7c7e08b3d2520..26b7c772eb244 100644
--- a/llvm/include/llvm/IR/Intrinsics.td
+++ b/llvm/include/llvm/IR/Intrinsics.td
@@ -2136,7 +2136,9 @@ def int_sideeffect : DefaultAttrsIntrinsic<[], [], [IntrInaccessibleMemOnly]>;
 // out of the block it probes.
 def int_pseudoprobe : DefaultAttrsIntrinsic<[],
                         [llvm_i64_ty, llvm_i64_ty, llvm_i32_ty, llvm_i64_ty],
-                        [IntrInaccessibleMemOnly]>;
+                        [IntrInaccessibleMemOnly, ImmArg<ArgIndex<0>>,
+                         ImmArg<ArgIndex<1>>, ImmArg<ArgIndex<2>>,
+                         ImmArg<ArgIndex<3>>]>;
 
 // Saturating floating point to integer intrinsics
 let IntrProperties = [IntrNoMem, IntrSpeculatable, IntrNoCreateUndefOrPoison]

diff  --git a/llvm/test/Transforms/GVNSink/pseudo-probe.ll b/llvm/test/Transforms/GVNSink/pseudo-probe.ll
new file mode 100644
index 0000000000000..c3b61ccc1f8d0
--- /dev/null
+++ b/llvm/test/Transforms/GVNSink/pseudo-probe.ll
@@ -0,0 +1,46 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6
+; RUN: opt -S < %s -passes=gvn-sink | FileCheck %s
+
+declare void @llvm.pseudoprobe(i64, i64, i32, i64)
+
+; The index of a pseudo probe is an immarg, so the two probes cannot be sunk
+; into a single one taking a phi node. The instructions after them are still
+; sunk.
+
+define i32 @
diff erent_indices(i1 %c, i32 %a, i32 %b) {
+; CHECK-LABEL: define i32 @
diff erent_indices(
+; CHECK-SAME: i1 [[C:%.*]], i32 [[A:%.*]], i32 [[B:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[C]], label %[[IF_THEN:.*]], label %[[IF_ELSE:.*]]
+; CHECK:       [[IF_THEN]]:
+; CHECK-NEXT:    call void @llvm.pseudoprobe(i64 1234, i64 2, i32 0, i64 -1)
+; CHECK-NEXT:    [[SUB0:%.*]] = sub i32 [[A]], [[B]]
+; CHECK-NEXT:    br label %[[IF_END:.*]]
+; CHECK:       [[IF_ELSE]]:
+; CHECK-NEXT:    call void @llvm.pseudoprobe(i64 1234, i64 3, i32 0, i64 -1)
+; CHECK-NEXT:    [[SUB1:%.*]] = sub i32 [[A]], [[B]]
+; CHECK-NEXT:    br label %[[IF_END]]
+; CHECK:       [[IF_END]]:
+; CHECK-NEXT:    [[SUB1_SINK:%.*]] = phi i32 [ [[SUB1]], %[[IF_ELSE]] ], [ [[SUB0]], %[[IF_THEN]] ]
+; CHECK-NEXT:    [[MUL1:%.*]] = mul i32 [[SUB1_SINK]], [[A]]
+; CHECK-NEXT:    ret i32 [[MUL1]]
+;
+entry:
+  br i1 %c, label %if.then, label %if.else
+
+if.then:
+  call void @llvm.pseudoprobe(i64 1234, i64 2, i32 0, i64 -1)
+  %sub0 = sub i32 %a, %b
+  %mul0 = mul i32 %sub0, %a
+  br label %if.end
+
+if.else:
+  call void @llvm.pseudoprobe(i64 1234, i64 3, i32 0, i64 -1)
+  %sub1 = sub i32 %a, %b
+  %mul1 = mul i32 %sub1, %a
+  br label %if.end
+
+if.end:
+  %phi = phi i32 [ %mul0, %if.then ], [ %mul1, %if.else ]
+  ret i32 %phi
+}

diff  --git a/llvm/test/Transforms/SampleProfile/pseudo-probe-emit-macho.ll b/llvm/test/Transforms/SampleProfile/pseudo-probe-emit-macho.ll
index 12178c4597da2..5bcb8e07d54bf 100644
--- a/llvm/test/Transforms/SampleProfile/pseudo-probe-emit-macho.ll
+++ b/llvm/test/Transforms/SampleProfile/pseudo-probe-emit-macho.ll
@@ -67,7 +67,7 @@ entry:
 }
 
 ; CHECK-IL: Function Attrs: nocallback nofree nosync nounwind willreturn memory(inaccessiblemem: readwrite)
-; CHECK-IL-NEXT: declare void @llvm.pseudoprobe(i64, i64, i32, i64)
+; CHECK-IL-NEXT: declare void @llvm.pseudoprobe(i64 immarg, i64 immarg, i32 immarg, i64 immarg)
 
 ; CHECK-IL: ![[#FOO:]] = distinct !DISubprogram(name: "foo"
 ; CHECK-IL: ![[#FAKELINE]] = !DILocation(line: 0, scope: ![[#FOO]])

diff  --git a/llvm/test/Transforms/SampleProfile/pseudo-probe-emit.ll b/llvm/test/Transforms/SampleProfile/pseudo-probe-emit.ll
index a494ff14fbf29..7abe730256da6 100644
--- a/llvm/test/Transforms/SampleProfile/pseudo-probe-emit.ll
+++ b/llvm/test/Transforms/SampleProfile/pseudo-probe-emit.ll
@@ -85,7 +85,7 @@ entry:
 }
 
 ; CHECK-IL: Function Attrs: nocallback nofree nosync nounwind willreturn memory(inaccessiblemem: readwrite)
-; CHECK-IL-NEXT: declare void @llvm.pseudoprobe(i64, i64, i32, i64)
+; CHECK-IL-NEXT: declare void @llvm.pseudoprobe(i64 immarg, i64 immarg, i32 immarg, i64 immarg)
 
 ; CHECK-IL: ![[#FOO:]] = distinct !DISubprogram(name: "foo"
 ; CHECK-IL: ![[#FAKELINE]] = !DILocation(line: 0, scope: ![[#FOO]])


        


More information about the llvm-commits mailing list