diff options
Diffstat (limited to 'llvm/test/Transforms/RewriteStatepointsForGC/preprocess.ll')
-rw-r--r-- | llvm/test/Transforms/RewriteStatepointsForGC/preprocess.ll | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/llvm/test/Transforms/RewriteStatepointsForGC/preprocess.ll b/llvm/test/Transforms/RewriteStatepointsForGC/preprocess.ll new file mode 100644 index 00000000000..105e0e88ac2 --- /dev/null +++ b/llvm/test/Transforms/RewriteStatepointsForGC/preprocess.ll @@ -0,0 +1,63 @@ +; RUN: opt -rewrite-statepoints-for-gc -S < %s | FileCheck %s +; RUN: opt -passes=rewrite-statepoints-for-gc -S < %s | FileCheck %s + +; 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: ; 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 void @foo() [ "deopt"() ] + call void (...) @consume(i64 addrspace(1)* %obj2) + call void (...) @consume(i64 addrspace(1)* %obj) + ret void +} + +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: ; preds = %unreached + %obj = phi i64 addrspace(1)* [ null, %unreached ] + call void @foo() [ "deopt"() ] + call void (...) @consume(i64 addrspace(1)* %obj) + br label %unreached +} + +define void @test8() gc "statepoint-example" personality i32 ()* undef { +; CHECK-LABEL: test8 +; CHECK-NOT: gc.statepoint +; Bound the last check-not + ret void + +unreached: ; No predecessors! + invoke void @foo() [ "deopt"() ] +; CHECK-LABEL: @foo + to label %normal_return unwind label %exceptional_return + +normal_return: ; preds = %unreached + ret void + +exceptional_return: ; preds = %unreached + %landing_pad4 = landingpad { i8*, i32 } + cleanup + ret void +} + +declare void @foo() |