Andrew Trick
3ca3f98c2c
SCEV: Added a data structure for storing not-taken info per loop
...
exit. Added an interfaces for querying either the loop's exact/max
backedge taken count or a specific loop exit's not-taken count.
llvm-svn: 136100
2011-07-26 17:19:55 +00:00
Jay Foad
f4b14a2b0d
Use ArrayRef in ConstantFoldInstOperands and ConstantFoldCall.
...
llvm-svn: 135477
2011-07-19 13:32:40 +00:00
Chris Lattner
229907cd11
land David Blaikie's patch to de-constify Type, with a few tweaks.
...
llvm-svn: 135375
2011-07-18 04:54:35 +00:00
Andrew Trick
8ef3ad049d
SCEV: missing null check fix for r132360, dragonegg crash.
...
llvm-svn: 132416
2011-06-01 19:14:56 +00:00
Andrew Trick
812276eed4
scev: Better sign-extend removal. Normalize postincrement recurrences
...
so that their sign extended forms are congruent when no overflow occurs.
llvm-svn: 132360
2011-05-31 21:17:47 +00:00
Dan Gohman
0daf687e1d
Change a few std::maps to DenseMaps.
...
llvm-svn: 131088
2011-05-09 18:44:09 +00:00
Andrew Trick
7d1eea86d9
Corrects an old, old typo in a case that doesn't seem to be reached in practice.
...
llvm-svn: 130316
2011-04-27 18:17:36 +00:00
Andrew Trick
01eff820ae
Test case and comment for PR9633.
...
llvm-svn: 130294
2011-04-27 05:42:17 +00:00
Andrew Trick
759ba0802d
Fix for PR9633 [indvars] Assertion `isa<X>(Val) && "cast<Ty>() argument of incompatible type!"' failed.
...
Added a type check in ScalarEvolution::computeSCEVAtScope to handle the case in which operands of an
AddRecExpr in the current scope are folded.
llvm-svn: 130271
2011-04-27 01:21:25 +00:00
Dan Gohman
6acd95b3c1
Fix an iterator invalidation bug.
...
llvm-svn: 130166
2011-04-25 22:48:29 +00:00
Chris Lattner
0ab5e2cded
Fix a ton of comment typos found by codespell. Patch by
...
Luis Felipe Strano Moraes!
llvm-svn: 129558
2011-04-15 05:18:47 +00:00
Andrew Trick
87716c93c2
Added isValidRewrite() to check the result of ScalarEvolutionExpander.
...
SCEV may generate expressions composed of multiple pointers, which can
lead to invalid GEP expansion. Until we can teach SCEV to follow strict
pointer rules, make sure no bad GEPs creep into IR.
Fixes rdar://problem/9038671.
llvm-svn: 127839
2011-03-17 23:51:11 +00:00
Andrew Trick
a34f1b1f10
Remove getMinusSCEVForExitTest().
...
This function performed acrobatics to prove no-self-wrap, which we now
have for free.
llvm-svn: 127643
2011-03-15 01:16:14 +00:00
Andrew Trick
f6b01ff422
Propagate SCEV no-wrap flags whenever possible.
...
This needs review.
llvm-svn: 127638
2011-03-15 00:37:00 +00:00
Andrew Trick
e92dcceab7
Negating a recurrence preserves no-self-wrap.
...
llvm-svn: 127593
2011-03-14 17:38:54 +00:00
Andrew Trick
f1781db622
HowFarToZero can compute a trip count as long as the recurrence has no-self-wrap.
...
llvm-svn: 127591
2011-03-14 17:28:02 +00:00
Andrew Trick
8b55b736b1
Added SCEV::NoWrapFlags to manage unsigned, signed, and self wrap
...
properties.
Added the self-wrap flag for SCEV::AddRecExpr.
A slew of temporary FIXMEs indicate the intention of the no-self-wrap flag
without changing behavior in this revision.
llvm-svn: 127590
2011-03-14 16:50:06 +00:00
Andrew Trick
2afa325811
When SCEV can determine the loop test is X < X, set ExactBECount=0.
...
When ExactBECount is a constant, use it for MaxBECount.
When MaxBECount cannot be computed, replace it with ExactBECount.
Fixes PR9424.
llvm-svn: 127342
2011-03-09 17:29:58 +00:00
Andrew Trick
2a3b71684a
whitespace
...
llvm-svn: 127340
2011-03-09 17:23:39 +00:00
Chris Lattner
4f23f2be15
teach SCEV that the scale and addition of an inbounds gep don't NSW.
...
This fixes a FIXME in scev-aa.ll (allowing a new no-alias result) and
generally makes things more precise.
llvm-svn: 125449
2011-02-13 03:14:49 +00:00
Chris Lattner
7936a8a488
Per discussion with Dan G, inbounds geps *certainly* can have
...
unsigned overflow (e.g. "gep P, -1"), and while they can have
signed wrap in theoretical situations, modelling an AddRec as
not having signed wrap is going enough for any case we can
think of today. In the future if this isn't enough, we can
revisit this. Modeling them as having NUW isn't causing any
known problems either FWIW.
llvm-svn: 125410
2011-02-11 21:43:33 +00:00
Nick Lewycky
d9e6b4a8ff
Fix memory corruption. If one of the SCEV creation functions calls another but
...
doesn't return immediately after then the insert position in UniqueSCEVs will
be out of date. No test because this is a memory corruption issue. Fixes PR9051!
llvm-svn: 124282
2011-01-26 08:40:22 +00:00
Dan Gohman
3ac8cd614f
Add a comment.
...
llvm-svn: 124126
2011-01-24 17:54:18 +00:00
Nick Lewycky
d4192f71b5
Simplify some code with no functionality change. Make the test a lot more
...
robust against smarter optimizations, using the power of FileCheck.
llvm-svn: 124081
2011-01-23 20:06:05 +00:00
Nick Lewycky
bc98f5b78e
Use value ranges to fold ext(trunc) in SCEV when possible.
...
llvm-svn: 124062
2011-01-23 06:20:19 +00:00
Nick Lewycky
b32c8943e6
Have SCEV turn sext(x) into zext(x) when x is s>= 0. This applies many times in
...
"make check" alone.
llvm-svn: 124046
2011-01-22 22:06:21 +00:00
Nick Lewycky
5c901f3489
Similarly, analyze truncate through multiply.
...
llvm-svn: 123842
2011-01-19 18:56:00 +00:00
Nick Lewycky
5143f0f09b
Add a missed SCEV fold that is required to continue analyzing the IR produced
...
by indvars through the scev expander.
trunc(add x, y) --> add(trunc x, y). Currently SCEV largely folds the other way
which is probably wrong, but preserved to minimize churn. Instcombine doesn't
do this fold either, demonstrating a missed optz'n opportunity on code doing
add+trunc+add.
llvm-svn: 123838
2011-01-19 16:59:46 +00:00
Nick Lewycky
e9ea75e3fc
Add a missing SCEV simplification sext(zext x) --> zext x.
...
llvm-svn: 123832
2011-01-19 15:56:12 +00:00
Chris Lattner
d30de95520
some comment improvements.
...
llvm-svn: 123243
2011-01-11 17:11:59 +00:00
Eric Christopher
23bf3bafb7
Temporarily revert 123133, it's causing some regressions and I'm trying
...
to get a testcase.
llvm-svn: 123225
2011-01-11 09:02:09 +00:00
Chris Lattner
23109cb319
the GEP faq says that only inbounds geps are guaranteed to not overflow.
...
llvm-svn: 123218
2011-01-11 06:44:41 +00:00
Chris Lattner
67f82314af
add a fixme: ir isn't expressive enough.
...
llvm-svn: 123139
2011-01-09 23:02:10 +00:00
Chris Lattner
28f140a33e
Step #4 in improving trip count analysis: HowFarToZero can analyze
...
NUW AddRec's much more aggressively. We now get a trip count
for @test2 in nsw.ll
llvm-svn: 123138
2011-01-09 22:58:47 +00:00
Chris Lattner
dff679f4b6
rearrange some code, no functionality change.
...
llvm-svn: 123136
2011-01-09 22:39:48 +00:00
Chris Lattner
a44274cb4f
Step #3 to improving trip count analysis: If we fold
...
a + {b,+,stride} into {a+b,+,stride} (because a is LIV),
then the resultant AddRec is NUW/NSW if the client says it
is.
llvm-svn: 123133
2011-01-09 22:31:26 +00:00
Chris Lattner
fc87752d55
Step #2 to improve trip count analysis for loops like this:
...
void f(int* begin, int* end) { std::fill(begin, end, 0); }
which turns into a != exit expression where one pointer is
strided and (thanks to step #1 ) known to not overflow, and
the other is loop invariant.
The observation here is that, though the IV is strided by
4 in this case, that the IV *has* to become equal to the
end value. It cannot "miss" the end value by stepping over
it, because if it did, the strided IV expression would
eventually wrap around.
Handle this by turning A != B into "A-B != 0" where the A-B
part is known to be NUW.
llvm-svn: 123131
2011-01-09 22:26:35 +00:00
Chris Lattner
10223a3fbf
teach SCEV analysis of PHI nodes that PHI recurences formed
...
with GEP instructions are always NUW, because PHIs cannot wrap
the end of the address space.
llvm-svn: 123105
2011-01-09 02:28:48 +00:00
Chris Lattner
a337f5ec5c
reduce indentation. Print <nuw> and <nsw> when dumping SCEV AddRec's
...
that have the bit set.
llvm-svn: 123104
2011-01-09 02:16:18 +00:00
Jay Foad
583abbc4df
PR5207: Change APInt methods trunc(), sext(), zext(), sextOrTrunc() and
...
zextOrTrunc(), and APSInt methods extend(), extOrTrunc() and new method
trunc(), to be const and to return a new value instead of modifying the
object in place.
llvm-svn: 121120
2010-12-07 08:25:19 +00:00
Jay Foad
25a5e4ca1f
PR5207: Rename overloaded APInt methods set(), clear(), flip() to
...
setAllBits(), setBit(unsigned), etc.
llvm-svn: 120564
2010-12-01 08:53:58 +00:00
Benjamin Kramer
ddd1b7b801
Simplify code. No change in functionality.
...
llvm-svn: 119908
2010-11-20 18:43:35 +00:00
Benjamin Kramer
c77ebcc9a5
Silence warning about an uninitialized variable.
...
llvm-svn: 119800
2010-11-19 11:37:26 +00:00
Duncan Sands
aef146b890
Factor code for testing whether replacing one value with another
...
preserves LCSSA form out of ScalarEvolution and into the LoopInfo
class. Use it to check that SimplifyInstruction simplifications
are not breaking LCSSA form. Fixes PR8622.
llvm-svn: 119727
2010-11-18 19:59:41 +00:00
Dan Gohman
8ea83d81e0
Introduce memoization for ScalarEvolution dominates and properlyDominates
...
queries, and SCEVExpander getRelevantLoop queries.
llvm-svn: 119595
2010-11-18 00:34:22 +00:00
Dan Gohman
7e6b393e66
Factor out the code for purging a SCEV from all the various memoization maps.
...
Some of these maps may merge in the future, but for now it's convenient to have
a utility function for them.
llvm-svn: 119587
2010-11-17 23:28:48 +00:00
Dan Gohman
7ee1bbb76c
Merge the implementations of isLoopInvariant and hasComputableLoopEvolution, and
...
memoize the results. This improves compile time in code which highly complex
expressions which get queried many times.
llvm-svn: 119584
2010-11-17 23:21:44 +00:00
Dan Gohman
534749bf70
Make SCEV::getType() and SCEV::print non-virtual. Move SCEV::hasOperand
...
to ScalarEvolution. Delete SCEV::~SCEV. SCEV is no longer virtual.
llvm-svn: 119578
2010-11-17 22:27:42 +00:00
Dan Gohman
20d9ce21ef
Move SCEV::dominates and properlyDominates to ScalarEvolution.
...
llvm-svn: 119570
2010-11-17 21:41:58 +00:00
Dan Gohman
afd6db9932
Move SCEV::isLoopInvariant and hasComputableLoopEvolution to be member
...
functions of ScalarEvolution, in preparation for memoization and
other optimizations.
llvm-svn: 119562
2010-11-17 21:23:15 +00:00