PR2621: Improvements to the SCEV AddRec binomial expansion. This
authorEli Friedman <eli.friedman@gmail.com>
Mon, 4 Aug 2008 23:49:06 +0000 (23:49 +0000)
committerEli Friedman <eli.friedman@gmail.com>
Mon, 4 Aug 2008 23:49:06 +0000 (23:49 +0000)
commitb42a6261225e5a1b9a75b9aa11732944046d7999
tree6f075da99fe606de843dfdd539f0b8ba54d218e5
parent6f498b0a8eeb69a9aa20319e2c803b1d58525547
PR2621: Improvements to the SCEV AddRec binomial expansion.  This
version uses a new algorithm for evaluating the binomial coefficients
which is significantly more efficient for AddRecs of more than 2 terms
(see the comments in the code for details on how the algorithm works).
It also fixes some bugs: it removes the arbitrary length restriction for
AddRecs, it fixes the silent generation of incorrect code for AddRecs
which require a wide calculation width, and it fixes an issue where we
were incorrectly truncating the iteration count too far when evaluating
an AddRec expression narrower than the induction variable.

There are still a few related issues I know of: I think there's
still an issue with the SCEVExpander expansion of AddRec in terms of
the width of the induction variable used.  The hack to avoid generating
too-wide integers shouldn't be necessary; instead, the callers should be
considering the cost of the expansion before expanding it (in addition
to not expanding too-wide integers, we might not want to expand
expressions that are really expensive, especially when optimizing for
size; calculating an length-17 32-bit AddRec currently generates about 250
instructions of straight-line code on X86).  Also, for long 32-bit
AddRecs on X86, CodeGen really sucks at scheduling the code.  I'm planning on
filing follow-up PRs for these issues.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@54332 91177308-0d34-0410-b5e6-96231b3b80d8
lib/Analysis/ScalarEvolution.cpp
test/Analysis/ScalarEvolution/2008-08-04-IVOverflow.ll [new file with mode: 0644]
test/Analysis/ScalarEvolution/2008-08-04-LongAddRec.ll [new file with mode: 0644]