[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