blob: fcac3451bc8a91e5697cc8a740a0f9a3e2ff9861 [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
6define i64 addrspace(1)* @test_basic(i64 addrspace(1)* %obj, i64 addrspace(1)* %obj1) {
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 {i8*, i32} personality i32 ()* @"personality_function"
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) {
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 {i8*, i32} personality i32 ()* @"personality_function"
60 cleanup
61 ret i64 addrspace(1)* %obj1
62}
63
64define i64 addrspace(1)* @test_phi_node(i1 %cond, i64 addrspace(1)* %obj) {
65; CHECK-LABEL: entry:
66entry:
67 br i1 %cond, label %left, label %right
68
69left:
70 %ret_val_left = invoke i64 addrspace(1)* @"some_call"(i64 addrspace(1)* %obj)
71 to label %merge unwind label %exceptional_return
72
73right:
74 %ret_val_right = invoke i64 addrspace(1)* @"some_call"(i64 addrspace(1)* %obj)
75 to label %merge unwind label %exceptional_return
76
77; CHECK-LABEL: merge1:
78; CHECK: gc.result
79; CHECK: br label %merge
80
81; CHECK-LABEL: merge3:
82; CHECK: gc.result
83; CHECK: br label %merge
84
85; CHECK-LABEL: merge:
86; CHECK: phi
87; CHECK: ret i64 addrspace(1)* %ret_val
88merge:
89 %ret_val = phi i64 addrspace(1)* [%ret_val_left, %left], [%ret_val_right, %right]
90 ret i64 addrspace(1)* %ret_val
91
92; CHECK-LABEL: exceptional_return:
93; CHECK: ret i64 addrspace(1)*
94
95exceptional_return:
96 %landing_pad4 = landingpad {i8*, i32} personality i32 ()* @"personality_function"
97 cleanup
98 ret i64 addrspace(1)* %obj
99}
100
101declare void @do_safepoint()
102define void @gc.safepoint_poll() {
103; CHECK-LABEL: gc.safepoint_poll
104; CHECK-LABEL: entry
105; CHECK-NEXT: do_safepoint
106; CHECK-NEXT: ret void
107entry:
108 call void @do_safepoint()
109 ret void
110}