blob: d9ebd3029138804ac898b7f01665620142c65fd0 [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
Sanjoy Das52e67e72016-01-28 16:11:27 +000033define 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 +000034; CHECK-LABEL: entry:
35entry:
36 ; CHECK: invoke
37 ; CHECK: statepoint
38 ; CHECK: some_call
Sanjoy Das52e67e72016-01-28 16:11:27 +000039 %ret_val1 = invoke i64 addrspace(1)* @some_call(i64 addrspace(1)* %obj)
Igor Laevsky55d60a42015-02-19 11:39:04 +000040 to label %second_invoke unwind label %exceptional_return
41
42; CHECK-LABEL: second_invoke:
43second_invoke:
44 ; CHECK: invoke
45 ; CHECK: statepoint
46 ; CHECK: some_call
Sanjoy Das52e67e72016-01-28 16:11:27 +000047 %ret_val2 = invoke i64 addrspace(1)* @some_call(i64 addrspace(1)* %ret_val1)
Igor Laevsky55d60a42015-02-19 11:39:04 +000048 to label %normal_return unwind label %exceptional_return
49
50; CHECK-LABEL: normal_return:
51normal_return:
52 ; CHECK: gc.result
53 ; CHECK: ret i64
54 ret i64 addrspace(1)* %ret_val2
55
56; CHECK: exceptional_return:
57; CHECK: ret i64
58
59exceptional_return:
Sanjoy Dasf7302c82016-01-28 21:51:14 +000060 %landing_pad4 = landingpad token
Igor Laevsky55d60a42015-02-19 11:39:04 +000061 cleanup
62 ret i64 addrspace(1)* %obj1
63}
64
Sanjoy Das52e67e72016-01-28 16:11:27 +000065define 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 +000066; CHECK-LABEL: @test_phi_node
Igor Laevsky55d60a42015-02-19 11:39:04 +000067; CHECK-LABEL: entry:
68entry:
69 br i1 %cond, label %left, label %right
70
71left:
Sanjoy Das52e67e72016-01-28 16:11:27 +000072 %ret_val_left = invoke i64 addrspace(1)* @some_call(i64 addrspace(1)* %obj)
Igor Laevsky55d60a42015-02-19 11:39:04 +000073 to label %merge unwind label %exceptional_return
74
75right:
Sanjoy Das52e67e72016-01-28 16:11:27 +000076 %ret_val_right = invoke i64 addrspace(1)* @some_call(i64 addrspace(1)* %obj)
Igor Laevsky55d60a42015-02-19 11:39:04 +000077 to label %merge unwind label %exceptional_return
78
Sanjoy Dasabe1c682015-05-06 23:53:09 +000079; CHECK: merge[[A:[0-9]]]:
Igor Laevsky55d60a42015-02-19 11:39:04 +000080; CHECK: gc.result
Sanjoy Dasabe1c682015-05-06 23:53:09 +000081; CHECK: br label %[[with_phi:merge[0-9]*]]
Igor Laevsky55d60a42015-02-19 11:39:04 +000082
Sanjoy Dasabe1c682015-05-06 23:53:09 +000083; CHECK: merge[[B:[0-9]]]:
Igor Laevsky55d60a42015-02-19 11:39:04 +000084; CHECK: gc.result
Sanjoy Dasabe1c682015-05-06 23:53:09 +000085; CHECK: br label %[[with_phi]]
Igor Laevsky55d60a42015-02-19 11:39:04 +000086
Sanjoy Dasabe1c682015-05-06 23:53:09 +000087; CHECK: [[with_phi]]:
Igor Laevsky55d60a42015-02-19 11:39:04 +000088; CHECK: phi
89; CHECK: ret i64 addrspace(1)* %ret_val
90merge:
91 %ret_val = phi i64 addrspace(1)* [%ret_val_left, %left], [%ret_val_right, %right]
92 ret i64 addrspace(1)* %ret_val
93
94; CHECK-LABEL: exceptional_return:
95; CHECK: ret i64 addrspace(1)*
96
97exceptional_return:
Sanjoy Dasf7302c82016-01-28 21:51:14 +000098 %landing_pad4 = landingpad token
Igor Laevsky55d60a42015-02-19 11:39:04 +000099 cleanup
100 ret i64 addrspace(1)* %obj
101}
102
103declare void @do_safepoint()
104define void @gc.safepoint_poll() {
105; CHECK-LABEL: gc.safepoint_poll
106; CHECK-LABEL: entry
107; CHECK-NEXT: do_safepoint
108; CHECK-NEXT: ret void
109entry:
110 call void @do_safepoint()
111 ret void
David Majnemer7fddecc2015-06-17 20:52:32 +0000112}