|
LLVM
4.0.0
|
The main scalar evolution driver. More...
#include <ScalarEvolution.h>
Public Types | |
| enum | LoopDisposition { LoopVariant, LoopInvariant, LoopComputable } |
| An enum describing the relationship between a SCEV and a loop. More... | |
| enum | BlockDisposition { DoesNotDominateBlock, DominatesBlock, ProperlyDominatesBlock } |
| An enum describing the relationship between a SCEV and a basic block. More... | |
Public Member Functions | |
| ScalarEvolution (Function &F, TargetLibraryInfo &TLI, AssumptionCache &AC, DominatorTree &DT, LoopInfo &LI) | |
| ~ScalarEvolution () | |
| ScalarEvolution (ScalarEvolution &&Arg) | |
| LLVMContext & | getContext () const |
| bool | isSCEVable (Type *Ty) const |
| Test if values of the given type are analyzable within the SCEV framework. More... | |
| uint64_t | getTypeSizeInBits (Type *Ty) const |
| Return the size in bits of the specified type, for which isSCEVable must return true. More... | |
| Type * | getEffectiveSCEVType (Type *Ty) const |
| Return a type with the same bitwidth as the given type and which represents how SCEV will treat the given type, for which isSCEVable must return true. More... | |
| bool | containsAddRecurrence (const SCEV *S) |
| Return true if the SCEV is a scAddRecExpr or it contains scAddRecExpr. More... | |
| SetVector< ValueOffsetPair > * | getSCEVValues (const SCEV *S) |
| Return the Value set from which the SCEV expr is generated. More... | |
| void | eraseValueFromMap (Value *V) |
| Erase Value from ValueExprMap and ExprValueMap. More... | |
| const SCEV * | getSCEV (Value *V) |
| Return a SCEV expression for the full generality of the specified expression. More... | |
| const SCEV * | getConstant (ConstantInt *V) |
| const SCEV * | getConstant (const APInt &Val) |
| const SCEV * | getConstant (Type *Ty, uint64_t V, bool isSigned=false) |
| const SCEV * | getTruncateExpr (const SCEV *Op, Type *Ty) |
| const SCEV * | getZeroExtendExpr (const SCEV *Op, Type *Ty) |
| const SCEV * | getSignExtendExpr (const SCEV *Op, Type *Ty) |
| const SCEV * | getAnyExtendExpr (const SCEV *Op, Type *Ty) |
| getAnyExtendExpr - Return a SCEV for the given operand extended with unspecified bits out to the given type. More... | |
| const SCEV * | getAddExpr (SmallVectorImpl< const SCEV * > &Ops, SCEV::NoWrapFlags Flags=SCEV::FlagAnyWrap) |
| Get a canonical add expression, or something simpler if possible. More... | |
| const SCEV * | getAddExpr (const SCEV *LHS, const SCEV *RHS, SCEV::NoWrapFlags Flags=SCEV::FlagAnyWrap) |
| const SCEV * | getAddExpr (const SCEV *Op0, const SCEV *Op1, const SCEV *Op2, SCEV::NoWrapFlags Flags=SCEV::FlagAnyWrap) |
| const SCEV * | getMulExpr (SmallVectorImpl< const SCEV * > &Ops, SCEV::NoWrapFlags Flags=SCEV::FlagAnyWrap) |
| Get a canonical multiply expression, or something simpler if possible. More... | |
| const SCEV * | getMulExpr (const SCEV *LHS, const SCEV *RHS, SCEV::NoWrapFlags Flags=SCEV::FlagAnyWrap) |
| const SCEV * | getMulExpr (const SCEV *Op0, const SCEV *Op1, const SCEV *Op2, SCEV::NoWrapFlags Flags=SCEV::FlagAnyWrap) |
| const SCEV * | getUDivExpr (const SCEV *LHS, const SCEV *RHS) |
| Get a canonical unsigned division expression, or something simpler if possible. More... | |
| const SCEV * | getUDivExactExpr (const SCEV *LHS, const SCEV *RHS) |
| Get a canonical unsigned division expression, or something simpler if possible. More... | |
| const SCEV * | getAddRecExpr (const SCEV *Start, const SCEV *Step, const Loop *L, SCEV::NoWrapFlags Flags) |
| Get an add recurrence expression for the specified loop. More... | |
| const SCEV * | getAddRecExpr (SmallVectorImpl< const SCEV * > &Operands, const Loop *L, SCEV::NoWrapFlags Flags) |
| Get an add recurrence expression for the specified loop. More... | |
| const SCEV * | getAddRecExpr (const SmallVectorImpl< const SCEV * > &Operands, const Loop *L, SCEV::NoWrapFlags Flags) |
| const SCEV * | getGEPExpr (GEPOperator *GEP, const SmallVectorImpl< const SCEV * > &IndexExprs) |
| Returns an expression for a GEP. More... | |
| const SCEV * | getSMaxExpr (const SCEV *LHS, const SCEV *RHS) |
| const SCEV * | getSMaxExpr (SmallVectorImpl< const SCEV * > &Operands) |
| const SCEV * | getUMaxExpr (const SCEV *LHS, const SCEV *RHS) |
| const SCEV * | getUMaxExpr (SmallVectorImpl< const SCEV * > &Operands) |
| const SCEV * | getSMinExpr (const SCEV *LHS, const SCEV *RHS) |
| const SCEV * | getUMinExpr (const SCEV *LHS, const SCEV *RHS) |
| const SCEV * | getUnknown (Value *V) |
| const SCEV * | getCouldNotCompute () |
| const SCEV * | getZero (Type *Ty) |
| Return a SCEV for the constant 0 of a specific type. More... | |
| const SCEV * | getOne (Type *Ty) |
| Return a SCEV for the constant 1 of a specific type. More... | |
| const SCEV * | getSizeOfExpr (Type *IntTy, Type *AllocTy) |
| Return an expression for sizeof AllocTy that is type IntTy. More... | |
| const SCEV * | getOffsetOfExpr (Type *IntTy, StructType *STy, unsigned FieldNo) |
| Return an expression for offsetof on the given field with type IntTy. More... | |
| const SCEV * | getNegativeSCEV (const SCEV *V, SCEV::NoWrapFlags Flags=SCEV::FlagAnyWrap) |
| Return the SCEV object corresponding to -V. More... | |
| const SCEV * | getNotSCEV (const SCEV *V) |
| Return the SCEV object corresponding to ~V. More... | |
| const SCEV * | getMinusSCEV (const SCEV *LHS, const SCEV *RHS, SCEV::NoWrapFlags Flags=SCEV::FlagAnyWrap) |
| Return LHS-RHS. Minus is represented in SCEV as A+B*-1. More... | |
| const SCEV * | getTruncateOrZeroExtend (const SCEV *V, Type *Ty) |
| Return a SCEV corresponding to a conversion of the input value to the specified type. More... | |
| const SCEV * | getTruncateOrSignExtend (const SCEV *V, Type *Ty) |
| Return a SCEV corresponding to a conversion of the input value to the specified type. More... | |
| const SCEV * | getNoopOrZeroExtend (const SCEV *V, Type *Ty) |
| Return a SCEV corresponding to a conversion of the input value to the specified type. More... | |
| const SCEV * | getNoopOrSignExtend (const SCEV *V, Type *Ty) |
| Return a SCEV corresponding to a conversion of the input value to the specified type. More... | |
| const SCEV * | getNoopOrAnyExtend (const SCEV *V, Type *Ty) |
| Return a SCEV corresponding to a conversion of the input value to the specified type. More... | |
| const SCEV * | getTruncateOrNoop (const SCEV *V, Type *Ty) |
| Return a SCEV corresponding to a conversion of the input value to the specified type. More... | |
| const SCEV * | getUMaxFromMismatchedTypes (const SCEV *LHS, const SCEV *RHS) |
| Promote the operands to the wider of the types using zero-extension, and then perform a umax operation with them. More... | |
| const SCEV * | getUMinFromMismatchedTypes (const SCEV *LHS, const SCEV *RHS) |
| Promote the operands to the wider of the types using zero-extension, and then perform a umin operation with them. More... | |
| const SCEV * | getPointerBase (const SCEV *V) |
| Transitively follow the chain of pointer-type operands until reaching a SCEV that does not have a single pointer operand. More... | |
| const SCEV * | getSCEVAtScope (const SCEV *S, const Loop *L) |
| Return a SCEV expression for the specified value at the specified scope in the program. More... | |
| const SCEV * | getSCEVAtScope (Value *V, const Loop *L) |
| This is a convenience function which does getSCEVAtScope(getSCEV(V), L). More... | |
| bool | isLoopEntryGuardedByCond (const Loop *L, ICmpInst::Predicate Pred, const SCEV *LHS, const SCEV *RHS) |
| Test whether entry to the loop is protected by a conditional between LHS and RHS. More... | |
| bool | isLoopBackedgeGuardedByCond (const Loop *L, ICmpInst::Predicate Pred, const SCEV *LHS, const SCEV *RHS) |
| Test whether the backedge of the loop is protected by a conditional between LHS and RHS. More... | |
| unsigned | getSmallConstantTripCount (Loop *L) |
| Returns the maximum trip count of the loop if it is a single-exit loop and we can compute a small maximum for that loop. More... | |
| unsigned | getSmallConstantTripCount (Loop *L, BasicBlock *ExitingBlock) |
| Returns the maximum trip count of this loop as a normal unsigned value. More... | |
| unsigned | getSmallConstantMaxTripCount (Loop *L) |
| Returns the upper bound of the loop trip count as a normal unsigned value. More... | |
| unsigned | getSmallConstantTripMultiple (Loop *L) |
| Returns the largest constant divisor of the trip count of the loop if it is a single-exit loop and we can compute a small maximum for that loop. More... | |
| unsigned | getSmallConstantTripMultiple (Loop *L, BasicBlock *ExitingBlock) |
| Returns the largest constant divisor of the trip count of this loop as a normal unsigned value, if possible. More... | |
| const SCEV * | getExitCount (Loop *L, BasicBlock *ExitingBlock) |
| Get the expression for the number of loop iterations for which this loop is guaranteed not to exit via ExitingBlock. More... | |
| const SCEV * | getBackedgeTakenCount (const Loop *L) |
| If the specified loop has a predictable backedge-taken count, return it, otherwise return a SCEVCouldNotCompute object. More... | |
| const SCEV * | getPredicatedBackedgeTakenCount (const Loop *L, SCEVUnionPredicate &Predicates) |
| Similar to getBackedgeTakenCount, except it will add a set of SCEV predicates to Predicates that are required to be true in order for the answer to be correct. More... | |
| const SCEV * | getMaxBackedgeTakenCount (const Loop *L) |
| Similar to getBackedgeTakenCount, except return the least SCEV value that is known never to be less than the actual backedge taken count. More... | |
| bool | isBackedgeTakenCountMaxOrZero (const Loop *L) |
| Return true if the backedge taken count is either the value returned by getMaxBackedgeTakenCount or zero. More... | |
| bool | hasLoopInvariantBackedgeTakenCount (const Loop *L) |
| Return true if the specified loop has an analyzable loop-invariant backedge-taken count. More... | |
| void | forgetLoop (const Loop *L) |
| This method should be called by the client when it has changed a loop in a way that may effect ScalarEvolution's ability to compute a trip count, or if the loop is deleted. More... | |
| void | forgetValue (Value *V) |
| This method should be called by the client when it has changed a value in a way that may effect its value, or which may disconnect it from a def-use chain linking it to a loop. More... | |
| void | forgetLoopDispositions (const Loop *L) |
| Called when the client has changed the disposition of values in this loop. More... | |
| uint32_t | GetMinTrailingZeros (const SCEV *S) |
| Determine the minimum number of zero bits that S is guaranteed to end in (at every loop iteration). More... | |
| ConstantRange | getUnsignedRange (const SCEV *S) |
| Determine the unsigned range for a particular SCEV. More... | |
| ConstantRange | getSignedRange (const SCEV *S) |
| Determine the signed range for a particular SCEV. More... | |
| bool | isKnownNegative (const SCEV *S) |
| Test if the given expression is known to be negative. More... | |
| bool | isKnownPositive (const SCEV *S) |
| Test if the given expression is known to be positive. More... | |
| bool | isKnownNonNegative (const SCEV *S) |
| Test if the given expression is known to be non-negative. More... | |
| bool | isKnownNonPositive (const SCEV *S) |
| Test if the given expression is known to be non-positive. More... | |
| bool | isKnownNonZero (const SCEV *S) |
| Test if the given expression is known to be non-zero. More... | |
| bool | isKnownPredicate (ICmpInst::Predicate Pred, const SCEV *LHS, const SCEV *RHS) |
| Test if the given expression is known to satisfy the condition described by Pred, LHS, and RHS. More... | |
| bool | isLoopInvariantPredicate (ICmpInst::Predicate Pred, const SCEV *LHS, const SCEV *RHS, const Loop *L, ICmpInst::Predicate &InvariantPred, const SCEV *&InvariantLHS, const SCEV *&InvariantRHS) |
Return true if the result of the predicate LHS Pred RHS is loop invariant with respect to L. More... | |
| bool | SimplifyICmpOperands (ICmpInst::Predicate &Pred, const SCEV *&LHS, const SCEV *&RHS, unsigned Depth=0) |
| Simplify LHS and RHS in a comparison with predicate Pred. More... | |
| LoopDisposition | getLoopDisposition (const SCEV *S, const Loop *L) |
| Return the "disposition" of the given SCEV with respect to the given loop. More... | |
| bool | isLoopInvariant (const SCEV *S, const Loop *L) |
| Return true if the value of the given SCEV is unchanging in the specified loop. More... | |
| bool | hasComputableLoopEvolution (const SCEV *S, const Loop *L) |
| Return true if the given SCEV changes value in a known way in the specified loop. More... | |
| BlockDisposition | getBlockDisposition (const SCEV *S, const BasicBlock *BB) |
| Return the "disposition" of the given SCEV with respect to the given block. More... | |
| bool | dominates (const SCEV *S, const BasicBlock *BB) |
| Return true if elements that makes up the given SCEV dominate the specified basic block. More... | |
| bool | properlyDominates (const SCEV *S, const BasicBlock *BB) |
| Return true if elements that makes up the given SCEV properly dominate the specified basic block. More... | |
| bool | hasOperand (const SCEV *S, const SCEV *Op) const |
| Test whether the given SCEV has Op as a direct or indirect operand. More... | |
| const SCEV * | getElementSize (Instruction *Inst) |
| Return the size of an element read or written by Inst. More... | |
| void | findArrayDimensions (SmallVectorImpl< const SCEV * > &Terms, SmallVectorImpl< const SCEV * > &Sizes, const SCEV *ElementSize) const |
| Compute the array dimensions Sizes from the set of Terms extracted from the memory access function of this SCEVAddRecExpr (second step of delinearization). More... | |
| void | print (raw_ostream &OS) const |
| void | verify () const |
| bool | invalidate (Function &F, const PreservedAnalyses &PA, FunctionAnalysisManager::Invalidator &Inv) |
| void | collectParametricTerms (const SCEV *Expr, SmallVectorImpl< const SCEV * > &Terms) |
| Collect parametric terms occurring in step expressions (first step of delinearization). More... | |
| void | computeAccessFunctions (const SCEV *Expr, SmallVectorImpl< const SCEV * > &Subscripts, SmallVectorImpl< const SCEV * > &Sizes) |
| Return in Subscripts the access functions for each dimension in Sizes (third step of delinearization). More... | |
| void | delinearize (const SCEV *Expr, SmallVectorImpl< const SCEV * > &Subscripts, SmallVectorImpl< const SCEV * > &Sizes, const SCEV *ElementSize) |
| Split this SCEVAddRecExpr into two vectors of SCEVs representing the subscripts and sizes of an array access. More... | |
| const DataLayout & | getDataLayout () const |
| Return the DataLayout associated with the module this SCEV instance is operating on. More... | |
| const SCEVPredicate * | getEqualPredicate (const SCEVUnknown *LHS, const SCEVConstant *RHS) |
| const SCEVPredicate * | getWrapPredicate (const SCEVAddRecExpr *AR, SCEVWrapPredicate::IncrementWrapFlags AddedFlags) |
| const SCEV * | rewriteUsingPredicate (const SCEV *S, const Loop *L, SCEVUnionPredicate &A) |
Re-writes the SCEV according to the Predicates in A. More... | |
| const SCEVAddRecExpr * | convertSCEVToAddRecWithPredicates (const SCEV *S, const Loop *L, SmallPtrSetImpl< const SCEVPredicate * > &Preds) |
Tries to convert the S expression to an AddRec expression, adding additional predicates to Preds as required. More... | |
Static Public Member Functions | |
| static LLVM_NODISCARD SCEV::NoWrapFlags | maskFlags (SCEV::NoWrapFlags Flags, int Mask) |
| Convenient NoWrapFlags manipulation that hides enum casts and is visible in the ScalarEvolution name space. More... | |
| static LLVM_NODISCARD SCEV::NoWrapFlags | setFlags (SCEV::NoWrapFlags Flags, SCEV::NoWrapFlags OnFlags) |
| static LLVM_NODISCARD SCEV::NoWrapFlags | clearFlags (SCEV::NoWrapFlags Flags, SCEV::NoWrapFlags OffFlags) |
Friends | |
| class | SCEVCallbackVH |
| class | SCEVExpander |
| class | SCEVUnknown |
The main scalar evolution driver.
Because client code (intentionally) can't do much with the SCEV objects directly, they must ask this class for services.
Definition at line 417 of file ScalarEvolution.h.
| ScalarEvolution::ScalarEvolution | ( | Function & | F, |
| TargetLibraryInfo & | TLI, | ||
| AssumptionCache & | AC, | ||
| DominatorTree & | DT, | ||
| LoopInfo & | LI | ||
| ) |
Definition at line 9497 of file ScalarEvolution.cpp.
References llvm::Module::getFunction(), llvm::Intrinsic::getName(), and llvm::GlobalValue::getParent().
| ScalarEvolution::~ScalarEvolution | ( | ) |
Definition at line 9545 of file ScalarEvolution.cpp.
References assert(), and llvm::DenseMapBase< DerivedT, KeyT, ValueT, KeyInfoT, BucketT >::clear().
| ScalarEvolution::ScalarEvolution | ( | ScalarEvolution && | Arg | ) |
Definition at line 9521 of file ScalarEvolution.cpp.
|
inlinestatic |
Definition at line 444 of file ScalarEvolution.h.
Referenced by getMulExpr().
| void ScalarEvolution::collectParametricTerms | ( | const SCEV * | Expr, |
| SmallVectorImpl< const SCEV * > & | Terms | ||
| ) |
Collect parametric terms occurring in step expressions (first step of delinearization).
Find parametric terms in this SCEVAddRecExpr.
We first for parameters in two places: 1) The strides of AddRec expressions. 2) Unknowns that are multiplied with AddRec expressions.
Definition at line 9117 of file ScalarEvolution.cpp.
References llvm::dbgs(), DEBUG, and llvm::visitAll().
Referenced by delinearize().
| void ScalarEvolution::computeAccessFunctions | ( | const SCEV * | Expr, |
| SmallVectorImpl< const SCEV * > & | Subscripts, | ||
| SmallVectorImpl< const SCEV * > & | Sizes | ||
| ) |
Return in Subscripts the access functions for each dimension in Sizes (third step of delinearization).
Definition at line 9305 of file ScalarEvolution.cpp.
References llvm::SmallVectorTemplateCommon< T >::begin(), llvm::SmallVectorImpl< T >::clear(), llvm::dbgs(), DEBUG, llvm::SmallVectorBase::empty(), llvm::SmallVectorTemplateCommon< T >::end(), i, llvm::SCEVAddRecExpr::isAffine(), llvm::SmallVectorTemplateBase< T, isPodLike< T >::value >::push_back(), llvm::reverse(), and llvm::SmallVectorTemplateCommon< T >::size().
Referenced by delinearize().
Return true if the SCEV is a scAddRecExpr or it contains scAddRecExpr.
The result will be cached in HasRecMap.
Definition at line 3401 of file ScalarEvolution.cpp.
References llvm::DenseMapBase< DerivedT, KeyT, ValueT, KeyInfoT, BucketT >::end(), llvm::DenseMapBase< DerivedT, KeyT, ValueT, KeyInfoT, BucketT >::find(), I, llvm::DenseMapBase< DerivedT, KeyT, ValueT, KeyInfoT, BucketT >::insert(), and llvm::SCEVExprContains().
| const SCEVAddRecExpr * ScalarEvolution::convertSCEVToAddRecWithPredicates | ( | const SCEV * | S, |
| const Loop * | L, | ||
| SmallPtrSetImpl< const SCEVPredicate * > & | Preds | ||
| ) |
Tries to convert the S expression to an AddRec expression, adding additional predicates to Preds as required.
Definition at line 10226 of file ScalarEvolution.cpp.
References llvm::dyn_cast(), llvm::SmallPtrSetImpl< PtrType >::insert(), and P.
Referenced by llvm::PredicatedScalarEvolution::getAsAddRec().
| void ScalarEvolution::delinearize | ( | const SCEV * | Expr, |
| SmallVectorImpl< const SCEV * > & | Subscripts, | ||
| SmallVectorImpl< const SCEV * > & | Sizes, | ||
| const SCEV * | ElementSize | ||
| ) |
Split this SCEVAddRecExpr into two vectors of SCEVs representing the subscripts and sizes of an array access.
Splits the SCEV into two vectors of SCEVs representing the subscripts and sizes of an array access.
The delinearization is a 3 step process: the first two steps compute the sizes of each subscript and the third step computes the access functions for the delinearized array:
To compute a uniform array size for several memory accesses to the same object, one can collect in step 1 all the step terms for all the memory accesses, and compute in step 2 a unique array shape. This guarantees that the array shape will be the same across all memory accesses.
FIXME: We could derive the result of steps 1 and 2 from a description of the array shape given in metadata.
Example:
A[][n][m]
for i for j for k A[j+k][2i][5i] =
The initial SCEV:
A[{{{0,+,2*m+5}_i, +, n*m}_j, +, n*m}_k]
b. Divide Quotient: {{{0,+,2}_i, +, n}_j, +, n}_k by next outer size n Quotient: {{{0,+,0}_i, +, 1}_j, +, 1}_k Remainder: {{{0,+,2}_i, +, 0}_j, +, 0}_k The Remainder is the subscript of the next array dimension: [2i].
The subscript of the outermost dimension is the Quotient: [j+k].
Overall, we have: A[][n][m], and the access function: A[j+k][2i][5i].
Returns the remainder of the delinearization that is the offset start of the array. The SCEV->delinearize algorithm computes the multiples of SCEV coefficients: that is a pattern matching of sub expressions in the stride and base of a SCEV corresponding to the computation of a GCD (greatest common divisor) of base and stride. When SCEV->delinearize fails, it returns the SCEV unchanged.
For example: when analyzing the memory access A[i][j][k] in this loop nest
void foo(long n, long m, long o, double A[n][m][o]) {
for (long i = 0; i < n; i++) for (long j = 0; j < m; j++) for (long k = 0; k < o; k++) A[i][j][k] = 1.0; }
the delinearization input is the following AddRec SCEV:
AddRec: {{{A,+,(8 * m * o)}<for.i>,+,(8 * o)}<for.j>,+,8}<for.k>
From this SCEV, we are able to say that the base offset of the access is A because it appears as an offset that does not divide any of the strides in the loops:
CHECK: Base offset: A
and then SCEV->delinearize determines the size of some of the dimensions of the array as these are the multiples by which the strides are happening:
CHECK: ArrayDecl[UnknownSize][m][o] with elements of sizeof(double) bytes.
Note that the outermost dimension remains of UnknownSize because there are no strides that would help identifying the size of the last dimension: when the array has been statically allocated, one could compute the size of that dimension by dividing the overall size of the array by the size of the known dimensions: m * o * 8.
Finally delinearize provides the access functions for the array reference that does correspond to A[i][j][k] of the above C testcase:
CHECK: ArrayRef[{0,+,1}<for.i>][{0,+,1}<for.j>][{0,+,1}<for.k>]
The testcases are checking the output of a function pass: DelinearizationPass that walks through all loads and stores of a function asking for the SCEV of the memory access with respect to all enclosing loops, calling SCEV->delinearize on that and printing the results.
Definition at line 9413 of file ScalarEvolution.cpp.
References collectParametricTerms(), computeAccessFunctions(), llvm::dbgs(), DEBUG, llvm::SmallVectorBase::empty(), and findArrayDimensions().
| bool ScalarEvolution::dominates | ( | const SCEV * | S, |
| const BasicBlock * | BB | ||
| ) |
Return true if elements that makes up the given SCEV dominate the specified basic block.
Definition at line 9912 of file ScalarEvolution.cpp.
References DominatesBlock, and getBlockDisposition().
| void ScalarEvolution::eraseValueFromMap | ( | Value * | V | ) |
Erase Value from ValueExprMap and ExprValueMap.
ValueExprMap.erase(V) cannot be used separately. eraseValueFromMap should be used to remove V from ValueExprMap and ExprValueMap at the same time.
Definition at line 3449 of file ScalarEvolution.cpp.
References llvm::DenseMapBase< DerivedT, KeyT, ValueT, KeyInfoT, BucketT >::end(), llvm::DenseMapBase< DerivedT, KeyT, ValueT, KeyInfoT, BucketT >::erase(), llvm::DenseMapBase< DerivedT, KeyT, ValueT, KeyInfoT, BucketT >::find_as(), getSCEVValues(), I, Offset, and splitAddExpr().
Referenced by forgetLoop(), and forgetValue().
| void ScalarEvolution::findArrayDimensions | ( | SmallVectorImpl< const SCEV * > & | Terms, |
| SmallVectorImpl< const SCEV * > & | Sizes, | ||
| const SCEV * | ElementSize | ||
| ) | const |
Compute the array dimensions Sizes from the set of Terms extracted from the memory access function of this SCEVAddRecExpr (second step of delinearization).
Definition at line 9239 of file ScalarEvolution.cpp.
References llvm::SmallVectorTemplateCommon< T >::begin(), llvm::SmallVectorImpl< T >::clear(), containsParameters(), llvm::dbgs(), DEBUG, llvm::SmallVectorBase::empty(), llvm::SmallVectorTemplateCommon< T >::end(), llvm::SmallVectorImpl< T >::erase(), findArrayDimensionsRec(), llvm::SCEV::isZero(), numberOfTerms(), llvm::SmallVectorTemplateBase< T, isPodLike< T >::value >::push_back(), removeConstantFactors(), and llvm::SmallVectorTemplateCommon< T >::size().
Referenced by delinearize().
This method should be called by the client when it has changed a loop in a way that may effect ScalarEvolution's ability to compute a trip count, or if the loop is deleted.
This call is potentially expensive for large loop bodies.
Definition at line 5558 of file ScalarEvolution.cpp.
References llvm::SmallVectorBase::empty(), llvm::DenseMapBase< DerivedT, KeyT, ValueT, KeyInfoT, BucketT >::end(), eraseValueFromMap(), llvm::DenseMapBase< DerivedT, KeyT, ValueT, KeyInfoT, BucketT >::find_as(), llvm::SmallPtrSetImpl< PtrType >::insert(), L, llvm::SmallVectorImpl< T >::pop_back_val(), PushDefUseChildren(), and PushLoopPHIs().
Referenced by foldBlockIntoPredecessor(), llvm::formLCSSA(), llvm::peelLoop(), llvm::LoopDeletionPass::runImpl(), separateNestedLoop(), simplifyOneLoop(), llvm::UnrollLoop(), and llvm::UnrollRuntimeLoopRemainder().
Called when the client has changed the disposition of values in this loop.
We don't have a way to invalidate per-loop dispositions. Clear and recompute is simpler.
Definition at line 1389 of file ScalarEvolution.h.
Referenced by simplifyOneLoop(), and sinkLoopInvariantInstructions().
| void ScalarEvolution::forgetValue | ( | Value * | V | ) |
This method should be called by the client when it has changed a value in a way that may effect its value, or which may disconnect it from a def-use chain linking it to a loop.
Definition at line 5602 of file ScalarEvolution.cpp.
References llvm::dyn_cast(), llvm::SmallVectorBase::empty(), llvm::DenseMapBase< DerivedT, KeyT, ValueT, KeyInfoT, BucketT >::end(), eraseValueFromMap(), llvm::DenseMapBase< DerivedT, KeyT, ValueT, KeyInfoT, BucketT >::find_as(), llvm::SmallPtrSetImpl< PtrType >::insert(), llvm::SmallVectorImpl< T >::pop_back_val(), llvm::SmallVectorTemplateBase< T, isPodLike< T >::value >::push_back(), and PushDefUseChildren().
Referenced by simplifyOneLoop().
| const SCEV * ScalarEvolution::getAddExpr | ( | SmallVectorImpl< const SCEV * > & | Ops, |
| SCEV::NoWrapFlags | Flags = SCEV::FlagAnyWrap |
||
| ) |
Get a canonical add expression, or something simpler if possible.
Definition at line 2097 of file ScalarEvolution.cpp.
References llvm::MCID::Add, llvm::FoldingSetNodeID::AddInteger(), llvm::AddOne(), llvm::FoldingSetNodeID::AddPointer(), llvm::BumpPtrAllocatorImpl< AllocatorT, SlabSize, SizeThreshold >::Allocate(), llvm::SmallVectorImpl< T >::append(), assert(), llvm::SmallVectorTemplateCommon< T >::begin(), C, llvm::SmallVectorImpl< T >::clear(), CollectAddOperandsWithScales(), llvm::SmallVectorTemplateCommon< T >::data(), llvm::SmallVectorBase::empty(), llvm::SmallVectorTemplateCommon< T >::end(), llvm::SmallVectorImpl< T >::erase(), llvm::DenseMapBase< DenseMap< KeyT, ValueT, KeyInfoT, BucketT >, KeyT, ValueT, KeyInfoT, BucketT >::find(), llvm::SCEV::FlagAnyWrap, llvm::SCEV::FlagNSW, llvm::SCEV::FlagNUW, llvm::SCEV::FlagNW, getAddRecExpr(), getAnyExtendExpr(), getConstant(), getEffectiveSCEVType(), llvm::SCEVAddRecExpr::getLoop(), getMulExpr(), llvm::SCEVNAryExpr::getNoWrapFlags(), llvm::SCEVNAryExpr::getNumOperands(), getOne(), llvm::SCEVCastExpr::getOperand(), llvm::SCEVNAryExpr::getOperand(), llvm::SCEVAddRecExpr::getStart(), getTruncateExpr(), llvm::Intrinsic::getType(), llvm::SCEVCastExpr::getType(), llvm::SCEV::getType(), getTypeSizeInBits(), getZero(), GroupByComplexity(), i, llvm::FoldingSetNodeID::Intern(), isLoopInvariant(), llvm::SCEVNAryExpr::op_begin(), llvm::SCEVNAryExpr::op_end(), llvm::SmallVectorTemplateBase< T, isPodLike< T >::value >::push_back(), llvm::scAddExpr, llvm::scAddRecExpr, llvm::scMulExpr, setFlags(), llvm::SCEVCommutativeExpr::setNoWrapFlags(), llvm::SmallVectorTemplateCommon< T >::size(), StrengthenNoWrapFlags(), and llvm::APInt::ult().
Referenced by canBeCheaplyTransformed(), llvm::SCEVAddRecExpr::evaluateAtIteration(), ExposePointerBase(), ExtractImmediate(), ExtractSymbol(), FactorOutConstant(), genLoopLimit(), getExactSDiv(), getExtendAddRecStart(), getGEPExpr(), getMinusSCEV(), getMulExpr(), llvm::SCEVAddRecExpr::getPostIncExpr(), getPreStartForExtend(), getSignExtendExpr(), getSmallConstantTripMultiple(), getTruncateExpr(), getUDivExpr(), getZeroExtendExpr(), llvm::RuntimePointerChecking::insert(), llvm::isConsecutiveAccess(), IsIncrementNSW(), IsIncrementNUW(), SimplifyAddOperands(), SimplifyICmpOperands(), llvm::InductionDescriptor::transform(), llvm::UnrollRuntimeLoopRemainder(), and llvm::SCEVRewriteVisitor< SCEVLoopAddRecRewriter >::visitAddExpr().
|
inline |
Definition at line 1156 of file ScalarEvolution.h.
|
inline |
Definition at line 1161 of file ScalarEvolution.h.
| const SCEV * ScalarEvolution::getAddRecExpr | ( | const SCEV * | Start, |
| const SCEV * | Step, | ||
| const Loop * | L, | ||
| SCEV::NoWrapFlags | Flags | ||
| ) |
Get an add recurrence expression for the specified loop.
Simplify the expression as much as possible.
Definition at line 2940 of file ScalarEvolution.cpp.
References llvm::SmallVectorImpl< T >::append(), llvm::SCEV::FlagNW, L, maskFlags(), and llvm::SmallVectorTemplateBase< T, isPodLike< T >::value >::push_back().
Referenced by DoInitialMatch(), ExposePointerBase(), ExtractImmediate(), ExtractSymbol(), FactorOutConstant(), getAddExpr(), getAddRecExpr(), getAnyExtendExpr(), getMulExpr(), llvm::SCEVAddRecExpr::getNumIterationsInRange(), getPreStartForExtend(), getSignExtendExpr(), llvm::SCEVAddRecExpr::getStepRecurrence(), getTruncateExpr(), getUDivExpr(), getZeroExtendExpr(), isLoopBackedgeGuardedByCond(), SplitAddRecs(), llvm::SCEVRewriteVisitor< SCEVLoopAddRecRewriter >::visitAddRecExpr(), and llvm::SCEVLoopAddRecRewriter::visitAddRecExpr().
| const SCEV * ScalarEvolution::getAddRecExpr | ( | SmallVectorImpl< const SCEV * > & | Operands, |
| const Loop * | L, | ||
| SCEV::NoWrapFlags | Flags | ||
| ) |
Get an add recurrence expression for the specified loop.
Simplify the expression as much as possible.
Definition at line 2958 of file ScalarEvolution.cpp.
References llvm::FoldingSetNodeID::AddInteger(), llvm::FoldingSetNodeID::AddPointer(), llvm::all_of(), llvm::BumpPtrAllocatorImpl< AllocatorT, SlabSize, SizeThreshold >::Allocate(), assert(), llvm::SmallVectorTemplateCommon< T >::back(), llvm::SmallVectorTemplateCommon< T >::begin(), llvm::LoopBase< N, M >::contains(), llvm::DominatorTree::dominates(), llvm::SmallVectorTemplateCommon< T >::end(), llvm::SCEV::FlagAnyWrap, llvm::SCEV::FlagNW, fuzzer::Flags, getAddRecExpr(), getEffectiveSCEVType(), llvm::LoopBase< N, M >::getHeader(), llvm::LoopBase< N, M >::getLoopDepth(), llvm::Intrinsic::getType(), i, llvm::FoldingSetNodeID::Intern(), isLoopInvariant(), llvm::SCEV::isZero(), L, maskFlags(), llvm::SmallVectorTemplateBase< T, isPodLike< T >::value >::pop_back(), llvm::scAddRecExpr, llvm::SCEVAddRecExpr::setNoWrapFlags(), llvm::SmallVectorTemplateCommon< T >::size(), and StrengthenNoWrapFlags().
|
inline |
Definition at line 1184 of file ScalarEvolution.h.
References llvm::SmallVectorTemplateCommon< T >::begin(), and llvm::SmallVectorTemplateCommon< T >::end().
getAnyExtendExpr - Return a SCEV for the given operand extended with unspecified bits out to the given type.
Definition at line 1905 of file ScalarEvolution.cpp.
References assert(), llvm::SCEV::FlagNW, getAddRecExpr(), getEffectiveSCEVType(), getSignExtendExpr(), getTruncateOrNoop(), llvm::SCEV::getType(), getTypeSizeInBits(), getZeroExtendExpr(), isSCEVable(), llvm::SmallVectorTemplateBase< T, isPodLike< T >::value >::push_back(), and llvm::PPCISD::SC.
Referenced by getAddExpr(), and getNoopOrAnyExtend().
If the specified loop has a predictable backedge-taken count, return it, otherwise return a SCEVCouldNotCompute object.
The backedge-taken count is the number of times the loop header will be branched to from within the loop. This is one less than the trip count of the loop, since it doesn't count the first iteration, when the header is branched to from outside the loop.
Note that it is not valid to call this method on a loop without a loop-invariant backedge-taken count (see hasLoopInvariantBackedgeTakenCount).
Definition at line 5441 of file ScalarEvolution.cpp.
Referenced by canExpandBackedgeTakenCount(), getLoopBackedgeTakenCounts(), getPreStartForExtend(), hasLoopInvariantBackedgeTakenCount(), llvm::IVUsers::print(), PrintLoopInfo(), and llvm::UnrollRuntimeLoopRemainder().
| ScalarEvolution::BlockDisposition ScalarEvolution::getBlockDisposition | ( | const SCEV * | S, |
| const BasicBlock * | BB | ||
| ) |
Return the "disposition" of the given SCEV with respect to the given block.
Definition at line 9830 of file ScalarEvolution.cpp.
References D, DoesNotDominateBlock, and llvm::make_range().
Referenced by dominates(), and properlyDominates().
| const SCEV * ScalarEvolution::getConstant | ( | ConstantInt * | V | ) |
Definition at line 326 of file ScalarEvolution.cpp.
References llvm::FoldingSetNodeID::AddInteger(), llvm::FoldingSetNodeID::AddPointer(), llvm::FoldingSetNodeID::Intern(), and llvm::scConstant.
Referenced by BinomialCoefficient(), DoInitialMatch(), EvaluateConstantChrecAtConstant(), ExposePointerBase(), llvm::AlignmentFromAssumptionsPass::extractAlignmentInfo(), ExtractImmediate(), ExtractSymbol(), FactorOutConstant(), getAddExpr(), getConstant(), getExactSDiv(), getMulExpr(), getNegativeSCEV(), getNotSCEV(), llvm::SCEVAddRecExpr::getNumIterationsInRange(), getOffsetOfExpr(), getSignedOverflowLimitForStep(), getSignExtendExpr(), getSizeOfExpr(), getSMaxExpr(), getStartForNegStride(), getTruncateExpr(), getUDivExactExpr(), getUDivExpr(), getUMaxExpr(), getUnsignedOverflowLimitForStep(), getZeroExtendExpr(), llvm::RuntimePointerChecking::insert(), llvm::isConsecutiveAccess(), llvm::InductionDescriptor::isInductionPHI(), SimplifyAddOperands(), SimplifyICmpOperands(), SolveLinEquationWithOverflow(), SolveQuadraticEquation(), SplitAddRecs(), llvm::UnrolledInstAnalyzer::UnrolledInstAnalyzer(), llvm::UnrollRuntimeLoopRemainder(), and llvm::SCEVParameterRewriter::visitUnknown().
Definition at line 337 of file ScalarEvolution.cpp.
References llvm::ConstantInt::get(), getConstant(), and getContext().
Definition at line 342 of file ScalarEvolution.cpp.
References llvm::ConstantInt::get(), getConstant(), and getEffectiveSCEVType().
|
inline |
Definition at line 1115 of file ScalarEvolution.h.
References F.
Referenced by BinomialCoefficient(), FactorOutConstant(), getConstant(), getMulExpr(), llvm::SCEVAddRecExpr::getNumIterationsInRange(), getPreStartForExtend(), getSignExtendExpr(), getSMaxExpr(), getUDivExpr(), getUMaxExpr(), getZeroExtendExpr(), isAddRecSExtable(), isAddSExtable(), isMulSExtable(), SimplifyICmpOperands(), and SolveQuadraticEquation().
Definition at line 3388 of file ScalarEvolution.cpp.
Referenced by BinomialCoefficient(), llvm::SCEVAddRecExpr::getNumIterationsInRange(), getSmallConstantTripMultiple(), isLoopBackedgeGuardedByCond(), mustBeFiniteCountedLoop(), and SolveLinEquationWithOverflow().
|
inline |
Return the DataLayout associated with the module this SCEV instance is operating on.
Definition at line 1578 of file ScalarEvolution.h.
References F.
Referenced by getEffectiveSCEVType(), GetMinTrailingZeros(), getOffsetOfExpr(), getSizeOfExpr(), and getTypeSizeInBits().
Return a type with the same bitwidth as the given type and which represents how SCEV will treat the given type, for which isSCEVable must return true.
For pointer types, this is the pointer-sized integer type.
Definition at line 3377 of file ScalarEvolution.cpp.
References assert(), getDataLayout(), llvm::DataLayout::getIntPtrType(), llvm::Type::isIntegerTy(), llvm::Type::isPointerTy(), and isSCEVable().
Referenced by llvm::SCEVAAResult::alias(), canBeCheaplyTransformed(), DoInitialMatch(), genLoopLimit(), getAddExpr(), getAddRecExpr(), getAnyExtendExpr(), getConstant(), getElementSize(), getGEPExpr(), getIncrmentFactorSCEV(), getMulExpr(), getNegativeSCEV(), getNotSCEV(), getSignExtendExpr(), getSMaxExpr(), getTruncateExpr(), getUDivExpr(), getUMaxExpr(), getZeroExtendExpr(), isExistingPhi(), and visitIVCast().
| const SCEV * ScalarEvolution::getElementSize | ( | Instruction * | Inst | ) |
Return the size of an element read or written by Inst.
Definition at line 9226 of file ScalarEvolution.cpp.
References getEffectiveSCEVType(), getSizeOfExpr(), llvm::PointerType::getUnqual(), llvm::SPII::Load, and llvm::SPII::Store.
| const SCEVPredicate * ScalarEvolution::getEqualPredicate | ( | const SCEVUnknown * | LHS, |
| const SCEVConstant * | RHS | ||
| ) |
Definition at line 10102 of file ScalarEvolution.cpp.
References llvm::FoldingSetNodeID::AddInteger(), llvm::FoldingSetNodeID::AddPointer(), Eq(), llvm::FoldingSetNodeID::Intern(), and llvm::SCEVPredicate::P_Equal.
Referenced by llvm::replaceSymbolicStrideSCEV().
| const SCEV * ScalarEvolution::getExitCount | ( | Loop * | L, |
| BasicBlock * | ExitingBlock | ||
| ) |
Get the expression for the number of loop iterations for which this loop is guaranteed not to exit via ExitingBlock.
Otherwise return SCEVCouldNotCompute.
Definition at line 5431 of file ScalarEvolution.cpp.
Referenced by getSmallConstantTripCount(), getSmallConstantTripMultiple(), and mustBeFiniteCountedLoop().
| const SCEV * ScalarEvolution::getGEPExpr | ( | GEPOperator * | GEP, |
| const SmallVectorImpl< const SCEV * > & | IndexExprs | ||
| ) |
Returns an expression for a GEP.
GEP The GEP. The indices contained in the GEP itself are ignored, instead we use IndexExprs. IndexExprs The expressions for the indices.
Definition at line 3050 of file ScalarEvolution.cpp.
References llvm::SCEV::FlagAnyWrap, llvm::SCEV::FlagNSW, llvm::ArrayType::get(), getAddExpr(), getEffectiveSCEVType(), getMulExpr(), getOffsetOfExpr(), llvm::GEPOperator::getPointerOperand(), getSCEV(), getSizeOfExpr(), llvm::GEPOperator::getSourceElementType(), getTruncateOrSignExtend(), llvm::SCEV::getType(), getZero(), llvm::ConstantInt::getZExtValue(), and llvm::GEPOperator::isInBounds().
| ScalarEvolution::LoopDisposition ScalarEvolution::getLoopDisposition | ( | const SCEV * | S, |
| const Loop * | L | ||
| ) |
Return the "disposition" of the given SCEV with respect to the given loop.
Definition at line 9727 of file ScalarEvolution.cpp.
References D, L, LoopVariant, and llvm::make_range().
Referenced by hasComputableLoopEvolution(), isLoopInvariant(), and print().
Similar to getBackedgeTakenCount, except return the least SCEV value that is known never to be less than the actual backedge taken count.
Definition at line 5447 of file ScalarEvolution.cpp.
Referenced by getSignExtendExpr(), getSmallConstantMaxTripCount(), getZeroExtendExpr(), mustBeFiniteCountedLoop(), PrintLoopInfo(), and llvm::LoopDeletionPass::runImpl().
Determine the minimum number of zero bits that S is guaranteed to end in (at every loop iteration).
It is, at the same time, the minimum number of times S is divisible by 2. For example, given {4,+,8} it returns 2. If S is guaranteed to be 0, it returns the bitwidth of S.
Definition at line 4413 of file ScalarEvolution.cpp.
References A, C, llvm::computeKnownBits(), E, getDataLayout(), getTypeSizeInBits(), i, and fuzzer::min().
| const SCEV * ScalarEvolution::getMinusSCEV | ( | const SCEV * | LHS, |
| const SCEV * | RHS, | ||
| SCEV::NoWrapFlags | Flags = SCEV::FlagAnyWrap |
||
| ) |
Return LHS-RHS. Minus is represented in SCEV as A+B*-1.
Definition at line 3544 of file ScalarEvolution.cpp.
References llvm::SCEV::FlagAnyWrap, llvm::SCEV::FlagNSW, getAddExpr(), getNegativeSCEV(), llvm::ConstantRange::getSignedMin(), getSignedRange(), llvm::SCEV::getType(), getZero(), isKnownNonNegative(), llvm::APInt::isMinSignedValue(), and maskFlags().
Referenced by llvm::SCEVAAResult::alias(), BinomialCoefficient(), llvm::AlignmentFromAssumptionsPass::extractAlignmentInfo(), getMinFromExprs(), getNewAlignment(), getNewAlignmentDiff(), getNotSCEV(), getStartForNegStride(), and llvm::isConsecutiveAccess().
| const SCEV * ScalarEvolution::getMulExpr | ( | SmallVectorImpl< const SCEV * > & | Ops, |
| SCEV::NoWrapFlags | Flags = SCEV::FlagAnyWrap |
||
| ) |
Get a canonical multiply expression, or something simpler if possible.
Definition at line 2508 of file ScalarEvolution.cpp.
References llvm::MCID::Add, llvm::FoldingSetNodeID::AddInteger(), llvm::FoldingSetNodeID::AddPointer(), llvm::BumpPtrAllocatorImpl< AllocatorT, SlabSize, SizeThreshold >::Allocate(), llvm::SmallVectorImpl< T >::append(), assert(), llvm::SmallVectorTemplateCommon< T >::begin(), Choose(), clearFlags(), containsConstantSomewhere(), llvm::dyn_cast(), llvm::SmallVectorBase::empty(), llvm::SmallVectorTemplateCommon< T >::end(), llvm::SmallVectorImpl< T >::erase(), llvm::SCEV::FlagAnyWrap, llvm::SCEV::FlagNSW, llvm::SCEV::FlagNUW, llvm::SCEV::FlagNW, llvm::ConstantInt::get(), getAddExpr(), getAddRecExpr(), getConstant(), getContext(), getEffectiveSCEVType(), llvm::SCEVAddRecExpr::getLoop(), llvm::SCEVNAryExpr::getNoWrapFlags(), llvm::SCEVNAryExpr::getNumOperands(), llvm::SCEVNAryExpr::getOperand(), llvm::Intrinsic::getType(), llvm::SCEVNAryExpr::getType(), getTypeSizeInBits(), getZero(), GroupByComplexity(), i, llvm::FoldingSetNodeID::Intern(), isLoopInvariant(), maskFlags(), fuzzer::min(), MulOpsInlineThreshold, llvm::SmallVectorTemplateBase< T, isPodLike< T >::value >::push_back(), llvm::SmallVectorImpl< T >::reserve(), llvm::scAddRecExpr, llvm::scMulExpr, llvm::SCEVCommutativeExpr::setNoWrapFlags(), llvm::SmallVectorTemplateCommon< T >::size(), StrengthenNoWrapFlags(), and umul_ov().
Referenced by BinomialCoefficient(), CollectAddOperandsWithScales(), CollectSubexprs(), DoInitialMatch(), llvm::SCEVAddRecExpr::evaluateAtIteration(), FactorOutConstant(), findArrayDimensionsRec(), getAddExpr(), getExactSDiv(), getGEPExpr(), getNegativeSCEV(), getNewAlignmentDiff(), getSignExtendExpr(), getStartForNegStride(), getTruncateExpr(), getUDivExactExpr(), getUDivExpr(), getZeroExtendExpr(), removeConstantFactors(), llvm::InductionDescriptor::transform(), and llvm::SCEVRewriteVisitor< SCEVLoopAddRecRewriter >::visitMulExpr().
|
inline |
Definition at line 1168 of file ScalarEvolution.h.
|
inline |
Definition at line 1173 of file ScalarEvolution.h.
| const SCEV * ScalarEvolution::getNegativeSCEV | ( | const SCEV * | V, |
| SCEV::NoWrapFlags | Flags = SCEV::FlagAnyWrap |
||
| ) |
Return the SCEV object corresponding to -V.
Return a SCEV corresponding to -V = -1*V.
Definition at line 3519 of file ScalarEvolution.cpp.
References llvm::Constant::getAllOnesValue(), getConstant(), getEffectiveSCEVType(), getMulExpr(), llvm::ConstantExpr::getNeg(), llvm::SCEV::getType(), and llvm::AArch64CC::VC.
Referenced by canBeCheaplyTransformed(), getIncrmentFactorSCEV(), getMinusSCEV(), and llvm::SCEVAddRecExpr::getNumIterationsInRange().
Return a SCEV corresponding to a conversion of the input value to the specified type.
If the type must be extended, it is extended with unspecified bits. The conversion must not be narrowing.
Definition at line 3636 of file ScalarEvolution.cpp.
References assert(), getAnyExtendExpr(), llvm::SCEV::getType(), getTypeSizeInBits(), llvm::Type::isIntegerTy(), and llvm::Type::isPointerTy().
Return a SCEV corresponding to a conversion of the input value to the specified type.
If the type must be extended, it is sign extended. The conversion must not be narrowing.
Definition at line 3623 of file ScalarEvolution.cpp.
References assert(), getSignExtendExpr(), llvm::SCEV::getType(), getTypeSizeInBits(), llvm::Type::isIntegerTy(), and llvm::Type::isPointerTy().
Referenced by getNewAlignment().
Return a SCEV corresponding to a conversion of the input value to the specified type.
If the type must be extended, it is zero extended. The conversion must not be narrowing.
Definition at line 3610 of file ScalarEvolution.cpp.
References assert(), llvm::SCEV::getType(), getTypeSizeInBits(), getZeroExtendExpr(), llvm::Type::isIntegerTy(), and llvm::Type::isPointerTy().
Referenced by getUMaxFromMismatchedTypes(), and getUMinFromMismatchedTypes().
Return the SCEV object corresponding to ~V.
Return a SCEV corresponding to ~V = -1-V.
Definition at line 3532 of file ScalarEvolution.cpp.
References llvm::Constant::getAllOnesValue(), getConstant(), getEffectiveSCEVType(), getMinusSCEV(), llvm::ConstantExpr::getNot(), llvm::SCEV::getType(), and llvm::AArch64CC::VC.
Referenced by getSMinExpr(), getUMinExpr(), and IsMinConsistingOf().
| const SCEV * ScalarEvolution::getOffsetOfExpr | ( | Type * | IntTy, |
| StructType * | STy, | ||
| unsigned | FieldNo | ||
| ) |
Return an expression for offsetof on the given field with type IntTy.
Definition at line 3322 of file ScalarEvolution.cpp.
References getConstant(), and getDataLayout().
Referenced by getGEPExpr().
Return a SCEV for the constant 1 of a specific type.
Definition at line 1209 of file ScalarEvolution.h.
Referenced by getAddExpr(), getSmallConstantTripMultiple(), isLoopBackedgeGuardedByCond(), and llvm::replaceSymbolicStrideSCEV().
Transitively follow the chain of pointer-type operands until reaching a SCEV that does not have a single pointer operand.
This returns a SCEVUnknown pointer for well-formed pointer-type expressions, but corner cases do exist.
Definition at line 3687 of file ScalarEvolution.cpp.
References llvm::SCEV::getType(), and llvm::Type::isPointerTy().
| const SCEV * ScalarEvolution::getPredicatedBackedgeTakenCount | ( | const Loop * | L, |
| SCEVUnionPredicate & | Predicates | ||
| ) |
Similar to getBackedgeTakenCount, except it will add a set of SCEV predicates to Predicates that are required to be true in order for the answer to be correct.
Predicates can be checked with run-time checks and can be used to perform loop versioning.
Definition at line 5436 of file ScalarEvolution.cpp.
Referenced by llvm::PredicatedScalarEvolution::getBackedgeTakenCount(), and PrintLoopInfo().
Return a SCEV expression for the full generality of the specified expression.
Return an existing SCEV if it exists, otherwise analyze the expression and create a new one.
Definition at line 3471 of file ScalarEvolution.cpp.
References assert(), llvm::Value::getType(), llvm::DenseMapBase< DerivedT, KeyT, ValueT, KeyInfoT, BucketT >::insert(), isSCEVable(), Offset, SCEVCallbackVH, and splitAddExpr().
Referenced by llvm::IVUsers::AddUsersImpl(), llvm::SCEVAAResult::alias(), llvm::DependenceInfo::depends(), DoInitialMatch(), expandBounds(), llvm::AlignmentFromAssumptionsPass::extractAlignmentInfo(), findIVOperand(), FindLoopCounter(), genLoopLimit(), getAddressAccessSCEV(), llvm::PredicatedScalarEvolution::getAsAddRec(), getGEPExpr(), getNewAlignment(), llvm::IVUsers::getReplacementExpr(), llvm::PredicatedScalarEvolution::getSCEV(), getSCEVAtScope(), llvm::DependenceInfo::getSplitIteration(), llvm::getStrideFromPointer(), llvm::isConsecutiveAccess(), isExistingPhi(), isHighCostExpansion(), llvm::InductionDescriptor::isInductionPHI(), isProfitableChain(), isSimpleIVUser(), llvm::LoopAccessInfo::isUniform(), print(), llvm::PredicatedScalarEvolution::print(), llvm::AlignmentFromAssumptionsPass::processAssumption(), llvm::replaceSymbolicStrideSCEV(), llvm::stripGetElementPtr(), and llvm::InductionDescriptor::transform().
Return a SCEV expression for the specified value at the specified scope in the program.
The L value specifies a loop nest to evaluate the expression at, where null is the top-level or a specified loop is immediately inside of the loop.
This method can be used to compute the exit value for a variable defined in a loop by querying what the value will hold in the parent loop.
In the case that a relevant loop exit value cannot be computed, the original value V is returned.
Definition at line 6695 of file ScalarEvolution.cpp.
References C, and llvm::reverse().
Referenced by getSCEVAtScope(), isInteresting(), and print().
This is a convenience function which does getSCEVAtScope(getSCEV(V), L).
Definition at line 7005 of file ScalarEvolution.cpp.
References getSCEV(), and getSCEVAtScope().
Return the Value set from which the SCEV expr is generated.
Return the ValueOffsetPair set for S.
S can be represented by the value and offset from any ValueOffsetPair in the set.
Definition at line 3432 of file ScalarEvolution.cpp.
References assert(), llvm::DenseMapBase< DerivedT, KeyT, ValueT, KeyInfoT, BucketT >::count(), llvm::DenseMapBase< DerivedT, KeyT, ValueT, KeyInfoT, BucketT >::end(), llvm::DenseMapBase< DerivedT, KeyT, ValueT, KeyInfoT, BucketT >::find_as(), SI, and VerifySCEVMap.
Referenced by eraseValueFromMap().
|
inline |
Determine the signed range for a particular SCEV.
Definition at line 1405 of file ScalarEvolution.h.
Referenced by CanBeSMax(), CanBeSMin(), getMinusSCEV(), getSignedOverflowLimitForStep(), getSignExtendExpr(), getZeroExtendExpr(), isKnownNegative(), isKnownNonNegative(), isKnownNonPositive(), isKnownPositive(), print(), SimplifyICmpOperands(), and StrengthenNoWrapFlags().
Definition at line 1675 of file ScalarEvolution.cpp.
References llvm::FoldingSetNodeID::AddInteger(), llvm::FoldingSetNodeID::AddPointer(), assert(), llvm::AssumptionCache::assumptions(), llvm::ConstantRange::contains(), llvm::dyn_cast(), llvm::SCEV::FlagNSW, llvm::SCEV::FlagNW, llvm::IntegerType::get(), getAddExpr(), getAddRecExpr(), getConstant(), getContext(), getEffectiveSCEVType(), getMaxBackedgeTakenCount(), getMulExpr(), llvm::ConstantExpr::getSExt(), getSignedOverflowLimitForStep(), getSignedRange(), getTruncateOrSignExtend(), getTruncateOrZeroExtend(), llvm::SCEV::getType(), getTypeSizeInBits(), getZero(), getZeroExtendExpr(), llvm::FoldingSetNodeID::Intern(), isKnownNonNegative(), isLoopBackedgeGuardedByCond(), isLoopEntryGuardedByCond(), llvm::APInt::isPowerOf2(), isSCEVable(), llvm::APInt::isStrictlyPositive(), L, llvm::SmallVectorTemplateBase< T, isPodLike< T >::value >::push_back(), llvm::PPCISD::SC, llvm::scSignExtend, llvm::ConstantRange::sextOrTrunc(), llvm::ConstantRange::signExtend(), llvm::ARM_MB::ST, llvm::ConstantRange::truncate(), and llvm::APInt::ugt().
Referenced by llvm::AlignmentFromAssumptionsPass::extractAlignmentInfo(), getAnyExtendExpr(), getNoopOrSignExtend(), getTruncateOrSignExtend(), getZeroExtendExpr(), isAddRecSExtable(), isAddSExtable(), IsIncrementNSW(), isMulSExtable(), and llvm::SCEVRewriteVisitor< SCEVLoopAddRecRewriter >::visitSignExtendExpr().
Return an expression for sizeof AllocTy that is type IntTy.
Definition at line 3315 of file ScalarEvolution.cpp.
References getConstant(), and getDataLayout().
Referenced by genLoopLimit(), getElementSize(), getGEPExpr(), and getIncrmentFactorSCEV().
Returns the upper bound of the loop trip count as a normal unsigned value.
Returns 0 if the trip count is unknown or not constant.
Definition at line 5369 of file ScalarEvolution.cpp.
References llvm::dyn_cast(), getConstantTripCount(), and getMaxBackedgeTakenCount().
Referenced by tryToUnrollLoop().
Returns the maximum trip count of the loop if it is a single-exit loop and we can compute a small maximum for that loop.
Implemented in terms of the getSmallConstantTripCount overload with the single exiting block passed to it. See that routine for details.
Definition at line 5351 of file ScalarEvolution.cpp.
References llvm::LoopBase< N, M >::getExitingBlock().
Referenced by tryToUnrollLoop().
| unsigned ScalarEvolution::getSmallConstantTripCount | ( | Loop * | L, |
| BasicBlock * | ExitingBlock | ||
| ) |
Returns the maximum trip count of this loop as a normal unsigned value.
Returns 0 if the trip count is unknown or not constant. This "trip count" assumes that control exits via ExitingBlock. More precisely, it is the number of times that control may reach ExitingBlock before taking the branch. For loops with multiple exits, it may not be the number times that the loop header executes if the loop exits prematurely via another branch.
Definition at line 5359 of file ScalarEvolution.cpp.
References assert(), llvm::dyn_cast(), getConstantTripCount(), getExitCount(), and llvm::LoopBase< N, M >::isLoopExiting().
Returns the largest constant divisor of the trip count of the loop if it is a single-exit loop and we can compute a small maximum for that loop.
Implemented in terms of the getSmallConstantTripMultiple overload with the single exiting block passed to it. See that routine for details.
Definition at line 5375 of file ScalarEvolution.cpp.
References llvm::LoopBase< N, M >::getExitingBlock().
Referenced by tryToUnrollLoop().
| unsigned ScalarEvolution::getSmallConstantTripMultiple | ( | Loop * | L, |
| BasicBlock * | ExitingBlock | ||
| ) |
Returns the largest constant divisor of the trip count of this loop as a normal unsigned value, if possible.
This means that the actual trip count is always a multiple of the returned value (don't forget the trip count could very well be zero as well!). As explained in the comments for getSmallConstantTripCount, this assumes that control exits the loop via ExitingBlock.
This means that the actual trip count is always a multiple of the returned value (don't forget the trip count could very well be zero as well!).
Returns 1 if the trip count is unknown or not guaranteed to be the multiple of a constant (which is also the case if the trip count is simply constant, use getSmallConstantTripCount for that case), Will also return 1 if the trip count is very large (>= 2^32).
As explained in the comments for getSmallConstantTripCount, this assumes that control exits the loop via ExitingBlock.
Definition at line 5396 of file ScalarEvolution.cpp.
References assert(), llvm::dyn_cast(), llvm::APInt::getActiveBits(), getAddExpr(), getCouldNotCompute(), getExitCount(), getOne(), llvm::SCEVConstant::getValue(), llvm::ConstantInt::getValue(), llvm::ConstantInt::getZExtValue(), and llvm::LoopBase< N, M >::isLoopExiting().
Definition at line 3101 of file ScalarEvolution.cpp.
Referenced by getSMaxExpr(), getSMinExpr(), IntersectRange(), and llvm::SCEVRewriteVisitor< SCEVLoopAddRecRewriter >::visitSMaxExpr().
| const SCEV * ScalarEvolution::getSMaxExpr | ( | SmallVectorImpl< const SCEV * > & | Operands | ) |
Definition at line 3108 of file ScalarEvolution.cpp.
References llvm::BumpPtrAllocatorImpl< AllocatorT, SlabSize, SizeThreshold >::Allocate(), llvm::SmallVectorImpl< T >::append(), assert(), llvm::SmallVectorTemplateCommon< T >::begin(), llvm::SmallVectorBase::empty(), llvm::SmallVectorTemplateCommon< T >::end(), llvm::SmallVectorImpl< T >::erase(), llvm::ConstantInt::get(), getConstant(), getContext(), getEffectiveSCEVType(), getSMaxExpr(), llvm::Intrinsic::getType(), GroupByComplexity(), i, llvm::CmpInst::ICMP_SGE, llvm::CmpInst::ICMP_SLE, isKnownPredicate(), llvm::scSMaxExpr, llvm::SmallVectorTemplateCommon< T >::size(), and llvm::APIntOps::smax().
Definition at line 3303 of file ScalarEvolution.cpp.
References getNotSCEV(), and getSMaxExpr().
Referenced by IntersectRange().
Definition at line 1142 of file ScalarEvolution.cpp.
References llvm::FoldingSetNodeID::AddInteger(), llvm::FoldingSetNodeID::AddPointer(), assert(), llvm::SCEV::FlagAnyWrap, getAddExpr(), getAddRecExpr(), getConstant(), getEffectiveSCEVType(), getMulExpr(), llvm::ConstantExpr::getTrunc(), getTruncateOrSignExtend(), getTruncateOrZeroExtend(), llvm::SCEV::getType(), getTypeSizeInBits(), i, llvm::FoldingSetNodeID::Intern(), isSCEVable(), llvm::SmallVectorTemplateBase< T, isPodLike< T >::value >::push_back(), llvm::PPCISD::SC, llvm::scTruncate, and llvm::ARM_MB::ST.
Referenced by genLoopLimit(), getAddExpr(), getTruncateOrNoop(), getTruncateOrSignExtend(), getTruncateOrZeroExtend(), and llvm::SCEVRewriteVisitor< SCEVLoopAddRecRewriter >::visitTruncateExpr().
Return a SCEV corresponding to a conversion of the input value to the specified type.
The conversion must not be widening.
Definition at line 3649 of file ScalarEvolution.cpp.
References assert(), getTruncateExpr(), llvm::SCEV::getType(), getTypeSizeInBits(), llvm::Type::isIntegerTy(), and llvm::Type::isPointerTy().
Referenced by canBeCheaplyTransformed(), and getAnyExtendExpr().
Return a SCEV corresponding to a conversion of the input value to the specified type.
If the type must be extended, it is sign extended.
Definition at line 3596 of file ScalarEvolution.cpp.
References assert(), getSignExtendExpr(), getTruncateExpr(), llvm::SCEV::getType(), getTypeSizeInBits(), llvm::Type::isIntegerTy(), and llvm::Type::isPointerTy().
Referenced by getGEPExpr(), getSignExtendExpr(), and getTruncateExpr().
Return a SCEV corresponding to a conversion of the input value to the specified type.
If the type must be extended, it is zero extended.
Definition at line 3583 of file ScalarEvolution.cpp.
References assert(), getTruncateExpr(), llvm::SCEV::getType(), getTypeSizeInBits(), getZeroExtendExpr(), llvm::Type::isIntegerTy(), and llvm::Type::isPointerTy().
Referenced by BinomialCoefficient(), genLoopLimit(), getSignExtendExpr(), getStartForNegStride(), getTruncateExpr(), and getZeroExtendExpr().
| uint64_t ScalarEvolution::getTypeSizeInBits | ( | Type * | Ty | ) | const |
Return the size in bits of the specified type, for which isSCEVable must return true.
Definition at line 3369 of file ScalarEvolution.cpp.
References assert(), getDataLayout(), llvm::DataLayout::getTypeSizeInBits(), and isSCEVable().
Referenced by llvm::IVUsers::AddUsersImpl(), llvm::SCEVAAResult::alias(), BinomialCoefficient(), FindLoopCounter(), genLoopLimit(), getAddExpr(), getAnyExtendExpr(), GetMinTrailingZeros(), getMulExpr(), getNoopOrAnyExtend(), getNoopOrSignExtend(), getNoopOrZeroExtend(), llvm::SCEVAddRecExpr::getNumIterationsInRange(), getPreStartForExtend(), getSignedOverflowLimitForStep(), getSignExtendExpr(), getTruncateExpr(), getTruncateOrNoop(), getTruncateOrSignExtend(), getTruncateOrZeroExtend(), getUDivExpr(), getUMaxFromMismatchedTypes(), getUMinFromMismatchedTypes(), getUnsignedOverflowLimitForStep(), getZeroExtendExpr(), isAddRecSExtable(), isAddSExtable(), isMulSExtable(), and visitIVCast().
Get a canonical unsigned division expression, or something simpler if possible.
There is no representation for an exact udiv in SCEV IR, but we can attempt to remove factors from the LHS and RHS. We can't do this when it's not exact because the udiv may be clearing bits.
Definition at line 2885 of file ScalarEvolution.cpp.
References llvm::SmallVectorImpl< T >::append(), llvm::dyn_cast(), gcd(), getConstant(), getMulExpr(), llvm::SCEVNAryExpr::getNumOperands(), llvm::SCEVNAryExpr::getOperand(), getUDivExpr(), i, llvm::APInt::isIntN(), llvm::SCEVNAryExpr::op_begin(), llvm::SCEVNAryExpr::op_end(), and llvm::SmallVectorTemplateBase< T, isPodLike< T >::value >::push_back().
Get a canonical unsigned division expression, or something simpler if possible.
Get a canonical UDivExpr for a recurrence. {X,+,N}/C => {Y,+,N}/C where Y=X-(XN). Safe when CN=0.
Definition at line 2751 of file ScalarEvolution.cpp.
References A, llvm::FoldingSetNodeID::AddInteger(), llvm::FoldingSetNodeID::AddPointer(), assert(), llvm::SmallVectorImpl< T >::clear(), llvm::dyn_cast(), llvm::SCEV::FlagAnyWrap, llvm::SCEV::FlagNW, llvm::IntegerType::get(), getAddExpr(), getAddRecExpr(), llvm::SCEVConstant::getAPInt(), getConstant(), getContext(), getEffectiveSCEVType(), getMulExpr(), llvm::SCEV::getType(), getTypeSizeInBits(), llvm::ConstantExpr::getUDiv(), getZeroExtendExpr(), i, llvm::FoldingSetNodeID::Intern(), llvm::SmallVectorTemplateBase< T, isPodLike< T >::value >::push_back(), llvm::scUDivExpr, llvm::SmallVectorTemplateCommon< T >::size(), and llvm::APInt::urem().
Referenced by BinomialCoefficient(), getIncrmentFactorSCEV(), getNewAlignmentDiff(), getUDivExactExpr(), and llvm::SCEVRewriteVisitor< SCEVLoopAddRecRewriter >::visitUDivExpr().
Definition at line 3202 of file ScalarEvolution.cpp.
Referenced by getUMaxExpr(), getUMaxFromMismatchedTypes(), getUMinExpr(), llvm::RuntimePointerChecking::insert(), and llvm::SCEVRewriteVisitor< SCEVLoopAddRecRewriter >::visitUMaxExpr().
| const SCEV * ScalarEvolution::getUMaxExpr | ( | SmallVectorImpl< const SCEV * > & | Operands | ) |
Definition at line 3209 of file ScalarEvolution.cpp.
References llvm::BumpPtrAllocatorImpl< AllocatorT, SlabSize, SizeThreshold >::Allocate(), llvm::SmallVectorImpl< T >::append(), assert(), llvm::SmallVectorTemplateCommon< T >::begin(), llvm::SmallVectorBase::empty(), llvm::SmallVectorTemplateCommon< T >::end(), llvm::SmallVectorImpl< T >::erase(), llvm::ConstantInt::get(), getConstant(), getContext(), getEffectiveSCEVType(), llvm::Intrinsic::getType(), getUMaxExpr(), GroupByComplexity(), i, llvm::CmpInst::ICMP_UGE, llvm::CmpInst::ICMP_ULE, isKnownPredicate(), llvm::scUMaxExpr, llvm::SmallVectorTemplateCommon< T >::size(), and llvm::APIntOps::umax().
Promote the operands to the wider of the types using zero-extension, and then perform a umax operation with them.
Definition at line 3661 of file ScalarEvolution.cpp.
References getNoopOrZeroExtend(), llvm::SCEV::getType(), getTypeSizeInBits(), getUMaxExpr(), and getZeroExtendExpr().
Definition at line 3309 of file ScalarEvolution.cpp.
References getNotSCEV(), and getUMaxExpr().
Referenced by getUMinFromMismatchedTypes(), and llvm::RuntimePointerChecking::insert().
Promote the operands to the wider of the types using zero-extension, and then perform a umin operation with them.
Definition at line 3674 of file ScalarEvolution.cpp.
References getNoopOrZeroExtend(), llvm::SCEV::getType(), getTypeSizeInBits(), getUMinExpr(), and getZeroExtendExpr().
Definition at line 3332 of file ScalarEvolution.cpp.
References llvm::FoldingSetNodeID::AddInteger(), llvm::FoldingSetNodeID::AddPointer(), assert(), llvm::FoldingSetNodeID::Intern(), SCEVUnknown, and llvm::scUnknown.
Referenced by llvm::InductionDescriptor::isFPInductionPHI(), and llvm::SCEVParameterRewriter::visitUnknown().
|
inline |
Determine the unsigned range for a particular SCEV.
Definition at line 1399 of file ScalarEvolution.h.
Referenced by llvm::SCEVAAResult::alias(), CanBeSMax(), CanBeSMin(), getUnsignedOverflowLimitForStep(), getZeroExtendExpr(), mustBeFiniteCountedLoop(), print(), SimplifyICmpOperands(), and StrengthenNoWrapFlags().
| const SCEVPredicate * ScalarEvolution::getWrapPredicate | ( | const SCEVAddRecExpr * | AR, |
| SCEVWrapPredicate::IncrementWrapFlags | AddedFlags | ||
| ) |
Definition at line 10118 of file ScalarEvolution.cpp.
References llvm::FoldingSetNodeID::AddInteger(), llvm::FoldingSetNodeID::AddPointer(), llvm::FoldingSetNodeID::Intern(), and llvm::SCEVPredicate::P_Wrap.
Referenced by llvm::PredicatedScalarEvolution::setNoOverflow().
Return a SCEV for the constant 0 of a specific type.
Definition at line 1206 of file ScalarEvolution.h.
Referenced by llvm::AlignmentFromAssumptionsPass::extractAlignmentInfo(), getAddExpr(), getGEPExpr(), getMinusSCEV(), getMulExpr(), llvm::SCEVAddRecExpr::getNumIterationsInRange(), getSignExtendExpr(), and isLoopBackedgeGuardedByCond().
Definition at line 1479 of file ScalarEvolution.cpp.
References llvm::FoldingSetNodeID::AddInteger(), llvm::FoldingSetNodeID::AddPointer(), assert(), llvm::AssumptionCache::assumptions(), llvm::ConstantRange::contains(), llvm::SCEV::FlagNUW, llvm::SCEV::FlagNW, llvm::IntegerType::get(), getAddExpr(), getAddRecExpr(), getConstant(), getContext(), getEffectiveSCEVType(), getMaxBackedgeTakenCount(), llvm::APInt::getMaxValue(), llvm::APInt::getMinValue(), getMulExpr(), getSignedRange(), getSignExtendExpr(), getTruncateOrZeroExtend(), llvm::SCEV::getType(), getTypeSizeInBits(), getUnsignedRange(), llvm::ConstantExpr::getZExt(), llvm::CmpInst::ICMP_UGT, llvm::CmpInst::ICMP_ULT, llvm::FoldingSetNodeID::Intern(), isKnownNegative(), isKnownPositive(), isLoopBackedgeGuardedByCond(), isLoopEntryGuardedByCond(), isSCEVable(), L, N, llvm::SmallVectorTemplateBase< T, isPodLike< T >::value >::push_back(), llvm::PPCISD::SC, llvm::scZeroExtend, llvm::ARM_MB::ST, llvm::ConstantRange::truncate(), llvm::ConstantRange::zeroExtend(), and llvm::ConstantRange::zextOrTrunc().
Referenced by getAnyExtendExpr(), getNoopOrZeroExtend(), getSignExtendExpr(), getTruncateOrZeroExtend(), getUDivExpr(), getUMaxFromMismatchedTypes(), getUMinFromMismatchedTypes(), IsIncrementNUW(), and llvm::SCEVRewriteVisitor< SCEVLoopAddRecRewriter >::visitZeroExtendExpr().
Return true if the given SCEV changes value in a known way in the specified loop.
This property being true implies that the value is variant in the loop AND that we can emit an expression to compute the value of the expression at any particular loop iteration.
Definition at line 9825 of file ScalarEvolution.cpp.
References getLoopDisposition(), and LoopComputable.
Return true if the specified loop has an analyzable loop-invariant backedge-taken count.
Definition at line 9571 of file ScalarEvolution.cpp.
References getBackedgeTakenCount().
Referenced by llvm::IVUsers::print(), and PrintLoopInfo().
Test whether the given SCEV has Op as a direct or indirect operand.
Definition at line 9920 of file ScalarEvolution.cpp.
References llvm::SCEVExprContains().
| bool ScalarEvolution::invalidate | ( | Function & | F, |
| const PreservedAnalyses & | PA, | ||
| FunctionAnalysisManager::Invalidator & | Inv | ||
| ) |
Definition at line 10029 of file ScalarEvolution.cpp.
References llvm::PreservedAnalyses::getChecker(), and llvm::AnalysisManager< IRUnitT, ExtraArgTs >::Invalidator::invalidate().
Return true if the backedge taken count is either the value returned by getMaxBackedgeTakenCount or zero.
Definition at line 5451 of file ScalarEvolution.cpp.
Referenced by PrintLoopInfo(), and tryToUnrollLoop().
Test if the given expression is known to be negative.
Definition at line 7581 of file ScalarEvolution.cpp.
References llvm::ConstantRange::getSignedMax(), getSignedRange(), and llvm::APInt::isNegative().
Referenced by getSignedOverflowLimitForStep(), getZeroExtendExpr(), and isKnownNonZero().
Test if the given expression is known to be non-negative.
Definition at line 7589 of file ScalarEvolution.cpp.
References llvm::ConstantRange::getSignedMin(), getSignedRange(), and llvm::APInt::isNegative().
Referenced by getMinusSCEV(), getSignExtendExpr(), and StrengthenNoWrapFlags().
Test if the given expression is known to be non-positive.
Definition at line 7593 of file ScalarEvolution.cpp.
References llvm::ConstantRange::getSignedMax(), getSignedRange(), and llvm::APInt::isStrictlyPositive().
Test if the given expression is known to be non-zero.
Definition at line 7597 of file ScalarEvolution.cpp.
References isKnownNegative(), and isKnownPositive().
Test if the given expression is known to be positive.
Definition at line 7585 of file ScalarEvolution.cpp.
References llvm::ConstantRange::getSignedMin(), getSignedRange(), and llvm::APInt::isStrictlyPositive().
Referenced by getPreStartForExtend(), getSignedOverflowLimitForStep(), getZeroExtendExpr(), and isKnownNonZero().
| bool ScalarEvolution::isKnownPredicate | ( | ICmpInst::Predicate | Pred, |
| const SCEV * | LHS, | ||
| const SCEV * | RHS | ||
| ) |
Test if the given expression is known to satisfy the condition described by Pred, LHS, and RHS.
Definition at line 7601 of file ScalarEvolution.cpp.
References llvm::dyn_cast(), llvm::SCEVAddRecExpr::getLoop(), llvm::SCEVAddRecExpr::getPostIncExpr(), llvm::SCEVAddRecExpr::getStart(), isLoopBackedgeGuardedByCond(), isLoopEntryGuardedByCond(), and SimplifyICmpOperands().
Referenced by getSMaxExpr(), getUMaxExpr(), and IsKnownPredicateViaAddRecStart().
| bool ScalarEvolution::isLoopBackedgeGuardedByCond | ( | const Loop * | L, |
| ICmpInst::Predicate | Pred, | ||
| const SCEV * | LHS, | ||
| const SCEV * | RHS | ||
| ) |
Test whether the backedge of the loop is protected by a conditional between LHS and RHS.
isLoopBackedgeGuardedByCond - Test whether the backedge of the loop is protected by a conditional between LHS and RHS.
This is used to to eliminate casts.
Definition at line 7896 of file ScalarEvolution.cpp.
References assert(), llvm::DominatorTree::dominates(), llvm::dyn_cast(), llvm::SCEV::FlagNUW, llvm::SCEV::FlagNW, getAddRecExpr(), llvm::BranchInst::getCondition(), getCouldNotCompute(), llvm::LoopBase< N, M >::getHeader(), llvm::DominatorTreeBase< N >::getIDom(), llvm::LoopBase< N, M >::getLoopLatch(), getOne(), llvm::BasicBlock::getSinglePredecessor(), llvm::BranchInst::getSuccessor(), llvm::BasicBlock::getTerminator(), llvm::SCEV::getType(), getZero(), llvm::CmpInst::ICMP_ULT, llvm::BranchInst::isConditional(), llvm::DominatorTree::isReachableFromEntry(), and llvm::BasicBlockEdge::isSingleEdge().
Referenced by getSignExtendExpr(), getZeroExtendExpr(), isKnownPredicate(), and isLoopInvariantPredicate().
| bool ScalarEvolution::isLoopEntryGuardedByCond | ( | const Loop * | L, |
| ICmpInst::Predicate | Pred, | ||
| const SCEV * | LHS, | ||
| const SCEV * | RHS | ||
| ) |
Test whether entry to the loop is protected by a conditional between LHS and RHS.
This is used to help avoid max expressions in loop trip counts, and to eliminate casts.
Definition at line 8002 of file ScalarEvolution.cpp.
References llvm::DominatorTree::dominates(), llvm::dyn_cast(), llvm::BranchInst::getCondition(), llvm::LoopBase< N, M >::getHeader(), llvm::LoopBase< N, M >::getLoopPredecessor(), llvm::BranchInst::getSuccessor(), and llvm::BranchInst::isUnconditional().
Referenced by getPreStartForExtend(), getSignExtendExpr(), getZeroExtendExpr(), and isKnownPredicate().
Return true if the value of the given SCEV is unchanging in the specified loop.
Definition at line 9821 of file ScalarEvolution.cpp.
References getLoopDisposition(), and LoopInvariant.
Referenced by expandBounds(), genLoopLimit(), getAddExpr(), getAddRecExpr(), getAddressAccessSCEV(), getMulExpr(), hasComputableBounds(), llvm::RuntimePointerChecking::insert(), llvm::InductionDescriptor::isInductionPHI(), isLoopInvariantPredicate(), isNoWrap(), llvm::LoopAccessInfo::isUniform(), print(), SimplifyICmpOperands(), and llvm::stripGetElementPtr().
| bool ScalarEvolution::isLoopInvariantPredicate | ( | ICmpInst::Predicate | Pred, |
| const SCEV * | LHS, | ||
| const SCEV * | RHS, | ||
| const Loop * | L, | ||
| ICmpInst::Predicate & | InvariantPred, | ||
| const SCEV *& | InvariantLHS, | ||
| const SCEV *& | InvariantRHS | ||
| ) |
Return true if the result of the predicate LHS Pred RHS is loop invariant with respect to L.
Set InvariantPred, InvariantLHS and InvariantLHS so that InvariantLHS InvariantPred InvariantRHS is the loop invariant form of LHS Pred RHS.
Definition at line 7716 of file ScalarEvolution.cpp.
References llvm::dyn_cast(), llvm::CmpInst::getInversePredicate(), llvm::SCEVAddRecExpr::getLoop(), llvm::SCEVAddRecExpr::getStart(), llvm::CmpInst::getSwappedPredicate(), isLoopBackedgeGuardedByCond(), isLoopInvariant(), L, P, and std::swap().
Test if values of the given type are analyzable within the SCEV framework.
This primarily includes integer types, and it can optionally include pointer types if the ScalarEvolution class has access to target-specific information.
Definition at line 3362 of file ScalarEvolution.cpp.
References llvm::Type::isIntegerTy(), and llvm::Type::isPointerTy().
Referenced by llvm::IVUsers::AddUsersImpl(), findIVOperand(), FindLoopCounter(), getAnyExtendExpr(), getEffectiveSCEVType(), getSCEV(), getSignExtendExpr(), getTruncateExpr(), getTypeSizeInBits(), getZeroExtendExpr(), isExistingPhi(), isHighCostExpansion(), isSimpleIVUser(), llvm::LoopAccessInfo::isUniform(), print(), and llvm::PredicatedScalarEvolution::print().
|
inlinestatic |
Convenient NoWrapFlags manipulation that hides enum casts and is visible in the ScalarEvolution name space.
Definition at line 435 of file ScalarEvolution.h.
References llvm::BitmaskEnumDetail::Mask().
Referenced by getAddRecExpr(), getMinusSCEV(), getMulExpr(), getPreStartForExtend(), and StrengthenNoWrapFlags().
| void ScalarEvolution::print | ( | raw_ostream & | OS | ) | const |
Definition at line 9638 of file ScalarEvolution.cpp.
References llvm::depth_first(), getLoopDisposition(), llvm::LoopBase< N, M >::getParentLoop(), getSCEV(), getSCEVAtScope(), getSignedRange(), llvm::Value::getType(), getUnsignedRange(), llvm::instructions(), isLoopInvariant(), isSCEVable(), loopDispositionToStr(), llvm::SCEV::print(), llvm::ConstantRange::print(), llvm::Value::printAsOperand(), and PrintLoopInfo().
Referenced by llvm::ScalarEvolutionWrapperPass::print().
| bool ScalarEvolution::properlyDominates | ( | const SCEV * | S, |
| const BasicBlock * | BB | ||
| ) |
Return true if elements that makes up the given SCEV properly dominate the specified basic block.
Definition at line 9916 of file ScalarEvolution.cpp.
References getBlockDisposition(), and ProperlyDominatesBlock.
Referenced by DoInitialMatch(), and SimplifyICmpOperands().
| const SCEV * ScalarEvolution::rewriteUsingPredicate | ( | const SCEV * | S, |
| const Loop * | L, | ||
| SCEVUnionPredicate & | A | ||
| ) |
Re-writes the SCEV according to the Predicates in A.
Definition at line 10221 of file ScalarEvolution.cpp.
Referenced by llvm::PredicatedScalarEvolution::getSCEV().
|
inlinestatic |
Definition at line 439 of file ScalarEvolution.h.
Referenced by getAddExpr(), llvm::SCEVWrapPredicate::getImpliedFlags(), llvm::SCEVWrapPredicate::isAlwaysTrue(), llvm::SCEVAddRecExpr::setNoWrapFlags(), and StrengthenNoWrapFlags().
| bool ScalarEvolution::SimplifyICmpOperands | ( | ICmpInst::Predicate & | Pred, |
| const SCEV *& | LHS, | ||
| const SCEV *& | RHS, | ||
| unsigned | Depth = 0 |
||
| ) |
Simplify LHS and RHS in a comparison with predicate Pred.
Return true iff any changes were made. If the operands are provably equal or unequal, LHS and RHS are set to the same value and Pred is set to either ICMP_EQ or ICMP_NE.
Definition at line 7378 of file ScalarEvolution.cpp.
References assert(), llvm::SCEV::FlagNSW, llvm::SCEV::FlagNUW, getAddExpr(), getConstant(), getContext(), llvm::ConstantRange::getEquivalentICmp(), llvm::ConstantInt::getFalse(), llvm::LoopBase< N, M >::getHeader(), llvm::ConstantExpr::getICmp(), llvm::SCEVAddRecExpr::getLoop(), llvm::ConstantRange::getSignedMax(), llvm::ConstantRange::getSignedMin(), getSignedRange(), llvm::CmpInst::getSwappedPredicate(), llvm::SCEV::getType(), llvm::ConstantRange::getUnsignedMax(), llvm::ConstantRange::getUnsignedMin(), getUnsignedRange(), HasSameValue(), llvm::CmpInst::ICMP_EQ, llvm::CmpInst::ICMP_NE, llvm::CmpInst::ICMP_SGE, llvm::CmpInst::ICMP_SGT, llvm::CmpInst::ICMP_SLE, llvm::CmpInst::ICMP_SLT, llvm::CmpInst::ICMP_UGE, llvm::CmpInst::ICMP_UGT, llvm::CmpInst::ICMP_ULE, llvm::CmpInst::ICMP_ULT, llvm::ConstantRange::isEmptySet(), llvm::ICmpInst::isEquality(), llvm::CmpInst::isFalseWhenEqual(), llvm::ConstantRange::isFullSet(), isLoopInvariant(), llvm::APInt::isMaxSignedValue(), llvm::APInt::isMaxValue(), llvm::APInt::isMinSignedValue(), llvm::APInt::isMinValue(), llvm::CmpInst::isTrueWhenEqual(), llvm::ConstantRange::makeExactICmpRegion(), properlyDominates(), and std::swap().
Referenced by isKnownPredicate().
| void ScalarEvolution::verify | ( | ) | const |
Definition at line 9981 of file ScalarEvolution.cpp.
References assert(), llvm::DenseMapBase< DerivedT, KeyT, ValueT, KeyInfoT, BucketT >::begin(), llvm::dbgs(), E, llvm::DenseMapBase< DerivedT, KeyT, ValueT, KeyInfoT, BucketT >::end(), getLoopBackedgeTakenCounts(), I, llvm::LoopBase< N, M >::rbegin(), llvm::LoopBase< N, M >::rend(), and llvm::DenseMapBase< DerivedT, KeyT, ValueT, KeyInfoT, BucketT >::size().
Referenced by llvm::ScalarEvolutionWrapperPass::verifyAnalysis().
|
friend |
Definition at line 460 of file ScalarEvolution.h.
Referenced by getSCEV().
|
friend |
Definition at line 461 of file ScalarEvolution.h.
|
friend |
Definition at line 462 of file ScalarEvolution.h.
Referenced by getUnknown().
1.8.6