diff options
Diffstat (limited to 'llvm/test/Transforms/RewriteStatepointsForGC/preprocess.ll')
-rw-r--r-- | llvm/test/Transforms/RewriteStatepointsForGC/preprocess.ll | 37 |
1 files changed, 17 insertions, 20 deletions
diff --git a/llvm/test/Transforms/RewriteStatepointsForGC/preprocess.ll b/llvm/test/Transforms/RewriteStatepointsForGC/preprocess.ll index e1657497485..df42eb14cfd 100644 --- a/llvm/test/Transforms/RewriteStatepointsForGC/preprocess.ll +++ b/llvm/test/Transforms/RewriteStatepointsForGC/preprocess.ll @@ -1,65 +1,62 @@ ; RUN: opt -rewrite-statepoints-for-gc -S < %s | FileCheck %s -declare void @consume(...) - ; Test to make sure we destroy LCSSA's single entry phi nodes before ; running liveness + +declare void @consume(...) "gc-leaf-function" + define void @test6(i64 addrspace(1)* %obj) gc "statepoint-example" { ; CHECK-LABEL: @test6 entry: br label %next -next: +next: ; preds = %entry ; CHECK-LABEL: next: ; CHECK-NEXT: gc.statepoint ; CHECK-NEXT: gc.relocate ; CHECK-NEXT: bitcast ; CHECK-NEXT: @consume(i64 addrspace(1)* %obj.relocated.casted) ; CHECK-NEXT: @consume(i64 addrspace(1)* %obj.relocated.casted) +; Need to delete unreachable gc.statepoint call %obj2 = phi i64 addrspace(1)* [ %obj, %entry ] - call token (i64, i32, void ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_isVoidf(i64 0, i32 0, void ()* @foo, i32 0, i32 0, i32 0, i32 0) + call void @foo() [ "deopt"() ] call void (...) @consume(i64 addrspace(1)* %obj2) call void (...) @consume(i64 addrspace(1)* %obj) ret void } -declare void @some_call(i64 addrspace(1)*) - -; Need to delete unreachable gc.statepoint call define void @test7() gc "statepoint-example" { ; CHECK-LABEL: test7 ; CHECK-NOT: gc.statepoint +; Need to delete unreachable gc.statepoint invoke - tested seperately given +; a correct implementation could only remove the instructions, not the block ret void -unreached: - %obj = phi i64 addrspace(1)* [null, %unreached] - call token (i64, i32, void ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_isVoidf(i64 0, i32 0, void ()* @foo, i32 0, i32 0, i32 0, i32 0) +unreached: ; preds = %unreached + %obj = phi i64 addrspace(1)* [ null, %unreached ] + call void @foo() [ "deopt"() ] call void (...) @consume(i64 addrspace(1)* %obj) br label %unreached } -; Need to delete unreachable gc.statepoint invoke - tested seperately given -; a correct implementation could only remove the instructions, not the block define void @test8() gc "statepoint-example" personality i32 ()* undef { ; CHECK-LABEL: test8 ; CHECK-NOT: gc.statepoint +; Bound the last check-not ret void -unreached: - invoke token (i64, i32, void ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_isVoidf(i64 0, i32 0, void ()* @foo, i32 0, i32 0, i32 0, i32 0) +unreached: ; No predecessors! + invoke void @foo() [ "deopt"() ] +; CHECK-LABEL: @foo to label %normal_return unwind label %exceptional_return -normal_return: ; preds = %entry +normal_return: ; preds = %unreached ret void -exceptional_return: ; preds = %entry +exceptional_return: ; preds = %unreached %landing_pad4 = landingpad { i8*, i32 } cleanup ret void } declare void @foo() -; Bound the last check-not -; CHECK-LABEL: @foo - -declare token @llvm.experimental.gc.statepoint.p0f_isVoidf(i64, i32, void ()*, i32, i32, ...) |