[PATCH] SCEVExpander incorrectly marks increment operations as no-wrap

Sanjoy Das sanjoy at playingwithpointers.com
Thu Feb 19 17:58:42 PST 2015


Hi atrick, majnemer, hfinkel,

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.

http://reviews.llvm.org/D7778

Files:
  lib/Analysis/ScalarEvolutionExpander.cpp
  test/Analysis/ScalarEvolution/scev-expander-incorrect-nowrap.ll
  test/Analysis/ScalarEvolution/zext-signed-addrec.ll
  test/CodeGen/X86/avoid_complex_am.ll
  test/Transforms/IndVarSimplify/overflowcheck.ll
  test/Transforms/IndVarSimplify/pr20680.ll
  test/Transforms/LoopStrengthReduce/count-to-zero.ll
  test/Transforms/LoopStrengthReduce/uglygep.ll

EMAIL PREFERENCES
  http://reviews.llvm.org/settings/panel/emailpreferences/
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D7778.20361.patch
Type: text/x-patch
Size: 7002 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20150220/4e840ab9/attachment.bin>


More information about the llvm-commits mailing list