diff options
author | Sanjoy Das <sanjoy@playingwithpointers.com> | 2016-06-18 04:38:31 +0000 |
---|---|---|
committer | Sanjoy Das <sanjoy@playingwithpointers.com> | 2016-06-18 04:38:31 +0000 |
commit | e8fd9561cb16d9d8398276e8c4ca836199b7699c (patch) | |
tree | 87338a5f276ac96b69740a92fa8c45a4d14dd75f /llvm/test/Transforms/LoopUnroll | |
parent | dc62be191503c932a2025b2489c2da0c55d46ec3 (diff) | |
download | bcm5719-llvm-e8fd9561cb16d9d8398276e8c4ca836199b7699c.tar.gz bcm5719-llvm-e8fd9561cb16d9d8398276e8c4ca836199b7699c.zip |
[SCEV] Fix incorrect trip count computation
The way we elide max expressions when computing trip counts is incorrect
-- it breaks cases like this:
```
static int wrapping_add(int a, int b) {
return (int)((unsigned)a + (unsigned)b);
}
void test() {
volatile int end_buf = 2147483548; // INT_MIN - 100
int end = end_buf;
unsigned counter = 0;
for (int start = wrapping_add(end, 200); start < end; start++)
counter++;
print(counter);
}
```
Note: the `NoWrap` variable that was being tested has little to do with
the values flowing into the max expression; it is a property of the
induction variable.
test/Transforms/LoopUnroll/nsw-tripcount.ll was added to solely test
functionality I'm reverting in this change, so I've deleted the test
fully.
llvm-svn: 273079
Diffstat (limited to 'llvm/test/Transforms/LoopUnroll')
-rw-r--r-- | llvm/test/Transforms/LoopUnroll/nsw-tripcount.ll | 32 |
1 files changed, 0 insertions, 32 deletions
diff --git a/llvm/test/Transforms/LoopUnroll/nsw-tripcount.ll b/llvm/test/Transforms/LoopUnroll/nsw-tripcount.ll deleted file mode 100644 index 98cab32a42a..00000000000 --- a/llvm/test/Transforms/LoopUnroll/nsw-tripcount.ll +++ /dev/null @@ -1,32 +0,0 @@ -; RUN: opt -loop-unroll -S %s | FileCheck %s - -; extern void f(int); -; void test1(int v) { -; for (int i=v; i<=v+1; ++i) -; f(i); -; } -; -; We can use the nsw information to see that the tripcount will be 2, so the -; loop should be unrolled as this is always beneficial - -declare void @f(i32) - -; CHECK-LABEL: @test1 -define void @test1(i32 %v) { -entry: - %add = add nsw i32 %v, 1 - br label %for.body - -for.body: - %i.04 = phi i32 [ %v, %entry ], [ %inc, %for.body ] - tail call void @f(i32 %i.04) - %inc = add nsw i32 %i.04, 1 - %cmp = icmp slt i32 %i.04, %add - br i1 %cmp, label %for.body, label %for.end - -; CHECK: call void @f -; CHECK-NOT: br i1 -; CHECK: call void @f -for.end: - ret void -} |