Skip to content

Commit bc8a5d1

Browse files
authored
[Patchpoint] Add immarg attributes to patchpoint arguments (#97276)
1 parent 731a683 commit bc8a5d1

File tree

3 files changed

+72
-2
lines changed

3 files changed

+72
-2
lines changed

llvm/include/llvm/IR/Intrinsics.td

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1632,12 +1632,16 @@ def int_experimental_patchpoint_void : Intrinsic<[],
16321632
[llvm_i64_ty, llvm_i32_ty,
16331633
llvm_ptr_ty, llvm_i32_ty,
16341634
llvm_vararg_ty],
1635-
[Throws]>;
1635+
[Throws, ImmArg<ArgIndex<0>>,
1636+
ImmArg<ArgIndex<1>>,
1637+
ImmArg<ArgIndex<3>>]>;
16361638
def int_experimental_patchpoint : Intrinsic<[llvm_any_ty],
16371639
[llvm_i64_ty, llvm_i32_ty,
16381640
llvm_ptr_ty, llvm_i32_ty,
16391641
llvm_vararg_ty],
1640-
[Throws]>;
1642+
[Throws, ImmArg<ArgIndex<0>>,
1643+
ImmArg<ArgIndex<1>>,
1644+
ImmArg<ArgIndex<3>>]>;
16411645

16421646

16431647
//===------------------------ Garbage Collection Intrinsics ---------------===//
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
; RUN: opt -passes='simplifycfg<sink-common-insts>' -S %s | FileCheck %s
2+
3+
declare void @personalityFn()
4+
5+
define void @test(i1 %c) personality ptr @personalityFn {
6+
; CHECK-LABEL: define void @test
7+
; CHECK-LABEL: entry:
8+
; CHECK-NEXT: br i1 %c, label %taken, label %untaken
9+
; CHECK-LABEL: taken:
10+
; CHECK-NEXT: invoke void (i64, i32, ptr, i32, ...) @llvm.experimental.patchpoint.void(i64 1, i32 0, ptr null, i32 0)
11+
; CHECK-LABEL: untaken:
12+
; CHECK-NEXT: invoke void (i64, i32, ptr, i32, ...) @llvm.experimental.patchpoint.void(i64 2, i32 0, ptr null, i32 0)
13+
; CHECK-LABEL: end:
14+
; CHECK-NEXT: ret void
15+
entry:
16+
br i1 %c, label %taken, label %untaken
17+
18+
taken:
19+
invoke void (i64, i32, ptr, i32, ...) @llvm.experimental.patchpoint.void(i64 1, i32 0, ptr null, i32 0)
20+
to label %end unwind label %unwind
21+
22+
untaken:
23+
invoke void (i64, i32, ptr, i32, ...) @llvm.experimental.patchpoint.void(i64 2, i32 0, ptr null, i32 0)
24+
to label %end unwind label %unwind
25+
26+
end:
27+
ret void
28+
29+
unwind:
30+
%0 = landingpad { ptr, i32 }
31+
cleanup
32+
br label %end
33+
}
34+
35+
declare void @llvm.experimental.patchpoint.void(i64 immarg, i32 immarg, ptr, i32 immarg, ...)

llvm/test/Verifier/intrinsic-immarg.ll

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -238,6 +238,37 @@ define void @calls_statepoint(ptr addrspace(1) %arg0, i64 %arg1, i32 %arg2, i32
238238
ret void
239239
}
240240

241+
declare void @llvm.experimental.patchpoint.void(i64, i32, ptr, i32, ...)
242+
declare i64 @llvm.experimental.patchpoint.i64(i64, i32, ptr, i32, ...)
243+
244+
define void @test_patchpoint(i64 %arg0, i32 %arg1, i32 %arg2) {
245+
; CHECK: immarg operand has non-immediate parameter
246+
; CHECK-NEXT: i64 %arg0
247+
; CHECK-NEXT: call void (i64, i32, ptr, i32, ...) @llvm.experimental.patchpoint.void(i64 %arg0, i32 4, ptr null, i32 0)
248+
; CHECK: immarg operand has non-immediate parameter
249+
; CHECK-NEXT: i32 %arg1
250+
; CHECK-NEXT: call void (i64, i32, ptr, i32, ...) @llvm.experimental.patchpoint.void(i64 0, i32 %arg1, ptr null, i32 0)
251+
; CHECK: immarg operand has non-immediate parameter
252+
; CHECK-NEXT: i32 %arg2
253+
; CHECK-NEXT: call void (i64, i32, ptr, i32, ...) @llvm.experimental.patchpoint.void(i64 0, i32 4, ptr null, i32 %arg2)
254+
; CHECK: immarg operand has non-immediate parameter
255+
; CHECK-NEXT: i64 %arg0
256+
; CHECK-NEXT: %patchpoint0 = call i64 (i64, i32, ptr, i32, ...) @llvm.experimental.patchpoint.i64(i64 %arg0, i32 4, ptr null, i32 0)
257+
; CHECK: immarg operand has non-immediate parameter
258+
; CHECK-NEXT: i32 %arg1
259+
; CHECK-NEXT: %patchpoint1 = call i64 (i64, i32, ptr, i32, ...) @llvm.experimental.patchpoint.i64(i64 0, i32 %arg1, ptr null, i32 0)
260+
; CHECK: immarg operand has non-immediate parameter
261+
; CHECK-NEXT: i32 %arg2
262+
; CHECK-NEXT: %patchpoint2 = call i64 (i64, i32, ptr, i32, ...) @llvm.experimental.patchpoint.i64(i64 0, i32 4, ptr null, i32 %arg2)
263+
call void (i64, i32, ptr, i32, ...) @llvm.experimental.patchpoint.void(i64 %arg0, i32 4, ptr null, i32 0)
264+
call void (i64, i32, ptr, i32, ...) @llvm.experimental.patchpoint.void(i64 0, i32 %arg1, ptr null, i32 0)
265+
call void (i64, i32, ptr, i32, ...) @llvm.experimental.patchpoint.void(i64 0, i32 4, ptr null, i32 %arg2)
266+
%patchpoint0 = call i64 (i64, i32, ptr, i32, ...) @llvm.experimental.patchpoint.i64(i64 %arg0, i32 4, ptr null, i32 0)
267+
%patchpoint1 = call i64 (i64, i32, ptr, i32, ...) @llvm.experimental.patchpoint.i64(i64 0, i32 %arg1, ptr null, i32 0)
268+
%patchpoint2 = call i64 (i64, i32, ptr, i32, ...) @llvm.experimental.patchpoint.i64(i64 0, i32 4, ptr null, i32 %arg2)
269+
ret void
270+
}
271+
241272
declare void @llvm.hwasan.check.memaccess(ptr, ptr, i32)
242273

243274
define void @hwasan_check_memaccess(ptr %arg0,ptr %arg1, i32 %arg2) {

0 commit comments

Comments
 (0)