• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1; RUN: opt < %s -S -rewrite-statepoints-for-gc | FileCheck %s
2
3declare i64 addrspace(1)* @some_call(i64 addrspace(1)*)
4declare i32 @personality_function()
5
6define i64 addrspace(1)* @test_basic(i64 addrspace(1)* %obj, i64 addrspace(1)* %obj1) gc "statepoint-example" personality i32 ()* @personality_function {
7; CHECK-LABEL: entry:
8entry:
9  ; CHECK: invoke
10  ; CHECK: statepoint
11  ; CHECK: some_call
12  %ret_val = invoke i64 addrspace(1)* @some_call(i64 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 i64
18
19normal_return:
20  ret i64 addrspace(1)* %ret_val
21
22; CHECK-LABEL: exceptional_return:
23; CHECK: landingpad
24; CHECK: ret i64
25
26exceptional_return:
27  %landing_pad4 = landingpad token
28          cleanup
29  ret i64 addrspace(1)* %obj1
30}
31
32define i64 addrspace(1)* @test_two_invokes(i64 addrspace(1)* %obj, i64 addrspace(1)* %obj1) gc "statepoint-example" personality i32 ()* @personality_function {
33; CHECK-LABEL: entry:
34entry:
35  ; CHECK: invoke
36  ; CHECK: statepoint
37  ; CHECK: some_call
38  %ret_val1 = invoke i64 addrspace(1)* @some_call(i64 addrspace(1)* %obj)
39               to label %second_invoke unwind label %exceptional_return
40
41; CHECK-LABEL: second_invoke:
42second_invoke:
43  ; CHECK: invoke
44  ; CHECK: statepoint
45  ; CHECK: some_call
46  %ret_val2 = invoke i64 addrspace(1)* @some_call(i64 addrspace(1)* %ret_val1)
47                to label %normal_return unwind label %exceptional_return
48
49; CHECK-LABEL: normal_return:
50normal_return:
51  ; CHECK: gc.result
52  ; CHECK: ret i64
53  ret i64 addrspace(1)* %ret_val2
54
55; CHECK: exceptional_return:
56; CHECK: ret i64
57
58exceptional_return:
59  %landing_pad4 = landingpad token
60          cleanup
61  ret i64 addrspace(1)* %obj1
62}
63
64define i64 addrspace(1)* @test_phi_node(i1 %cond, i64 addrspace(1)* %obj) gc "statepoint-example" personality i32 ()* @personality_function {
65; CHECK-LABEL: @test_phi_node
66; CHECK-LABEL: entry:
67entry:
68  br i1 %cond, label %left, label %right
69
70left:
71  %ret_val_left = invoke i64 addrspace(1)* @some_call(i64 addrspace(1)* %obj)
72                    to label %merge unwind label %exceptional_return
73
74right:
75  %ret_val_right = invoke i64 addrspace(1)* @some_call(i64 addrspace(1)* %obj)
76                     to label %merge unwind label %exceptional_return
77
78; CHECK: merge[[A:[0-9]]]:
79; CHECK: gc.result
80; CHECK: br label %[[with_phi:merge[0-9]*]]
81
82; CHECK: merge[[B:[0-9]]]:
83; CHECK: gc.result
84; CHECK: br label %[[with_phi]]
85
86; CHECK: [[with_phi]]:
87; CHECK: phi
88; CHECK: ret i64 addrspace(1)* %ret_val
89merge:
90  %ret_val = phi i64 addrspace(1)* [%ret_val_left, %left], [%ret_val_right, %right]
91  ret i64 addrspace(1)* %ret_val
92
93; CHECK-LABEL: exceptional_return:
94; CHECK: ret i64 addrspace(1)*
95
96exceptional_return:
97  %landing_pad4 = landingpad token
98          cleanup
99  ret i64 addrspace(1)* %obj
100}
101
102declare void @do_safepoint()
103define void @gc.safepoint_poll() {
104; CHECK-LABEL: gc.safepoint_poll
105; CHECK-LABEL: entry
106; CHECK-NEXT: do_safepoint
107; CHECK-NEXT: ret void
108entry:
109  call void @do_safepoint()
110  ret void
111}
112