diff options
author | Sanjoy Das <sanjoy@playingwithpointers.com> | 2015-10-02 18:50:30 +0000 |
---|---|---|
committer | Sanjoy Das <sanjoy@playingwithpointers.com> | 2015-10-02 18:50:30 +0000 |
commit | 7d910f2b115eded4212e2d67e9265c1a929c2000 (patch) | |
tree | bc8923305957fa54a7b7e32ac69fcb1cd8a5282f /llvm/test | |
parent | a994b0b27314668f5bcddaf8ba166c531ddb797c (diff) | |
download | bcm5719-llvm-7d910f2b115eded4212e2d67e9265c1a929c2000.tar.gz bcm5719-llvm-7d910f2b115eded4212e2d67e9265c1a929c2000.zip |
[SCEV] Try to prove predicates by splitting them
Summary:
This change teaches SCEV that to prove `A u< B` it is sufficient to
prove each of these facts individually:
- B >= 0
- A s< B
- A >= 0
In practice, SCEV sometimes finds it easier to prove these facts
individually than to prove `A u< B` as one atomic step.
Reviewers: reames, atrick, nlewycky, hfinkel
Subscribers: sanjoy, llvm-commits
Differential Revision: http://reviews.llvm.org/D13042
llvm-svn: 249168
Diffstat (limited to 'llvm/test')
-rw-r--r-- | llvm/test/Transforms/IndVarSimplify/eliminate-comparison.ll | 83 |
1 files changed, 83 insertions, 0 deletions
diff --git a/llvm/test/Transforms/IndVarSimplify/eliminate-comparison.ll b/llvm/test/Transforms/IndVarSimplify/eliminate-comparison.ll index 957ebb7cfbf..177e0f74da6 100644 --- a/llvm/test/Transforms/IndVarSimplify/eliminate-comparison.ll +++ b/llvm/test/Transforms/IndVarSimplify/eliminate-comparison.ll @@ -394,4 +394,87 @@ bb3: ret i1 true } +define void @func_19(i32* %length.ptr) { +; CHECK-LABEL: @func_19( + entry: + %length = load i32, i32* %length.ptr, !range !0 + %length.is.nonzero = icmp ne i32 %length, 0 + br i1 %length.is.nonzero, label %loop, label %leave + + loop: +; CHECK: loop: + %iv = phi i32 [ 0, %entry ], [ %iv.inc, %be ] + %iv.inc = add i32 %iv, 1 + %range.check = icmp ult i32 %iv, %length + br i1 %range.check, label %be, label %leave +; CHECK: br i1 true, label %be, label %leave.loopexit +; CHECK: be: + + be: + call void @side_effect() + %be.cond = icmp slt i32 %iv.inc, %length + br i1 %be.cond, label %loop, label %leave + + leave: + ret void +} + +define void @func_20(i32* %length.ptr) { +; Like @func_19, but %length is no longer provably positive, so +; %range.check cannot be proved to be always true. + +; CHECK-LABEL: @func_20( + entry: + %length = load i32, i32* %length.ptr + %length.is.nonzero = icmp ne i32 %length, 0 + br i1 %length.is.nonzero, label %loop, label %leave + + loop: +; CHECK: loop: + %iv = phi i32 [ 0, %entry ], [ %iv.inc, %be ] + %iv.inc = add i32 %iv, 1 + %range.check = icmp ult i32 %iv, %length + br i1 %range.check, label %be, label %leave +; CHECK: br i1 %range.check, label %be, label %leave.loopexit +; CHECK: be: + + be: + call void @side_effect() + %be.cond = icmp slt i32 %iv.inc, %length + br i1 %be.cond, label %loop, label %leave + + leave: + ret void +} + +define void @func_21(i32* %length.ptr, i32 %init) { +; Like @func_19, but it is no longer possible to prove %iv's start +; value is positive without doing some control flow analysis. + +; CHECK-LABEL: @func_21( + entry: + %length = load i32, i32* %length.ptr, !range !0 + %length.is.nonzero = icmp ne i32 %length, 0 + %init.is.positive = icmp sgt i32 %init, 0 + %entry.cond = and i1 %length.is.nonzero, %init.is.positive + br i1 %length.is.nonzero, label %loop, label %leave + + loop: +; CHECK: loop: + %iv = phi i32 [ 0, %entry ], [ %iv.inc, %be ] + %iv.inc = add i32 %iv, 1 + %range.check = icmp ult i32 %iv, %length + br i1 %range.check, label %be, label %leave +; CHECK: br i1 true, label %be, label %leave.loopexit +; CHECK: be: + + be: + call void @side_effect() + %be.cond = icmp slt i32 %iv.inc, %length + br i1 %be.cond, label %loop, label %leave + + leave: + ret void +} + !0 = !{i32 0, i32 2147483647} |