blob: f91f845b13992c75e2a85c31005fc5188468198e [file] [log] [blame]
Igor Laevsky55d60a42015-02-19 11:39:04 +00001; RUN: opt %s -S -place-safepoints | FileCheck %s
2
3declare i64 addrspace(1)* @"some_call"(i64 addrspace(1)*)
4declare i32 @"personality_function"()
5
Philip Reames0b1b3872015-02-21 00:09:09 +00006define i64 addrspace(1)* @test_basic(i64 addrspace(1)* %obj, i64 addrspace(1)* %obj1) gc "statepoint-example" {
Igor Laevsky55d60a42015-02-19 11:39:04 +00007; 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 {i8*, i32} personality i32 ()* @"personality_function"
28 cleanup
29 ret i64 addrspace(1)* %obj1
30}
31
Philip Reames0b1b3872015-02-21 00:09:09 +000032define i64 addrspace(1)* @test_two_invokes(i64 addrspace(1)* %obj, i64 addrspace(1)* %obj1) gc "statepoint-example" {
Igor Laevsky55d60a42015-02-19 11:39:04 +000033; 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 {i8*, i32} personality i32 ()* @"personality_function"
60 cleanup
61 ret i64 addrspace(1)* %obj1
62}
63
Philip Reames0b1b3872015-02-21 00:09:09 +000064define i64 addrspace(1)* @test_phi_node(i1 %cond, i64 addrspace(1)* %obj) gc "statepoint-example" {
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:
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
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:
97 %landing_pad4 = landingpad {i8*, i32} personality i32 ()* @"personality_function"
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}