diff options
Diffstat (limited to 'llvm/test/Transforms/RewriteStatepointsForGC')
-rw-r--r-- | llvm/test/Transforms/RewriteStatepointsForGC/codegen-cond.ll | 74 |
1 files changed, 74 insertions, 0 deletions
diff --git a/llvm/test/Transforms/RewriteStatepointsForGC/codegen-cond.ll b/llvm/test/Transforms/RewriteStatepointsForGC/codegen-cond.ll new file mode 100644 index 00000000000..9698537280b --- /dev/null +++ b/llvm/test/Transforms/RewriteStatepointsForGC/codegen-cond.ll @@ -0,0 +1,74 @@ +; RUN: opt -rewrite-statepoints-for-gc -S < %s | FileCheck %s + +; A null test of a single value +define i1 @test(i8 addrspace(1)* %p, i1 %rare) gc "statepoint-example" { +; CHECK-LABEL: @test +entry: + %cond = icmp eq i8 addrspace(1)* %p, null + br i1 %rare, label %safepoint, label %continue, !prof !0 +safepoint: + call i32 (i64, i32, void ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_isVoidf(i64 2882400000, i32 0, void ()* @safepoint, i32 0, i32 0, i32 0, i32 0) + br label %continue +continue: +; CHECK-LABEL: continue: +; CHECK: phi +; CHECK-DAG: [ %p.relocated, %safepoint ] +; CHECK-DAG [ %p, %entry ] +; CHECK: %cond = icmp +; CHECK: br i1 %cond + br i1 %cond, label %taken, label %untaken +taken: + ret i1 true +untaken: + ret i1 false +} + +; Comparing two pointers +define i1 @test2(i8 addrspace(1)* %p, i8 addrspace(1)* %q, i1 %rare) + gc "statepoint-example" { +; CHECK-LABEL: @test2 +entry: + %cond = icmp eq i8 addrspace(1)* %p, %q + br i1 %rare, label %safepoint, label %continue, !prof !0 +safepoint: + call i32 (i64, i32, void ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_isVoidf(i64 2882400000, i32 0, void ()* @safepoint, i32 0, i32 0, i32 0, i32 0) + br label %continue +continue: +; CHECK-LABEL: continue: +; CHECK: phi +; CHECK-DAG: [ %q.relocated, %safepoint ] +; CHECK-DAG [ %q, %entry ] +; CHECK: phi +; CHECK-DAG: [ %p.relocated, %safepoint ] +; CHECK-DAG [ %p, %entry ] +; CHECK: %cond = icmp +; CHECK: br i1 %cond + br i1 %cond, label %taken, label %untaken +taken: + ret i1 true +untaken: + ret i1 false +} + +; Sanity check that nothing bad happens if already last instruction +; before terminator +define i1 @test3(i8 addrspace(1)* %p, i8 addrspace(1)* %q, i1 %rare) + gc "statepoint-example" { +; CHECK-LABEL: @test3 +entry: + call i32 (i64, i32, void ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_isVoidf(i64 2882400000, i32 0, void ()* @safepoint, i32 0, i32 0, i32 0, i32 0) +; CHECK: gc.statepoint +; CHECK: %cond = icmp +; CHECK: br i1 %cond + %cond = icmp eq i8 addrspace(1)* %p, %q + br i1 %cond, label %taken, label %untaken +taken: + ret i1 true +untaken: + ret i1 false +} + +declare void @safepoint() +declare i32 @llvm.experimental.gc.statepoint.p0f_isVoidf(i64, i32, void ()*, i32, i32, ...) + +!0 = !{!"branch_weights", i32 1, i32 10000} |