xref: /llvm-project/llvm/test/Transforms/RewriteStatepointsForGC/invokes.ll (revision 6f7c9d1e176362d4e9af46b808c36d786d1fc96c)
1; RUN: opt < %s -S -passes=rewrite-statepoints-for-gc | FileCheck %s
2
3declare ptr addrspace(1) @some_call(ptr addrspace(1))
4declare i32 @personality_function()
5
6define ptr addrspace(1) @test_basic(ptr addrspace(1) %obj, ptr addrspace(1) %obj1) gc "statepoint-example" personality ptr @personality_function {
7; CHECK-LABEL: entry:
8entry:
9  ; CHECK: invoke
10  ; CHECK: statepoint
11  ; CHECK: some_call
12  %ret_val = invoke ptr addrspace(1) @some_call(ptr addrspace(1) %obj)
13               to label %normal_return unwind label %exceptional_return
14
15; CHECK-LABEL: normal_return:
16; CHECK: gc.result
17; CHECK: ret ptr
18
19normal_return:
20  ret ptr addrspace(1) %ret_val
21
22; CHECK-LABEL: exceptional_return:
23; CHECK: landingpad
24; CHECK: ret ptr
25
26exceptional_return:
27  %landing_pad4 = landingpad token
28          cleanup
29  ret ptr addrspace(1) %obj1
30}
31
32declare <4 x ptr addrspace(1)> @some_vector_call(<4 x ptr addrspace(1)>)
33
34define <4 x ptr addrspace(1)> @test_basic_vector(<4 x ptr addrspace(1)> %objs, <4 x ptr addrspace(1)> %objs1) gc "statepoint-example" personality ptr @personality_function {
35; CHECK-LABEL: @test_basic_vector
36entry:
37; CHECK: invoke{{.*}}llvm.experimental.gc.statepoint{{.*}}some_vector_call
38  %ret_val = invoke <4 x ptr addrspace(1)> @some_vector_call(<4 x ptr addrspace(1)> %objs)
39               to label %normal_return unwind label %exceptional_return
40
41; CHECK-LABEL: normal_return:
42; CHECK: gc.result
43; CHECK: ret <4 x ptr addrspace(1)>
44
45normal_return:
46  ret <4 x ptr addrspace(1)> %ret_val
47
48; CHECK-LABEL: exceptional_return:
49; CHECK: landingpad
50; CHECK: ret <4 x ptr addrspace(1)>
51
52exceptional_return:
53  %landing_pad4 = landingpad token
54          cleanup
55  ret <4 x ptr addrspace(1)> %objs1
56}
57
58define ptr addrspace(1) @test_two_invokes(ptr addrspace(1) %obj, ptr addrspace(1) %obj1) gc "statepoint-example" personality ptr @personality_function {
59; CHECK-LABEL: entry:
60entry:
61  ; CHECK: invoke
62  ; CHECK: statepoint
63  ; CHECK: some_call
64  %ret_val1 = invoke ptr addrspace(1) @some_call(ptr addrspace(1) %obj)
65               to label %second_invoke unwind label %exceptional_return
66
67; CHECK-LABEL: second_invoke:
68second_invoke:
69  ; CHECK: invoke
70  ; CHECK: statepoint
71  ; CHECK: some_call
72  %ret_val2 = invoke ptr addrspace(1) @some_call(ptr addrspace(1) %ret_val1)
73                to label %normal_return unwind label %exceptional_return
74
75; CHECK-LABEL: normal_return:
76normal_return:
77  ; CHECK: gc.result
78  ; CHECK: ret ptr
79  ret ptr addrspace(1) %ret_val2
80
81; CHECK: exceptional_return:
82; CHECK: ret ptr
83
84exceptional_return:
85  %landing_pad4 = landingpad token
86          cleanup
87  ret ptr addrspace(1) %obj1
88}
89
90define ptr addrspace(1) @test_phi_node(i1 %cond, ptr addrspace(1) %obj) gc "statepoint-example" personality ptr @personality_function {
91; CHECK-LABEL: @test_phi_node
92; CHECK-LABEL: entry:
93entry:
94  br i1 %cond, label %left, label %right
95
96left:
97  %ret_val_left = invoke ptr addrspace(1) @some_call(ptr addrspace(1) %obj)
98                    to label %merge unwind label %exceptional_return
99
100right:
101  %ret_val_right = invoke ptr addrspace(1) @some_call(ptr addrspace(1) %obj)
102                     to label %merge unwind label %exceptional_return
103
104; CHECK: merge[[A:[0-9]]]:
105; CHECK: gc.result
106; CHECK: br label %[[with_phi:merge[0-9]*]]
107
108; CHECK: merge[[B:[0-9]]]:
109; CHECK: gc.result
110; CHECK: br label %[[with_phi]]
111
112; CHECK: [[with_phi]]:
113; CHECK: phi
114; CHECK: ret ptr addrspace(1) %ret_val
115merge:
116  %ret_val = phi ptr addrspace(1) [%ret_val_left, %left], [%ret_val_right, %right]
117  ret ptr addrspace(1) %ret_val
118
119; CHECK-LABEL: exceptional_return:
120; CHECK: ret ptr addrspace(1)
121
122exceptional_return:
123  %landing_pad4 = landingpad token
124          cleanup
125  ret ptr addrspace(1) %obj
126}
127
128declare void @do_safepoint()
129define void @gc.safepoint_poll() {
130; CHECK-LABEL: gc.safepoint_poll
131; CHECK-LABEL: entry
132; CHECK-NEXT: do_safepoint
133; CHECK-NEXT: ret void
134entry:
135  call void @do_safepoint()
136  ret void
137}
138