1; RUN: opt < %s -S -rewrite-statepoints-for-gc | 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) gc "statepoint-example" personality i32 ()* @personality_function { 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 token 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) gc "statepoint-example" personality i32 ()* @personality_function { 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 token 60 cleanup 61 ret i64 addrspace(1)* %obj1 62} 63 64define i64 addrspace(1)* @test_phi_node(i1 %cond, i64 addrspace(1)* %obj) gc "statepoint-example" personality i32 ()* @personality_function { 65; CHECK-LABEL: @test_phi_node 66; 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 78; CHECK: merge[[A:[0-9]]]: 79; CHECK: gc.result 80; CHECK: br label %[[with_phi:merge[0-9]*]] 81 82; CHECK: merge[[B:[0-9]]]: 83; CHECK: gc.result 84; CHECK: br label %[[with_phi]] 85 86; CHECK: [[with_phi]]: 87; 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 token 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} 112