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