summaryrefslogtreecommitdiff
path: root/test/Analysis
diff options
context:
space:
mode:
authorBenjamin Kramer <benny.kra@googlemail.com>2014-03-25 16:25:12 +0000
committerBenjamin Kramer <benny.kra@googlemail.com>2014-03-25 16:25:12 +0000
commitc1c74fb2b4ae2bce68ff1587e3022a158297d936 (patch)
treeb53b807d49d8b158c78f907738a6689f8c64811a /test/Analysis
parent71a8d2baba951ad99baadd46f7738b9229fda91f (diff)
downloadllvm-c1c74fb2b4ae2bce68ff1587e3022a158297d936.tar.gz
llvm-c1c74fb2b4ae2bce68ff1587e3022a158297d936.tar.bz2
llvm-c1c74fb2b4ae2bce68ff1587e3022a158297d936.tar.xz
ScalarEvolution: Compute exit counts for loops with a power-of-2 step.
If we have a loop of the form for (unsigned n = 0; n != (k & -32); n += 32) {} then we know that n is always divisible by 32 and the loop must terminate. Even if we have a condition where the loop counter will overflow it'll always hold this invariant. PR19183. Our loop vectorizer creates this pattern and it's also occasionally formed by loop counters derived from pointers. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@204728 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test/Analysis')
-rw-r--r--test/Analysis/ScalarEvolution/trip-count-pow2.ll53
1 files changed, 53 insertions, 0 deletions
diff --git a/test/Analysis/ScalarEvolution/trip-count-pow2.ll b/test/Analysis/ScalarEvolution/trip-count-pow2.ll
new file mode 100644
index 0000000000..2c5b72e49d
--- /dev/null
+++ b/test/Analysis/ScalarEvolution/trip-count-pow2.ll
@@ -0,0 +1,53 @@
+; RUN: opt < %s -scalar-evolution -analyze | FileCheck %s
+
+define void @test1(i32 %n) {
+entry:
+ %s = mul i32 %n, 96
+ br label %loop
+loop:
+ %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
+ %i.next = add i32 %i, 32
+ %t = icmp ne i32 %i.next, %s
+ br i1 %t, label %loop, label %exit
+exit:
+ ret void
+
+; CHECK-LABEL: @test1
+; CHECK: Loop %loop: backedge-taken count is ((-32 + (96 * %n)) /u 32)
+; CHECK: Loop %loop: max backedge-taken count is ((-32 + (96 * %n)) /u 32)
+}
+
+; PR19183
+define i32 @test2(i32 %n) {
+entry:
+ %s = and i32 %n, -32
+ br label %loop
+loop:
+ %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
+ %i.next = add i32 %i, 32
+ %t = icmp ne i32 %i.next, %s
+ br i1 %t, label %loop, label %exit
+exit:
+ ret i32 %i
+
+; CHECK-LABEL: @test2
+; CHECK: Loop %loop: backedge-taken count is ((-32 + (32 * (%n /u 32))) /u 32)
+; CHECK: Loop %loop: max backedge-taken count is ((-32 + (32 * (%n /u 32))) /u 32)
+}
+
+define void @test3(i32 %n) {
+entry:
+ %s = mul i32 %n, 96
+ br label %loop
+loop:
+ %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
+ %i.next = add i32 %i, 96
+ %t = icmp ne i32 %i.next, %s
+ br i1 %t, label %loop, label %exit
+exit:
+ ret void
+
+; CHECK-LABEL: @test3
+; CHECK: Loop %loop: Unpredictable backedge-taken count.
+; CHECK: Loop %loop: Unpredictable max backedge-taken count.
+}