Skip to content

Commit cf012a2

Browse files
committed
[Patchpoint] Add immarg attributes to patchpoint arguments
This fixes an issue where simplifycfg would merge two patchpoints, resulting in a dynamic ID being used, which triggers an assert during code generation.
1 parent f76ea31 commit cf012a2

File tree

2 files changed

+41
-2
lines changed

2 files changed

+41
-2
lines changed

llvm/include/llvm/IR/Intrinsics.td

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1606,12 +1606,16 @@ def int_experimental_patchpoint_void : Intrinsic<[],
16061606
[llvm_i64_ty, llvm_i32_ty,
16071607
llvm_ptr_ty, llvm_i32_ty,
16081608
llvm_vararg_ty],
1609-
[Throws]>;
1609+
[Throws, ImmArg<ArgIndex<0>>,
1610+
ImmArg<ArgIndex<1>>,
1611+
ImmArg<ArgIndex<3>>]>;
16101612
def int_experimental_patchpoint : Intrinsic<[llvm_any_ty],
16111613
[llvm_i64_ty, llvm_i32_ty,
16121614
llvm_ptr_ty, llvm_i32_ty,
16131615
llvm_vararg_ty],
1614-
[Throws]>;
1616+
[Throws, ImmArg<ArgIndex<0>>,
1617+
ImmArg<ArgIndex<1>>,
1618+
ImmArg<ArgIndex<3>>]>;
16151619

16161620

16171621
//===------------------------ 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, ...)

0 commit comments

Comments
 (0)