diff options
| author | Oleg Ranevskyy <oranevskyy@accesssoftek.com> | 2016-05-25 13:01:33 +0000 |
|---|---|---|
| committer | Oleg Ranevskyy <oranevskyy@accesssoftek.com> | 2016-05-25 13:01:33 +0000 |
| commit | eb4eccae5c14cb6730b9c3a4a0f9069427f3e459 (patch) | |
| tree | 2f38213a6c87e2e2727f7607612fbe08eb846ebc /llvm/test/Analysis/LoopAccessAnalysis/reverse-memcheck-bounds.ll | |
| parent | 2fd1654278ef9cf2af0fa342a70f8e9a4eb7ddb0 (diff) | |
| download | bcm5719-llvm-eb4eccae5c14cb6730b9c3a4a0f9069427f3e459.tar.gz bcm5719-llvm-eb4eccae5c14cb6730b9c3a4a0f9069427f3e459.zip | |
[SCEV] No-wrap flags are not propagated when folding "{S,+,X}+T ==> {S+T,+,X}"
Summary:
**Description**
This makes `WidenIV::widenIVUse` (IndVarSimplify.cpp) fail to widen narrow IV uses in some cases. The latter affects IndVarSimplify which may not eliminate narrow IV's when there actually exists such a possibility, thereby producing ineffective code.
When `WidenIV::widenIVUse` gets a NarrowUse such as `{(-2 + %inc.lcssa),+,1}<nsw><%for.body3>`, it first tries to get a wide recurrence for it via the `getWideRecurrence` call.
`getWideRecurrence` returns recurrence like this: `{(sext i32 (-2 + %inc.lcssa) to i64),+,1}<nsw><%for.body3>`.
Then a wide use operation is generated by `cloneIVUser`. The generated wide use is evaluated to `{(-2 + (sext i32 %inc.lcssa to i64))<nsw>,+,1}<nsw><%for.body3>`, which is different from the `getWideRecurrence` result. `cloneIVUser` sees the difference and returns nullptr.
This patch also fixes the broken LLVM tests by adding missing <nsw> entries introduced by the correction.
**Minimal reproducer:**
```
int foo(int a, int b, int c);
int baz();
void bar()
{
int arr[20];
int i = 0;
for (i = 0; i < 4; ++i)
arr[i] = baz();
for (; i < 20; ++i)
arr[i] = foo(arr[i - 4], arr[i - 3], arr[i - 2]);
}
```
**Clang command line:**
```
clang++ -mllvm -debug -S -emit-llvm -O3 --target=aarch64-linux-elf test.cpp -o test.ir
```
**Expected result:**
The ` -mllvm -debug` log shows that all the IV's for the second `for` loop have been eliminated.
Reviewers: sanjoy
Subscribers: atrick, asl, aemerson, mzolotukhin, llvm-commits
Differential Revision: http://reviews.llvm.org/D20058
llvm-svn: 270695
Diffstat (limited to 'llvm/test/Analysis/LoopAccessAnalysis/reverse-memcheck-bounds.ll')
| -rw-r--r-- | llvm/test/Analysis/LoopAccessAnalysis/reverse-memcheck-bounds.ll | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/llvm/test/Analysis/LoopAccessAnalysis/reverse-memcheck-bounds.ll b/llvm/test/Analysis/LoopAccessAnalysis/reverse-memcheck-bounds.ll index 2053e49826b..0a0194f8abb 100644 --- a/llvm/test/Analysis/LoopAccessAnalysis/reverse-memcheck-bounds.ll +++ b/llvm/test/Analysis/LoopAccessAnalysis/reverse-memcheck-bounds.ll @@ -15,7 +15,7 @@ target datalayout = "e-m:e-i64:64-i128:128-n32:64-S128" target triple = "aarch64--linux-gnueabi" ; CHECK: function 'f': -; CHECK: (Low: (20000 + %a) High: (60000 + %a)) +; CHECK: (Low: (20000 + %a) High: (60000 + %a)<nsw>) @B = common global i32* null, align 8 @A = common global i32* null, align 8 @@ -58,7 +58,7 @@ for.end: ; preds = %for.body ; Here it is not obvious what the limits are, since 'step' could be negative. ; CHECK: Low: (-1 + (-1 * ((-60001 + (-1 * %a)) umax (-60001 + (40000 * %step) + (-1 * %a))))) -; CHECK: High: ((60000 + %a) umax (60000 + (-40000 * %step) + %a)) +; CHECK: High: ((60000 + %a)<nsw> umax (60000 + (-40000 * %step) + %a)) define void @g(i64 %step) { entry: |

