diff options
author | Sanjoy Das <sanjoy@playingwithpointers.com> | 2015-02-25 20:02:59 +0000 |
---|---|---|
committer | Sanjoy Das <sanjoy@playingwithpointers.com> | 2015-02-25 20:02:59 +0000 |
commit | dcc84db2641eaff6efece8502ccc5f3863ef9356 (patch) | |
tree | d7b3f768f3dc130cc5a3b27c640e23f815c434fb /llvm/test/CodeGen | |
parent | f42e1eca9fe959059079abf0dda590c23fddfb14 (diff) | |
download | bcm5719-llvm-dcc84db2641eaff6efece8502ccc5f3863ef9356.tar.gz bcm5719-llvm-dcc84db2641eaff6efece8502ccc5f3863ef9356.zip |
Bugfix: SCEVExpander incorrectly marks increment operations as no-wrap
(The change was landed in r230280 and caused the regression PR22674.
This version contains a fix and a test-case for PR22674).
When emitting the increment operation, SCEVExpander marks the
operation as nuw or nsw based on the flags on the preincrement SCEV.
This is incorrect because, for instance, it is possible that {-6,+,1}
is <nuw> while {-6,+,1}+1 = {-5,+,1} is not.
This change teaches SCEV to mark the increment as nuw/nsw only if it
can explicitly prove that the increment operation won't overflow.
Apart from the attached test case, another (more realistic)
manifestation of the bug can be seen in
Transforms/IndVarSimplify/pr20680.ll.
Differential Revision: http://reviews.llvm.org/D7778
llvm-svn: 230533
Diffstat (limited to 'llvm/test/CodeGen')
-rw-r--r-- | llvm/test/CodeGen/AArch64/arm64-scaled_iv.ll | 2 | ||||
-rw-r--r-- | llvm/test/CodeGen/X86/avoid_complex_am.ll | 2 |
2 files changed, 2 insertions, 2 deletions
diff --git a/llvm/test/CodeGen/AArch64/arm64-scaled_iv.ll b/llvm/test/CodeGen/AArch64/arm64-scaled_iv.ll index 63428df9610..987373e542a 100644 --- a/llvm/test/CodeGen/AArch64/arm64-scaled_iv.ll +++ b/llvm/test/CodeGen/AArch64/arm64-scaled_iv.ll @@ -20,7 +20,7 @@ for.body: ; preds = %for.body, %entry %arrayidx = getelementptr inbounds double* %b, i64 %tmp %tmp1 = load double* %arrayidx, align 8 ; The induction variable should carry the scaling factor: 1 * 8 = 8. -; CHECK: [[IVNEXT]] = add nuw i64 [[IV]], 8 +; CHECK: [[IVNEXT]] = add nuw nsw i64 [[IV]], 8 %indvars.iv.next = add i64 %indvars.iv, 1 %arrayidx2 = getelementptr inbounds double* %c, i64 %indvars.iv.next %tmp2 = load double* %arrayidx2, align 8 diff --git a/llvm/test/CodeGen/X86/avoid_complex_am.ll b/llvm/test/CodeGen/X86/avoid_complex_am.ll index e5e7bd23a64..7f095190ab8 100644 --- a/llvm/test/CodeGen/X86/avoid_complex_am.ll +++ b/llvm/test/CodeGen/X86/avoid_complex_am.ll @@ -22,7 +22,7 @@ for.body: ; preds = %for.body, %entry %arrayidx = getelementptr inbounds double* %b, i64 %tmp %tmp1 = load double* %arrayidx, align 8 ; The induction variable should carry the scaling factor: 1. -; CHECK: [[IVNEXT]] = add nuw i64 [[IV]], 1 +; CHECK: [[IVNEXT]] = add nuw nsw i64 [[IV]], 1 %indvars.iv.next = add i64 %indvars.iv, 1 %arrayidx2 = getelementptr inbounds double* %c, i64 %indvars.iv.next %tmp2 = load double* %arrayidx2, align 8 |