diff options
Diffstat (limited to 'llvm/test')
| -rw-r--r-- | llvm/test/Transforms/JumpThreading/phi-known.ll | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/llvm/test/Transforms/JumpThreading/phi-known.ll b/llvm/test/Transforms/JumpThreading/phi-known.ll new file mode 100644 index 00000000000..8eaf57f748a --- /dev/null +++ b/llvm/test/Transforms/JumpThreading/phi-known.ll @@ -0,0 +1,66 @@ +; RUN: opt -S -jump-threading %s | FileCheck %s + +; Value of predicate known on all inputs (trivial case) +; Note: InstCombine/EarlyCSE would also get this case +define void @test(i8* %p, i8** %addr) { +; CHECK-LABEL: @test +entry: + %cmp0 = icmp eq i8* %p, null + br i1 %cmp0, label %exit, label %loop +loop: +; CHECK-LABEL: loop: +; CHECK-NEXT: phi +; CHECK-NEXT: br label %loop + %p1 = phi i8* [%p, %entry], [%p1, %loop] + %cmp1 = icmp eq i8* %p1, null + br i1 %cmp1, label %exit, label %loop +exit: + ret void +} + +; Value of predicate known on all inputs (non-trivial) +define void @test2(i8* %p) { +; CHECK-LABEL: @test2 +entry: + %cmp0 = icmp eq i8* %p, null + br i1 %cmp0, label %exit, label %loop +loop: + %p1 = phi i8* [%p, %entry], [%p2, %backedge] + %cmp1 = icmp eq i8* %p1, null + br i1 %cmp1, label %exit, label %backedge +backedge: +; CHECK-LABEL: backedge: +; CHECK-NEXT: phi +; CHECK-NEXT: bitcast +; CHECK-NEXT: load +; CHECK-NEXT: cmp +; CHECK-NEXT: br +; CHECK-DAG: label %backedge + %addr = bitcast i8* %p1 to i8** + %p2 = load i8*, i8** %addr + %cmp2 = icmp eq i8* %p2, null + br i1 %cmp2, label %exit, label %loop +exit: + ret void +} + +; If the inputs don't branch the same way, we can't rewrite +; Well, we could unroll this loop exactly twice, but that's +; a different transform. +define void @test_mixed(i8* %p) { +; CHECK-LABEL: @test_mixed +entry: + %cmp0 = icmp eq i8* %p, null + br i1 %cmp0, label %exit, label %loop +loop: +; CHECK-LABEL: loop: +; CHECK-NEXT: phi +; CHECK-NEXT: %cmp1 = icmp +; CHECK-NEXT: br i1 %cmp1 + %p1 = phi i8* [%p, %entry], [%p1, %loop] + %cmp1 = icmp ne i8* %p1, null + br i1 %cmp1, label %exit, label %loop +exit: + ret void +} + |

