blob: b87420e801a751a8ba0f01d934665445c4b2a606 [file] [log] [blame]
Sanjoy Das04071082016-01-29 00:28:57 +00001; RUN: opt < %s -S -rewrite-statepoints-for-gc | FileCheck %s
Fedor Sergeev4b86d792017-12-15 09:32:11 +00002; RUN: opt < %s -S -passes=rewrite-statepoints-for-gc | FileCheck %s
Igor Laevsky55d60a42015-02-19 11:39:04 +00003
Sanjoy Das52e67e72016-01-28 16:11:27 +00004declare i64 addrspace(1)* @some_call(i64 addrspace(1)*)
5declare i32 @personality_function()
Igor Laevsky55d60a42015-02-19 11:39:04 +00006
Sanjoy Das52e67e72016-01-28 16:11:27 +00007define i64 addrspace(1)* @test_basic(i64 addrspace(1)* %obj, i64 addrspace(1)* %obj1) gc "statepoint-example" personality i32 ()* @personality_function {
Igor Laevsky55d60a42015-02-19 11:39:04 +00008; CHECK-LABEL: entry:
9entry:
10 ; CHECK: invoke
11 ; CHECK: statepoint
12 ; CHECK: some_call
Sanjoy Das52e67e72016-01-28 16:11:27 +000013 %ret_val = invoke i64 addrspace(1)* @some_call(i64 addrspace(1)* %obj)
Igor Laevsky55d60a42015-02-19 11:39:04 +000014 to label %normal_return unwind label %exceptional_return
15
16; CHECK-LABEL: normal_return:
17; CHECK: gc.result
18; CHECK: ret i64
19
20normal_return:
21 ret i64 addrspace(1)* %ret_val
22
23; CHECK-LABEL: exceptional_return:
24; CHECK: landingpad
25; CHECK: ret i64
26
27exceptional_return:
Sanjoy Dasf7302c82016-01-28 21:51:14 +000028 %landing_pad4 = landingpad token
Igor Laevsky55d60a42015-02-19 11:39:04 +000029 cleanup
30 ret i64 addrspace(1)* %obj1
31}
32
Daniel Neilson594f4432018-01-30 14:43:41 +000033declare <4 x i64 addrspace(1)*> @some_vector_call(<4 x i64 addrspace(1)*>)
34
35define <4 x i64 addrspace(1)*> @test_basic_vector(<4 x i64 addrspace(1)*> %objs, <4 x i64 addrspace(1)*> %objs1) gc "statepoint-example" personality i32 ()* @personality_function {
36; CHECK-LABEL: @test_basic_vector
37entry:
38; CHECK: invoke{{.*}}llvm.experimental.gc.statepoint{{.*}}some_vector_call
39 %ret_val = invoke <4 x i64 addrspace(1)*> @some_vector_call(<4 x i64 addrspace(1)*> %objs)
40 to label %normal_return unwind label %exceptional_return
41
42; CHECK-LABEL: normal_return:
43; CHECK: gc.result
44; CHECK: ret <4 x i64 addrspace(1)*>
45
46normal_return:
47 ret <4 x i64 addrspace(1)*> %ret_val
48
49; CHECK-LABEL: exceptional_return:
50; CHECK: landingpad
51; CHECK: ret <4 x i64 addrspace(1)*>
52
53exceptional_return:
54 %landing_pad4 = landingpad token
55 cleanup
56 ret <4 x i64 addrspace(1)*> %objs1
57}
58
Sanjoy Das52e67e72016-01-28 16:11:27 +000059define i64 addrspace(1)* @test_two_invokes(i64 addrspace(1)* %obj, i64 addrspace(1)* %obj1) gc "statepoint-example" personality i32 ()* @personality_function {
Igor Laevsky55d60a42015-02-19 11:39:04 +000060; CHECK-LABEL: entry:
61entry:
62 ; CHECK: invoke
63 ; CHECK: statepoint
64 ; CHECK: some_call
Sanjoy Das52e67e72016-01-28 16:11:27 +000065 %ret_val1 = invoke i64 addrspace(1)* @some_call(i64 addrspace(1)* %obj)
Igor Laevsky55d60a42015-02-19 11:39:04 +000066 to label %second_invoke unwind label %exceptional_return
67
68; CHECK-LABEL: second_invoke:
69second_invoke:
70 ; CHECK: invoke
71 ; CHECK: statepoint
72 ; CHECK: some_call
Sanjoy Das52e67e72016-01-28 16:11:27 +000073 %ret_val2 = invoke i64 addrspace(1)* @some_call(i64 addrspace(1)* %ret_val1)
Igor Laevsky55d60a42015-02-19 11:39:04 +000074 to label %normal_return unwind label %exceptional_return
75
76; CHECK-LABEL: normal_return:
77normal_return:
78 ; CHECK: gc.result
79 ; CHECK: ret i64
80 ret i64 addrspace(1)* %ret_val2
81
82; CHECK: exceptional_return:
83; CHECK: ret i64
84
85exceptional_return:
Sanjoy Dasf7302c82016-01-28 21:51:14 +000086 %landing_pad4 = landingpad token
Igor Laevsky55d60a42015-02-19 11:39:04 +000087 cleanup
88 ret i64 addrspace(1)* %obj1
89}
90
Sanjoy Das52e67e72016-01-28 16:11:27 +000091define i64 addrspace(1)* @test_phi_node(i1 %cond, i64 addrspace(1)* %obj) gc "statepoint-example" personality i32 ()* @personality_function {
Sanjoy Dasabe1c682015-05-06 23:53:09 +000092; CHECK-LABEL: @test_phi_node
Igor Laevsky55d60a42015-02-19 11:39:04 +000093; CHECK-LABEL: entry:
94entry:
95 br i1 %cond, label %left, label %right
96
97left:
Sanjoy Das52e67e72016-01-28 16:11:27 +000098 %ret_val_left = invoke i64 addrspace(1)* @some_call(i64 addrspace(1)* %obj)
Igor Laevsky55d60a42015-02-19 11:39:04 +000099 to label %merge unwind label %exceptional_return
100
101right:
Sanjoy Das52e67e72016-01-28 16:11:27 +0000102 %ret_val_right = invoke i64 addrspace(1)* @some_call(i64 addrspace(1)* %obj)
Igor Laevsky55d60a42015-02-19 11:39:04 +0000103 to label %merge unwind label %exceptional_return
104
Sanjoy Dasabe1c682015-05-06 23:53:09 +0000105; CHECK: merge[[A:[0-9]]]:
Igor Laevsky55d60a42015-02-19 11:39:04 +0000106; CHECK: gc.result
Sanjoy Dasabe1c682015-05-06 23:53:09 +0000107; CHECK: br label %[[with_phi:merge[0-9]*]]
Igor Laevsky55d60a42015-02-19 11:39:04 +0000108
Sanjoy Dasabe1c682015-05-06 23:53:09 +0000109; CHECK: merge[[B:[0-9]]]:
Igor Laevsky55d60a42015-02-19 11:39:04 +0000110; CHECK: gc.result
Sanjoy Dasabe1c682015-05-06 23:53:09 +0000111; CHECK: br label %[[with_phi]]
Igor Laevsky55d60a42015-02-19 11:39:04 +0000112
Sanjoy Dasabe1c682015-05-06 23:53:09 +0000113; CHECK: [[with_phi]]:
Igor Laevsky55d60a42015-02-19 11:39:04 +0000114; CHECK: phi
115; CHECK: ret i64 addrspace(1)* %ret_val
116merge:
117 %ret_val = phi i64 addrspace(1)* [%ret_val_left, %left], [%ret_val_right, %right]
118 ret i64 addrspace(1)* %ret_val
119
120; CHECK-LABEL: exceptional_return:
121; CHECK: ret i64 addrspace(1)*
122
123exceptional_return:
Sanjoy Dasf7302c82016-01-28 21:51:14 +0000124 %landing_pad4 = landingpad token
Igor Laevsky55d60a42015-02-19 11:39:04 +0000125 cleanup
126 ret i64 addrspace(1)* %obj
127}
128
129declare void @do_safepoint()
130define void @gc.safepoint_poll() {
131; CHECK-LABEL: gc.safepoint_poll
132; CHECK-LABEL: entry
133; CHECK-NEXT: do_safepoint
134; CHECK-NEXT: ret void
135entry:
136 call void @do_safepoint()
137 ret void
David Majnemer7fddecc2015-06-17 20:52:32 +0000138}