blob: afcb6ad559de8d149ca900adbe51aacea3392995 [file] [log] [blame]
Sanjoy Das04071082016-01-29 00:28:57 +00001; RUN: opt < %s -S -rewrite-statepoints-for-gc | FileCheck %s
Igor Laevsky55d60a42015-02-19 11:39:04 +00002
Sanjoy Das52e67e72016-01-28 16:11:27 +00003declare i64 addrspace(1)* @some_call(i64 addrspace(1)*)
4declare i32 @personality_function()
Igor Laevsky55d60a42015-02-19 11:39:04 +00005
Sanjoy Das52e67e72016-01-28 16:11:27 +00006define 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 +00007; CHECK-LABEL: entry:
8entry:
9 ; CHECK: invoke
10 ; CHECK: statepoint
11 ; CHECK: some_call
Sanjoy Das52e67e72016-01-28 16:11:27 +000012 %ret_val = invoke i64 addrspace(1)* @some_call(i64 addrspace(1)* %obj)
Igor Laevsky55d60a42015-02-19 11:39:04 +000013 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:
Sanjoy Dasf7302c82016-01-28 21:51:14 +000027 %landing_pad4 = landingpad token
Igor Laevsky55d60a42015-02-19 11:39:04 +000028 cleanup
29 ret i64 addrspace(1)* %obj1
30}
31
Sanjoy Das52e67e72016-01-28 16:11:27 +000032define 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 +000033; CHECK-LABEL: entry:
34entry:
35 ; CHECK: invoke
36 ; CHECK: statepoint
37 ; CHECK: some_call
Sanjoy Das52e67e72016-01-28 16:11:27 +000038 %ret_val1 = invoke i64 addrspace(1)* @some_call(i64 addrspace(1)* %obj)
Igor Laevsky55d60a42015-02-19 11:39:04 +000039 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
Sanjoy Das52e67e72016-01-28 16:11:27 +000046 %ret_val2 = invoke i64 addrspace(1)* @some_call(i64 addrspace(1)* %ret_val1)
Igor Laevsky55d60a42015-02-19 11:39:04 +000047 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:
Sanjoy Dasf7302c82016-01-28 21:51:14 +000059 %landing_pad4 = landingpad token
Igor Laevsky55d60a42015-02-19 11:39:04 +000060 cleanup
61 ret i64 addrspace(1)* %obj1
62}
63
Sanjoy Das52e67e72016-01-28 16:11:27 +000064define 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 +000065; CHECK-LABEL: @test_phi_node
Igor Laevsky55d60a42015-02-19 11:39:04 +000066; CHECK-LABEL: entry:
67entry:
68 br i1 %cond, label %left, label %right
69
70left:
Sanjoy Das52e67e72016-01-28 16:11:27 +000071 %ret_val_left = invoke i64 addrspace(1)* @some_call(i64 addrspace(1)* %obj)
Igor Laevsky55d60a42015-02-19 11:39:04 +000072 to label %merge unwind label %exceptional_return
73
74right:
Sanjoy Das52e67e72016-01-28 16:11:27 +000075 %ret_val_right = invoke i64 addrspace(1)* @some_call(i64 addrspace(1)* %obj)
Igor Laevsky55d60a42015-02-19 11:39:04 +000076 to label %merge unwind label %exceptional_return
77
Sanjoy Dasabe1c682015-05-06 23:53:09 +000078; CHECK: merge[[A:[0-9]]]:
Igor Laevsky55d60a42015-02-19 11:39:04 +000079; CHECK: gc.result
Sanjoy Dasabe1c682015-05-06 23:53:09 +000080; CHECK: br label %[[with_phi:merge[0-9]*]]
Igor Laevsky55d60a42015-02-19 11:39:04 +000081
Sanjoy Dasabe1c682015-05-06 23:53:09 +000082; CHECK: merge[[B:[0-9]]]:
Igor Laevsky55d60a42015-02-19 11:39:04 +000083; CHECK: gc.result
Sanjoy Dasabe1c682015-05-06 23:53:09 +000084; CHECK: br label %[[with_phi]]
Igor Laevsky55d60a42015-02-19 11:39:04 +000085
Sanjoy Dasabe1c682015-05-06 23:53:09 +000086; CHECK: [[with_phi]]:
Igor Laevsky55d60a42015-02-19 11:39:04 +000087; 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:
Sanjoy Dasf7302c82016-01-28 21:51:14 +000097 %landing_pad4 = landingpad token
Igor Laevsky55d60a42015-02-19 11:39:04 +000098 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
David Majnemer7fddecc2015-06-17 20:52:32 +0000111}