Index: test/Transforms/PlaceSafepoints/invokes.ll =================================================================== --- /dev/null +++ test/Transforms/PlaceSafepoints/invokes.ll @@ -0,0 +1,74 @@ +; RUN: opt %s -S -place-safepoints | FileCheck %s + +; ModuleID = '' + +declare i64 addrspace(1)* @"some_call"(i64 addrspace(1)*) +declare i32 @"personality_function"() + +define i64 addrspace(1)* @test1(i32 %phantom, i64 addrspace(1)* %obj, i64 addrspace(1)* %obj1) { +; CHECK-LABEL: entry: +entry: + ; CHECK: invoke + ; CHECK: statepoint + %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 {i8*, i32} personality i32 ()* @"personality_function" + cleanup + ret i64 addrspace(1)* %obj1 +} + +define i64 addrspace(1)* @test2(i32 %phantom, i64 addrspace(1)* %obj, i64 addrspace(1)* %obj1) { +; 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 {i8*, i32} personality i32 ()* @"personality_function" + cleanup + ret i64 addrspace(1)* %obj1 +} + +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 +}