[SCEV] Improve the run-time checking of the NoWrap predicate
authorSilviu Baranga <silviu.baranga@arm.com>
Mon, 25 Apr 2016 09:27:16 +0000 (09:27 +0000)
committerSilviu Baranga <silviu.baranga@arm.com>
Mon, 25 Apr 2016 09:27:16 +0000 (09:27 +0000)
commit795c629ec93cfa4da558df3231c1309fbe6883be
treeb41c451865a0d8d0698edc33c905f0d09c9573bf
parenta44d44cb2ea8264c905d65e8bb1c94f3abbfac3d
[SCEV] Improve the run-time checking of the NoWrap predicate

Summary:
This implements a new method of run-time checking the NoWrap
SCEV predicates, which should be easier to optimize and nicer
for targets that don't correctly handle multiplication/addition
of large integer types (like i128).

If the AddRec is {a,+,b} and the backedge taken count is c,
the idea is to check that |b| * c doesn't have unsigned overflow,
and depending on the sign of b, that:

   a + |b| * c >= a (b >= 0) or
   a - |b| * c <= a (b <= 0)

where the comparisons above are signed or unsigned, depending on
the flag that we're checking.

The advantage of doing this is that we avoid extending to a larger
type and we avoid the multiplication of large types (multiplying
i128 can be expensive).

Reviewers: sanjoy

Subscribers: llvm-commits, mzolotukhin

Differential Revision: http://reviews.llvm.org/D19266

llvm-svn: 267389
llvm/lib/Analysis/ScalarEvolutionExpander.cpp
llvm/test/Analysis/LoopAccessAnalysis/wrapping-pointer-versioning.ll