diff options
Diffstat (limited to 'llvm/test/Transforms/RewriteStatepointsForGC/codegen-cond.ll')
| -rw-r--r-- | llvm/test/Transforms/RewriteStatepointsForGC/codegen-cond.ll | 82 |
1 files changed, 82 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..74fd5b9a517 --- /dev/null +++ b/llvm/test/Transforms/RewriteStatepointsForGC/codegen-cond.ll @@ -0,0 +1,82 @@ +; RUN: opt -rewrite-statepoints-for-gc -S < %s | FileCheck %s +; RUN: opt -passes=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: ; preds = %entry + call void @safepoint() [ "deopt"() ] + br label %continue + +continue: ; preds = %safepoint, %entry +; CHECK-LABEL: continue: +; CHECK: phi +; CHECK-DAG: [ %p.relocated, %safepoint ] +; CHECK-DAG: [ %p, %entry ] +; CHECK: %cond = icmp +; CHECK: br i1 %cond +; Comparing two pointers + br i1 %cond, label %taken, label %untaken + +taken: ; preds = %continue + ret i1 true + +untaken: ; preds = %continue + ret i1 false +} + +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: ; preds = %entry + call void @safepoint() [ "deopt"() ] + br label %continue + +continue: ; preds = %safepoint, %entry +; 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 +; Sanity check that nothing bad happens if already last instruction +; before terminator + br i1 %cond, label %taken, label %untaken + +taken: ; preds = %continue + ret i1 true + +untaken: ; preds = %continue + ret i1 false +} + +define i1 @test3(i8 addrspace(1)* %p, i8 addrspace(1)* %q, i1 %rare) gc "statepoint-example" { +; CHECK-LABEL: @test3 +; CHECK: gc.statepoint +; CHECK: %cond = icmp +; CHECK: br i1 %cond +entry: + call void @safepoint() [ "deopt"() ] + %cond = icmp eq i8 addrspace(1)* %p, %q + br i1 %cond, label %taken, label %untaken + +taken: ; preds = %entry + ret i1 true + +untaken: ; preds = %entry + ret i1 false +} + +declare void @safepoint() +!0 = !{!"branch_weights", i32 1, i32 10000} |

