SCEV: Make the final add of an inbounds GEP nuw if we know that the index is positive.
authorBenjamin Kramer <benny.kra@googlemail.com>
Mon, 28 Oct 2013 07:30:06 +0000 (07:30 +0000)
committerBenjamin Kramer <benny.kra@googlemail.com>
Mon, 28 Oct 2013 07:30:06 +0000 (07:30 +0000)
commit19ea37059aaea8104ea6017abc9f1bbed610b7f2
tree6be77c455a3a706963179bac69a25112aba025fc
parent1fe9069d53f586963d61523f7c5a7d41d80a9d8b
SCEV: Make the final add of an inbounds GEP nuw if we know that the index is positive.

We can't do this for the general case as saying a GEP with a negative index
doesn't have unsigned wrap isn't valid for negative indices.
  %gep = getelementptr inbounds i32* %p, i64 -1

But an inbounds GEP cannot run past the end of address space. So we check for
the very common case of a positive index and make GEPs derived from that NUW.
Together with Andy's recent non-unit stride work this lets us analyze loops
like

  void foo3(int *a, int *b) {
    for (; a < b; a++) {}
  }

PR12375, PR12376.

Differential Revision: http://llvm-reviews.chandlerc.com/D2033

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@193514 91177308-0d34-0410-b5e6-96231b3b80d8
lib/Analysis/ScalarEvolution.cpp
test/Analysis/ScalarEvolution/nsw.ll