1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138
|
; RUN: opt < %s -S -rewrite-statepoints-for-gc | FileCheck %s
; RUN: opt < %s -S -passes=rewrite-statepoints-for-gc | FileCheck %s
declare i64 addrspace(1)* @some_call(i64 addrspace(1)*)
declare i32 @personality_function()
define i64 addrspace(1)* @test_basic(i64 addrspace(1)* %obj, i64 addrspace(1)* %obj1) gc "statepoint-example" personality i32 ()* @personality_function {
; CHECK-LABEL: entry:
entry:
; CHECK: invoke
; CHECK: statepoint
; CHECK: some_call
%ret_val = invoke i64 addrspace(1)* @some_call(i64 addrspace(1)* %obj)
to label %normal_return unwind label %exceptional_return
; CHECK-LABEL: normal_return:
; CHECK: gc.result
; CHECK: ret i64
normal_return:
ret i64 addrspace(1)* %ret_val
; CHECK-LABEL: exceptional_return:
; CHECK: landingpad
; CHECK: ret i64
exceptional_return:
%landing_pad4 = landingpad token
cleanup
ret i64 addrspace(1)* %obj1
}
declare <4 x i64 addrspace(1)*> @some_vector_call(<4 x i64 addrspace(1)*>)
define <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 {
; CHECK-LABEL: @test_basic_vector
entry:
; CHECK: invoke{{.*}}llvm.experimental.gc.statepoint{{.*}}some_vector_call
%ret_val = invoke <4 x i64 addrspace(1)*> @some_vector_call(<4 x i64 addrspace(1)*> %objs)
to label %normal_return unwind label %exceptional_return
; CHECK-LABEL: normal_return:
; CHECK: gc.result
; CHECK: ret <4 x i64 addrspace(1)*>
normal_return:
ret <4 x i64 addrspace(1)*> %ret_val
; CHECK-LABEL: exceptional_return:
; CHECK: landingpad
; CHECK: ret <4 x i64 addrspace(1)*>
exceptional_return:
%landing_pad4 = landingpad token
cleanup
ret <4 x i64 addrspace(1)*> %objs1
}
define i64 addrspace(1)* @test_two_invokes(i64 addrspace(1)* %obj, i64 addrspace(1)* %obj1) gc "statepoint-example" personality i32 ()* @personality_function {
; CHECK-LABEL: entry:
entry:
; CHECK: invoke
; CHECK: statepoint
; CHECK: some_call
%ret_val1 = invoke i64 addrspace(1)* @some_call(i64 addrspace(1)* %obj)
to label %second_invoke unwind label %exceptional_return
; CHECK-LABEL: second_invoke:
second_invoke:
; CHECK: invoke
; CHECK: statepoint
; CHECK: some_call
%ret_val2 = invoke i64 addrspace(1)* @some_call(i64 addrspace(1)* %ret_val1)
to label %normal_return unwind label %exceptional_return
; CHECK-LABEL: normal_return:
normal_return:
; CHECK: gc.result
; CHECK: ret i64
ret i64 addrspace(1)* %ret_val2
; CHECK: exceptional_return:
; CHECK: ret i64
exceptional_return:
%landing_pad4 = landingpad token
cleanup
ret i64 addrspace(1)* %obj1
}
define i64 addrspace(1)* @test_phi_node(i1 %cond, i64 addrspace(1)* %obj) gc "statepoint-example" personality i32 ()* @personality_function {
; CHECK-LABEL: @test_phi_node
; CHECK-LABEL: entry:
entry:
br i1 %cond, label %left, label %right
left:
%ret_val_left = invoke i64 addrspace(1)* @some_call(i64 addrspace(1)* %obj)
to label %merge unwind label %exceptional_return
right:
%ret_val_right = invoke i64 addrspace(1)* @some_call(i64 addrspace(1)* %obj)
to label %merge unwind label %exceptional_return
; CHECK: merge[[A:[0-9]]]:
; CHECK: gc.result
; CHECK: br label %[[with_phi:merge[0-9]*]]
; CHECK: merge[[B:[0-9]]]:
; CHECK: gc.result
; CHECK: br label %[[with_phi]]
; CHECK: [[with_phi]]:
; CHECK: phi
; CHECK: ret i64 addrspace(1)* %ret_val
merge:
%ret_val = phi i64 addrspace(1)* [%ret_val_left, %left], [%ret_val_right, %right]
ret i64 addrspace(1)* %ret_val
; CHECK-LABEL: exceptional_return:
; CHECK: ret i64 addrspace(1)*
exceptional_return:
%landing_pad4 = landingpad token
cleanup
ret i64 addrspace(1)* %obj
}
declare void @do_safepoint()
define void @gc.safepoint_poll() {
; CHECK-LABEL: gc.safepoint_poll
; CHECK-LABEL: entry
; CHECK-NEXT: do_safepoint
; CHECK-NEXT: ret void
entry:
call void @do_safepoint()
ret void
}
|