diff options
author | Igor Laevsky <igmyrj@gmail.com> | 2015-02-19 11:39:04 +0000 |
---|---|---|
committer | Igor Laevsky <igmyrj@gmail.com> | 2015-02-19 11:39:04 +0000 |
commit | 55d60a4a2fea4dadf9c1c8d0c43cc56d0894e8b3 (patch) | |
tree | d46968ccc29fe5ac6f31bdd4ae71a429c18c042a | |
parent | efd7a96d2e8ff886fb2a1bc755dd6355b2bb5f17 (diff) | |
download | bcm5719-llvm-55d60a4a2fea4dadf9c1c8d0c43cc56d0894e8b3.tar.gz bcm5719-llvm-55d60a4a2fea4dadf9c1c8d0c43cc56d0894e8b3.zip |
Add few simple tests to check statepoint placement for invoke instructions.
Differential Revision: http://reviews.llvm.org/D7535
llvm-svn: 229842
-rw-r--r-- | llvm/test/Transforms/PlaceSafepoints/invokes.ll | 110 |
1 files changed, 110 insertions, 0 deletions
diff --git a/llvm/test/Transforms/PlaceSafepoints/invokes.ll b/llvm/test/Transforms/PlaceSafepoints/invokes.ll new file mode 100644 index 00000000000..fcac3451bc8 --- /dev/null +++ b/llvm/test/Transforms/PlaceSafepoints/invokes.ll @@ -0,0 +1,110 @@ +; RUN: opt %s -S -place-safepoints | FileCheck %s + +declare i64 addrspace(1)* @"some_call"(i64 addrspace(1)*) +declare i32 @"personality_function"() + +define i64 addrspace(1)* @test_basic(i64 addrspace(1)* %obj, i64 addrspace(1)* %obj1) { +; CHECK-LABEL: entry: +entry: + ; CHECK: invoke + ; CHECK: statepoint + ; CHECK: some_call + %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)* @test_two_invokes(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 +} + +define i64 addrspace(1)* @test_phi_node(i1 %cond, i64 addrspace(1)* %obj) { +; CHECK-LABEL: entry: +entry: + br i1 %cond, label %left, label %right + +left: + %ret_val_left = invoke i64 addrspace(1)* @"some_call"(i64 addrspace(1)* %obj) + to label %merge unwind label %exceptional_return + +right: + %ret_val_right = invoke i64 addrspace(1)* @"some_call"(i64 addrspace(1)* %obj) + to label %merge unwind label %exceptional_return + +; CHECK-LABEL: merge1: +; CHECK: gc.result +; CHECK: br label %merge + +; CHECK-LABEL: merge3: +; CHECK: gc.result +; CHECK: br label %merge + +; CHECK-LABEL: merge: +; CHECK: phi +; CHECK: ret i64 addrspace(1)* %ret_val +merge: + %ret_val = phi i64 addrspace(1)* [%ret_val_left, %left], [%ret_val_right, %right] + ret i64 addrspace(1)* %ret_val + +; CHECK-LABEL: exceptional_return: +; CHECK: ret i64 addrspace(1)* + +exceptional_return: + %landing_pad4 = landingpad {i8*, i32} personality i32 ()* @"personality_function" + cleanup + ret i64 addrspace(1)* %obj +} + +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 +} |