summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Analysis/ScalarEvolution.cpp
Commit message (Collapse)AuthorAgeFilesLines
...
* When comparing constants, consider a less wide constant to be "less complex"Nick Lewycky2009-07-041-0/+2
| | | | | | | than a wider one, before trying to compare their contents which will crash if their sizes are different. llvm-svn: 74792
* Minor code cleanups.Dan Gohman2009-06-301-2/+6
| | | | llvm-svn: 74551
* Use getSCEV instead of getUnknown to create a SCEV for aDan Gohman2009-06-291-3/+3
| | | | | | | | | | Constant. This lets ConstantInts be handled as SCEVConstant instead of SCEVUnknown, as getUnknown no longer has special-case code for ConstantInt and friends. This usually doesn't affect the final output, since the constants end up getting folded later, but it does make intermediate expressions more obvious in many cases. llvm-svn: 74459
* Don't cache PHI exit values from exhaustive evaluations, becauseDan Gohman2009-06-291-1/+0
| | | | | | | | an individual exhaustive evaluation reflects only the exit value implied by an individual exit, which may differ from the actual exit value of the loop if there are other exits. This fixes PR4477. llvm-svn: 74447
* Simplify this code, and avoid using APInt(). This fixesDan Gohman2009-06-291-4/+2
| | | | | | | (otherwise harmless) uninitialized value warnings that Duncan found with gcc-4.4. llvm-svn: 74437
* Convert ScalarEvolution to use BumpPtrAllocator and FoldingSet, insteadDan Gohman2009-06-271-141/+222
| | | | | | of a team of individual allocations and a team of std::maps. llvm-svn: 74393
* Fix ScalarEvolution::getAddRecExpr's code which canonicalized theDan Gohman2009-06-261-2/+23
| | | | | | | | nesting order of nested AddRec expressions to skip the transformation if it would introduce an AddRec with operands not loop-invariant with respect to its loop. llvm-svn: 74343
* Fix SCEVAddRecExpr::isLoopInvariant to test if all of its operandsDan Gohman2009-06-261-5/+15
| | | | | | are loop invariant, not just the start operand. llvm-svn: 74338
* Minor whitespace cleanups.Dan Gohman2009-06-241-16/+16
| | | | llvm-svn: 74074
* Simplify [su]max(MAX, n) to MAX. This comes up in loop tripcountDan Gohman2009-06-241-2/+10
| | | | | | | | | computations in loops with multiple exits. Adjust the testcase for PR4436 so that the relevant portion isn't optimized away. llvm-svn: 74073
* Delete some orphaned comments, fix some 80-column violations,Dan Gohman2009-06-241-95/+80
| | | | | | and tidy up a few other formatting issues. llvm-svn: 74060
* Extend ScalarEvolution's multiple-exit support to compute exactDan Gohman2009-06-241-97/+105
| | | | | | | | | | | | | | | trip counts in more cases. Generalize ScalarEvolution's isLoopGuardedByCond code to recognize And and Or conditions, splitting the code out into an isNecessaryCond helper function so that it can evaluate Ands and Ors recursively, and make SCEVExpander be much more aggressive about hoisting instructions out of loops. test/CodeGen/X86/pr3495.ll has an additional instruction now, but it appears to be due to an arbitrary register allocation difference. llvm-svn: 74048
* Teach GetMinSignBits about SCEVAddExprs.Dan Gohman2009-06-241-0/+32
| | | | llvm-svn: 74045
* Move the special cases for constants out of getUnknown and intoDan Gohman2009-06-241-15/+14
| | | | | | | | | createSCEV. Also, recognize UndefValue in createSCEV. Change getIntegerSCEV's comment to avoid mentioning FP types, and re-implement it in terms of getConstant instead of getUnknown. llvm-svn: 74041
* Use ScalarEvolution::getConstant instead of getUnknown to createDan Gohman2009-06-241-7/+8
| | | | | | | SCEVConstants. This cleanup is a step toward letting getUnknown be simpler. llvm-svn: 74037
* Include the maximum trip count expression in ScalarEvolution's print output.Dan Gohman2009-06-241-0/+9
| | | | llvm-svn: 74035
* Add an isAllOnesValue utility function, similar to isZero and isOne.Dan Gohman2009-06-241-0/+6
| | | | llvm-svn: 74032
* Fix a bug in the trip-count computation with And/Or. If either of theDan Gohman2009-06-221-8/+4
| | | | | | sides is CouldNotCompute, the resulting exact count must be CouldNotCompute. llvm-svn: 73920
* Remove the parent pointer from SCEV, since it did not end up being needed.Owen Anderson2009-06-221-30/+22
| | | | llvm-svn: 73907
* SCEVHandle is no more!Owen Anderson2009-06-221-256/+255
| | | | llvm-svn: 73906
* Fix some typos that Duncan noticed.Dan Gohman2009-06-221-2/+2
| | | | llvm-svn: 73903
* Banish global state from ScalarEvolution! SCEV uniquing is now done by ↵Owen Anderson2009-06-221-58/+50
| | | | | | | | | | | tables attached to the ScalarEvolution pass. This also throws out the SCEV reference counting scheme, as the the SCEVs now have a lifetime controlled by the ScalarEvolution pass. Note that SCEVHandle is now a no-op, and will be remove in a future commit. llvm-svn: 73892
* Make use of getUMinFromMismatchedTypes when computing backedge-takenDan Gohman2009-06-221-14/+14
| | | | | | | | | | | | counts for loops with multiple exits, replacing more conservative code which only handled constants. This is derived from a patch by Nick Lewycky. This also fixes llc aborts in ClamAV and others, as getUMinFromMismatchedTypes takes care of balancing the types before working with them. llvm-svn: 73884
* Add a getUMinFromMismatchedTypes helper function.Dan Gohman2009-06-221-0/+16
| | | | llvm-svn: 73883
* Factor out code for computing umin and smin for SCEV expressions intoDan Gohman2009-06-221-7/+14
| | | | | | helper functions. Based on a patch by Nick Lewycky. llvm-svn: 73869
* Teach ScalarEvolution how to analyze loops with multiple exitDan Gohman2009-06-221-27/+221
| | | | | | | | | blocks, and also exit blocks with multiple conditions (combined with (bitwise) ands and ors). It's often infeasible to compute an exact trip count in such cases, but a useful upper bound can often be found. llvm-svn: 73866
* Delete an unused variable.Dan Gohman2009-06-221-1/+0
| | | | llvm-svn: 73865
* Fix ScalarEvolution's backedge-taken count computations to check forDan Gohman2009-06-211-7/+29
| | | | | | | | overflow when computing a integer division to round up. Thanks to Nick Lewycky for noticing this! llvm-svn: 73862
* Generalize isLoopGuardedByCond's checking to consider twoDan Gohman2009-06-201-3/+27
| | | | | | | | | | SCEVUnknowns with identical Instructions to be equal. This allows it to analze cases such as the attached testcase, where the front-end has cloned the loop controlling expression. Along with r73805, this lets IndVarSimplify eliminate all the sign-extend casts in the loop in the attached testcase. llvm-svn: 73807
* Use ScalarEvolution's new GetMinSignBits and GetMinLeadingZerosDan Gohman2009-06-201-3/+6
| | | | | | | in the loop backedge-taken count computation of the maximum possible trip count. llvm-svn: 73805
* Make GetMinTrailingZeros a member function of ScalarEvolution,Dan Gohman2009-06-191-22/+83
| | | | | | | | | | | so that it can access the TargetData member (when available) and use ValueTracking.h information to compute information for SCEVUnknown Values. Also add GetMinLeadingZeros and GetMinSignBits functions, with minimal implementations. llvm-svn: 73794
* Make ScalarEvolution::print print getSCEVAtScope values forDan Gohman2009-06-191-2/+10
| | | | | | expressions, when interesting. llvm-svn: 73776
* Add a parent pointer to SCEV, in preparation for getting rid of the global ↵Owen Anderson2009-06-181-21/+26
| | | | | | uniquing tables. No functionality change. llvm-svn: 73728
* Recognize n != 0 ? n : 1 as umax(n, 1). Previously only ULT/UGT/ULE/UGEDan Gohman2009-06-181-0/+18
| | | | | | | comparisons were recognized for umax, but instcombine canonicalizes unsigned comparisons with zero to this simpler form. llvm-svn: 73717
* Update a comment to reflect the code.Dan Gohman2009-06-181-2/+1
| | | | llvm-svn: 73704
* Fix trailing whitespace from ScalarEvolution::print.Dan Gohman2009-06-181-2/+1
| | | | llvm-svn: 73666
* Teach ScalarEvolution how to recognize another xor(and(x, C), C) case.Dan Gohman2009-06-181-4/+19
| | | | | | | If C is a single bit and the and gets analyzed as a truncate and zero-extend, the xor can be represnted as an add. llvm-svn: 73664
* Delete unnecessary braces.Dan Gohman2009-06-171-2/+1
| | | | llvm-svn: 73663
* Fix ScalarEvolution's Xor handling to not assume that an AndDan Gohman2009-06-171-3/+6
| | | | | | | that gets recognized with a SCEVZeroExtendExpr must be an And with a low-bits mask. With r73540, this is no longer the case. llvm-svn: 73594
* Instcombine's ShrinkDemandedConstant may strip bits out of constants,Dan Gohman2009-06-161-3/+18
| | | | | | | | obscuring what would otherwise be a low-bits mask. Use ComputeMaskedBits to compute what ShrinkDemandedConstant knew about to reconstruct a low-bits mask value. llvm-svn: 73540
* Support vector casts in more places, fixing a variety of assertionDan Gohman2009-06-151-3/+8
| | | | | | | | | | | | | | | failures. To support this, add some utility functions to Type to help support vector/scalar-independent code. Change ConstantInt::get and ConstantFP::get to support vector types, and add an overload to ConstantInt::get that uses a static IntegerType type, for convenience. Introduce a new getConstant method for ScalarEvolution, to simplify common use cases. llvm-svn: 73431
* Implement more aggressive folding of add operand lists whenDan Gohman2009-06-141-0/+128
| | | | | | | | | | they contain multiplications of constants with add operations. This helps simplify several kinds of things; in particular it helps simplify expressions like ((-1 * (%a + %b)) + %a) to %b, as expressions like this often come up in loop trip count computations. llvm-svn: 73361
* Check for the short-circuiting condition before performingDan Gohman2009-06-141-1/+1
| | | | | | the potentially expensive erase. llvm-svn: 73359
* Do compare constant SCEV values in SCEVComplexityCompare, becauseDan Gohman2009-06-141-3/+12
| | | | | | | | even though the order doesn't matter at the top level of an expression, it does matter when the constant is a subexpression of an n-ary expression, because n-ary expressions are sorted lexicographically. llvm-svn: 73358
* Convert several parts of the ScalarEvolution framework to useDan Gohman2009-06-141-37/+41
| | | | | | SmallVector instead of std::vector. llvm-svn: 73357
* Add a ScalarEvolution::getAnyExtendExpr utility function for performingDan Gohman2009-06-131-0/+59
| | | | | | extension with unspecified bits. llvm-svn: 73293
* Rename UnknownValue to CouldNotCompute, since it holds an instance ofDan Gohman2009-06-061-37/+37
| | | | | | SCEVCouldNotCompute, and not SCEVUnknown. llvm-svn: 72999
* Simplify.Devang Patel2009-06-051-15/+6
| | | | llvm-svn: 72970
* Remove some unnecessary #includes.Dan Gohman2009-06-051-1/+0
| | | | llvm-svn: 72948
* For the return type of SCEVUDivExpr, use the RHS' type instead ofDan Gohman2009-05-261-1/+6
| | | | | | | | that of the LHS. It doesn't matter for correctness, but the LHS is more likely than the RHS to be a pointer type in exotic cases, and it's more tidy to have it return the integer type. llvm-svn: 72424
OpenPOWER on IntegriCloud