brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.8 KiB · c7057c8 Raw
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