Bugfix: SCEVExpander incorrectly marks increment operations as no-wrap
authorSanjoy Das <sanjoy@playingwithpointers.com>
Wed, 25 Feb 2015 20:02:59 +0000 (20:02 +0000)
committerSanjoy Das <sanjoy@playingwithpointers.com>
Wed, 25 Feb 2015 20:02:59 +0000 (20:02 +0000)
commitdcc84db2641eaff6efece8502ccc5f3863ef9356
treed7b3f768f3dc130cc5a3b27c640e23f815c434fb
parentf42e1eca9fe959059079abf0dda590c23fddfb14
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
llvm/lib/Analysis/ScalarEvolutionExpander.cpp
llvm/test/Analysis/ScalarEvolution/pr22674.ll [new file with mode: 0644]
llvm/test/Analysis/ScalarEvolution/scev-expander-incorrect-nowrap.ll [new file with mode: 0644]
llvm/test/Analysis/ScalarEvolution/zext-signed-addrec.ll
llvm/test/CodeGen/AArch64/arm64-scaled_iv.ll
llvm/test/CodeGen/X86/avoid_complex_am.ll
llvm/test/Transforms/IndVarSimplify/overflowcheck.ll
llvm/test/Transforms/IndVarSimplify/pr20680.ll
llvm/test/Transforms/LoopStrengthReduce/count-to-zero.ll
llvm/test/Transforms/LoopStrengthReduce/uglygep.ll