summaryrefslogtreecommitdiffstats
path: root/llvm/test
diff options
context:
space:
mode:
authorSanjoy Das <sanjoy@playingwithpointers.com>2014-10-15 19:25:28 +0000
committerSanjoy Das <sanjoy@playingwithpointers.com>2014-10-15 19:25:28 +0000
commit90c2f1455ae1e88aa31e68f4e7cdcdf955c945ed (patch)
treeadd8f3ca67de38efd5a3ee5741212f281e41f196 /llvm/test
parent74cd020fcaa1e5abd31fcbad1c0be0319a3bf790 (diff)
downloadbcm5719-llvm-90c2f1455ae1e88aa31e68f4e7cdcdf955c945ed.tar.gz
bcm5719-llvm-90c2f1455ae1e88aa31e68f4e7cdcdf955c945ed.zip
Teach ScalarEvolution to sharpen range information.
If x is known to have the range [a, b) in a loop predicated by (icmp ne x, a), its range can be sharpened to [a + 1, b). Get ScalarEvolution and hence IndVars to exploit this fact. This change triggers an optimization to widen-loop-comp.ll, so it had to be edited to get it to pass. phabricator: http://reviews.llvm.org/D5639 llvm-svn: 219834
Diffstat (limited to 'llvm/test')
-rw-r--r--llvm/test/Transforms/IndVarSimplify/sharpen-range-metadata.ll39
-rw-r--r--llvm/test/Transforms/IndVarSimplify/widen-loop-comp.ll3
2 files changed, 40 insertions, 2 deletions
diff --git a/llvm/test/Transforms/IndVarSimplify/sharpen-range-metadata.ll b/llvm/test/Transforms/IndVarSimplify/sharpen-range-metadata.ll
new file mode 100644
index 00000000000..5faafe6c47a
--- /dev/null
+++ b/llvm/test/Transforms/IndVarSimplify/sharpen-range-metadata.ll
@@ -0,0 +1,39 @@
+;; RUN: opt -S < %s -indvars | FileCheck %s
+
+;; Check if llvm can narrow !range metadata based on loop entry
+;; predicates.
+
+declare void @abort()
+
+define i1 @bounded_below(i32* nocapture readonly %buffer) {
+entry:
+ %length = load i32* %buffer, !range !0
+ %entry.pred = icmp eq i32 %length, 0
+ br i1 %entry.pred, label %abort, label %loop.preheader
+
+loop.preheader:
+ br label %loop
+
+loop:
+ %idx = phi i32 [ %idx.inc, %loop.next ], [ 0, %loop.preheader ]
+ %oob.pred = icmp slt i32 %idx, %length
+ br i1 %oob.pred, label %loop.next, label %oob
+; CHECK: br i1 true, label %loop.next, label %oob
+
+loop.next:
+ %idx.inc = add i32 %idx, 1
+ %exit.pred = icmp slt i32 %idx.inc, %length
+ br i1 %exit.pred, label %loop, label %abort.loopexit
+
+abort.loopexit:
+ br label %abort
+
+abort:
+ ret i1 false
+
+oob:
+ tail call void @abort()
+ ret i1 false
+}
+
+!0 = metadata !{i32 0, i32 100}
diff --git a/llvm/test/Transforms/IndVarSimplify/widen-loop-comp.ll b/llvm/test/Transforms/IndVarSimplify/widen-loop-comp.ll
index bfe74afe894..0930a0c4139 100644
--- a/llvm/test/Transforms/IndVarSimplify/widen-loop-comp.ll
+++ b/llvm/test/Transforms/IndVarSimplify/widen-loop-comp.ll
@@ -67,8 +67,7 @@ for.end:
define void @test2([8 x i8]* %a, i8* %b, i8 %limit) {
entry:
%conv = zext i8 %limit to i32
- %cmp23 = icmp eq i8 %limit, 0
- br i1 %cmp23, label %for.cond1.preheader, label %for.cond1.preheader.us
+ br i1 undef, label %for.cond1.preheader, label %for.cond1.preheader.us
for.cond1.preheader.us:
%storemerge5.us = phi i32 [ 0, %entry ], [ %inc14.us, %for.inc13.us ]
OpenPOWER on IntegriCloud