138 lines · plain
1; RUN: opt < %s -S -passes=rewrite-statepoints-for-gc | FileCheck %s2 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: invoke10 ; CHECK: statepoint11 ; CHECK: some_call12 %ret_val = invoke ptr addrspace(1) @some_call(ptr addrspace(1) %obj)13 to label %normal_return unwind label %exceptional_return14 15; CHECK-LABEL: normal_return:16; CHECK: gc.result17; CHECK: ret ptr18 19normal_return:20 ret ptr addrspace(1) %ret_val21 22; CHECK-LABEL: exceptional_return:23; CHECK: landingpad24; CHECK: ret ptr25 26exceptional_return:27 %landing_pad4 = landingpad token28 cleanup29 ret ptr addrspace(1) %obj130}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_vector36entry:37; CHECK: invoke{{.*}}llvm.experimental.gc.statepoint{{.*}}some_vector_call38 %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_return40 41; CHECK-LABEL: normal_return:42; CHECK: gc.result43; CHECK: ret <4 x ptr addrspace(1)>44 45normal_return:46 ret <4 x ptr addrspace(1)> %ret_val47 48; CHECK-LABEL: exceptional_return:49; CHECK: landingpad50; CHECK: ret <4 x ptr addrspace(1)>51 52exceptional_return:53 %landing_pad4 = landingpad token54 cleanup55 ret <4 x ptr addrspace(1)> %objs156}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: invoke62 ; CHECK: statepoint63 ; CHECK: some_call64 %ret_val1 = invoke ptr addrspace(1) @some_call(ptr addrspace(1) %obj)65 to label %second_invoke unwind label %exceptional_return66 67; CHECK-LABEL: second_invoke:68second_invoke:69 ; CHECK: invoke70 ; CHECK: statepoint71 ; CHECK: some_call72 %ret_val2 = invoke ptr addrspace(1) @some_call(ptr addrspace(1) %ret_val1)73 to label %normal_return unwind label %exceptional_return74 75; CHECK-LABEL: normal_return:76normal_return:77 ; CHECK: gc.result78 ; CHECK: ret ptr79 ret ptr addrspace(1) %ret_val280 81; CHECK: exceptional_return:82; CHECK: ret ptr83 84exceptional_return:85 %landing_pad4 = landingpad token86 cleanup87 ret ptr addrspace(1) %obj188}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_node92; CHECK-LABEL: entry:93entry:94 br i1 %cond, label %left, label %right95 96left:97 %ret_val_left = invoke ptr addrspace(1) @some_call(ptr addrspace(1) %obj)98 to label %merge unwind label %exceptional_return99 100right:101 %ret_val_right = invoke ptr addrspace(1) @some_call(ptr addrspace(1) %obj)102 to label %merge unwind label %exceptional_return103 104; CHECK: merge[[A:[0-9]]]:105; CHECK: gc.result106; CHECK: br label %[[with_phi:merge[0-9]*]]107 108; CHECK: merge[[B:[0-9]]]:109; CHECK: gc.result110; CHECK: br label %[[with_phi]]111 112; CHECK: [[with_phi]]:113; CHECK: phi114; CHECK: ret ptr addrspace(1) %ret_val115merge:116 %ret_val = phi ptr addrspace(1) [%ret_val_left, %left], [%ret_val_right, %right]117 ret ptr addrspace(1) %ret_val118 119; CHECK-LABEL: exceptional_return:120; CHECK: ret ptr addrspace(1)121 122exceptional_return:123 %landing_pad4 = landingpad token124 cleanup125 ret ptr addrspace(1) %obj126}127 128declare void @do_safepoint()129define void @gc.safepoint_poll() {130; CHECK-LABEL: gc.safepoint_poll131; CHECK-LABEL: entry132; CHECK-NEXT: do_safepoint133; CHECK-NEXT: ret void134entry:135 call void @do_safepoint()136 ret void137}138