LLVM 20.0.0git
|
This class uses information about analyze scalars to rewrite expressions in canonical form. More...
#include "llvm/Transforms/Utils/ScalarEvolutionExpander.h"
Public Member Functions | |
SCEVExpander (ScalarEvolution &se, const DataLayout &DL, const char *name, bool PreserveLCSSA=true) | |
Construct a SCEVExpander in "canonical" mode. | |
~SCEVExpander () | |
void | clear () |
Erase the contents of the InsertedExpressions map so that users trying to expand the same expression into multiple BasicBlocks or different places within the same BasicBlock can do so. | |
ScalarEvolution * | getSE () |
const SmallVectorImpl< WeakVH > & | getInsertedIVs () const |
SmallVector< Instruction *, 32 > | getAllInsertedInstructions () const |
Return a vector containing all instructions inserted during expansion. | |
bool | isHighCostExpansion (ArrayRef< const SCEV * > Exprs, Loop *L, unsigned Budget, const TargetTransformInfo *TTI, const Instruction *At) |
Return true for expressions that can't be evaluated at runtime within given Budget. | |
Instruction * | getIVIncOperand (Instruction *IncV, Instruction *InsertPos, bool allowScale) |
Return the induction variable increment's IV operand. | |
bool | hoistIVInc (Instruction *IncV, Instruction *InsertPos, bool RecomputePoisonFlags=false) |
Utility for hoisting IncV (with all subexpressions requried for its computation) before InsertPos . | |
unsigned | replaceCongruentIVs (Loop *L, const DominatorTree *DT, SmallVectorImpl< WeakTrackingVH > &DeadInsts, const TargetTransformInfo *TTI=nullptr) |
replace congruent phis with their most canonical representative. | |
bool | isSafeToExpand (const SCEV *S) const |
Return true if the given expression is safe to expand in the sense that all materialized values are safe to speculate anywhere their operands are defined, and the expander is capable of expanding the expression. | |
bool | isSafeToExpandAt (const SCEV *S, const Instruction *InsertionPoint) const |
Return true if the given expression is safe to expand in the sense that all materialized values are defined and safe to speculate at the specified location and their operands are defined at this location. | |
Value * | expandCodeFor (const SCEV *SH, Type *Ty, BasicBlock::iterator I) |
Insert code to directly compute the specified SCEV expression into the program. | |
Value * | expandCodeFor (const SCEV *SH, Type *Ty, Instruction *I) |
Value * | expandCodeFor (const SCEV *SH, Type *Ty=nullptr) |
Insert code to directly compute the specified SCEV expression into the program. | |
Value * | expandCodeForPredicate (const SCEVPredicate *Pred, Instruction *Loc) |
Generates a code sequence that evaluates this predicate. | |
Value * | expandComparePredicate (const SCEVComparePredicate *Pred, Instruction *Loc) |
A specialized variant of expandCodeForPredicate, handling the case when we are expanding code for a SCEVComparePredicate. | |
Value * | generateOverflowCheck (const SCEVAddRecExpr *AR, Instruction *Loc, bool Signed) |
Generates code that evaluates if the AR expression will overflow. | |
Value * | expandWrapPredicate (const SCEVWrapPredicate *P, Instruction *Loc) |
A specialized variant of expandCodeForPredicate, handling the case when we are expanding code for a SCEVWrapPredicate. | |
Value * | expandUnionPredicate (const SCEVUnionPredicate *Pred, Instruction *Loc) |
A specialized variant of expandCodeForPredicate, handling the case when we are expanding code for a SCEVUnionPredicate. | |
void | setIVIncInsertPos (const Loop *L, Instruction *Pos) |
Set the current IV increment loop and position. | |
void | setPostInc (const PostIncLoopSet &L) |
Enable post-inc expansion for addrecs referring to the given loops. | |
void | clearPostInc () |
Disable all post-inc expansion. | |
void | disableCanonicalMode () |
Disable the behavior of expanding expressions in canonical form rather than in a more literal form. | |
void | enableLSRMode () |
void | setInsertPoint (Instruction *IP) |
Set the current insertion point. | |
void | setInsertPoint (BasicBlock::iterator IP) |
void | clearInsertPoint () |
Clear the current insertion point. | |
void | SetCurrentDebugLocation (DebugLoc L) |
Set location information used by debugging information. | |
DebugLoc | getCurrentDebugLocation () const |
Get location information used by debugging information. | |
bool | isInsertedInstruction (Instruction *I) const |
Return true if the specified instruction was inserted by the code rewriter. | |
void | setChainedPhi (PHINode *PN) |
bool | hasRelatedExistingExpansion (const SCEV *S, const Instruction *At, Loop *L) |
Determine whether there is an existing expansion of S that can be reused. | |
BasicBlock::iterator | findInsertPointAfter (Instruction *I, Instruction *MustDominate) const |
Returns a suitable insert point after I , that dominates MustDominate . | |
Public Member Functions inherited from llvm::SCEVVisitor< SCEVExpander, Value * > | |
Value * | visit (const SCEV *S) |
Value * | visitCouldNotCompute (const SCEVCouldNotCompute *S) |
Static Public Member Functions | |
static bool | canReuseFlagsFromOriginalIVInc (PHINode *OrigPhi, PHINode *WidePhi, Instruction *OrigInc, Instruction *WideInc) |
Return true if both increments directly increment the corresponding IV PHI nodes and have the same opcode. | |
Friends | |
class | SCEVExpanderCleaner |
struct | SCEVVisitor< SCEVExpander, Value * > |
This class uses information about analyze scalars to rewrite expressions in canonical form.
Clients should create an instance of this class when rewriting is needed, and destroy it when finished to allow the release of the associated memory.
Definition at line 61 of file ScalarEvolutionExpander.h.
|
inlineexplicit |
Construct a SCEVExpander in "canonical" mode.
Definition at line 178 of file ScalarEvolutionExpander.h.
References I.
|
inline |
Definition at line 191 of file ScalarEvolutionExpander.h.
References assert(), and llvm::SmallVectorBase< Size_T >::empty().
|
static |
Return true if both increments directly increment the corresponding IV PHI nodes and have the same opcode.
It is not safe to re-use the flags from the original increment, if it is more complex and SCEV expansion may have yielded a more simplified wider increment.
Definition at line 824 of file ScalarEvolutionExpander.cpp.
References llvm::Instruction::getOpcode(), llvm::PatternMatch::m_c_BinOp(), llvm::PatternMatch::m_Specific(), llvm::PatternMatch::m_Value(), and llvm::PatternMatch::match().
|
inline |
Erase the contents of the InsertedExpressions map so that users trying to expand the same expression into multiple BasicBlocks or different places within the same BasicBlock can do so.
Definition at line 203 of file ScalarEvolutionExpander.h.
References llvm::DenseMapBase< DerivedT, KeyT, ValueT, KeyInfoT, BucketT >::clear(), llvm::detail::DenseSetImpl< ValueT, MapTy, ValueInfoT >::clear(), llvm::SmallPtrSetImplBase::clear(), and llvm::SmallVectorImpl< T >::clear().
Referenced by llvm::SCEVExpanderCleaner::cleanup(), and RunTermFold().
|
inline |
Clear the current insertion point.
This is useful if the instruction that had been serving as the insertion point may have been deleted.
Definition at line 385 of file ScalarEvolutionExpander.h.
References llvm::IRBuilderBase::ClearInsertionPoint().
|
inline |
Disable all post-inc expansion.
Definition at line 355 of file ScalarEvolutionExpander.h.
References llvm::detail::DenseSetImpl< ValueT, MapTy, ValueInfoT >::clear(), and llvm::SmallPtrSetImplBase::clear().
|
inline |
Disable the behavior of expanding expressions in canonical form rather than in a more literal form.
Non-canonical mode is useful for late optimization passes.
Definition at line 366 of file ScalarEvolutionExpander.h.
|
inline |
Definition at line 368 of file ScalarEvolutionExpander.h.
Value * SCEVExpander::expandCodeFor | ( | const SCEV * | SH, |
Type * | Ty, | ||
BasicBlock::iterator | I | ||
) |
Insert code to directly compute the specified SCEV expression into the program.
The code is inserted into the specified block.
Definition at line 1407 of file ScalarEvolutionExpander.cpp.
References expandCodeFor(), and setInsertPoint().
Referenced by llvm::addDiffRuntimeChecks(), calculateRtStride(), expandCodeFor(), llvm::LoopStructure::parseLoopStructure(), llvm::LoopConstrainer::run(), RunTermFold(), llvm::splitLoopBound(), and llvm::UnrollRuntimeLoopRemainder().
|
inline |
Definition at line 306 of file ScalarEvolutionExpander.h.
References expandCodeFor(), and I.
Insert code to directly compute the specified SCEV expression into the program.
The code is inserted into the SCEVExpander's current insertion point. If a type is specified, the result will be expanded to have that type, with a cast if necessary.
Definition at line 1414 of file ScalarEvolutionExpander.cpp.
References assert(), llvm::SCEV::getType(), and llvm::ScalarEvolution::getTypeSizeInBits().
Value * SCEVExpander::expandCodeForPredicate | ( | const SCEVPredicate * | Pred, |
Instruction * | Loc | ||
) |
Generates a code sequence that evaluates this predicate.
The inserted instructions will be at position Loc
. The result will be of type i1 and will have a value of 0 when the predicate is false and 1 otherwise.
Definition at line 2057 of file ScalarEvolutionExpander.cpp.
References assert(), expandComparePredicate(), expandUnionPredicate(), expandWrapPredicate(), llvm::SCEVPredicate::getKind(), llvm_unreachable, llvm::SCEVPredicate::P_Compare, llvm::SCEVPredicate::P_Union, and llvm::SCEVPredicate::P_Wrap.
Referenced by expandUnionPredicate().
Value * SCEVExpander::expandComparePredicate | ( | const SCEVComparePredicate * | Pred, |
Instruction * | Loc | ||
) |
A specialized variant of expandCodeForPredicate, handling the case when we are expanding code for a SCEVComparePredicate.
Definition at line 2073 of file ScalarEvolutionExpander.cpp.
References llvm::IRBuilderBase::CreateICmp(), llvm::CmpInst::getInversePredicate(), llvm::SCEVComparePredicate::getLHS(), llvm::SCEVComparePredicate::getPredicate(), llvm::SCEVComparePredicate::getRHS(), I, and llvm::IRBuilderBase::SetInsertPoint().
Referenced by expandCodeForPredicate().
Value * SCEVExpander::expandUnionPredicate | ( | const SCEVUnionPredicate * | Pred, |
Instruction * | Loc | ||
) |
A specialized variant of expandCodeForPredicate, handling the case when we are expanding code for a SCEVUnionPredicate.
Definition at line 2234 of file ScalarEvolutionExpander.cpp.
References llvm::IRBuilderBase::CreateOr(), llvm::SmallVectorBase< Size_T >::empty(), expandCodeForPredicate(), llvm::Value::getContext(), llvm::ConstantInt::getFalse(), llvm::SmallVectorTemplateBase< T, bool >::push_back(), and llvm::IRBuilderBase::SetInsertPoint().
Referenced by expandCodeForPredicate().
Value * SCEVExpander::expandWrapPredicate | ( | const SCEVWrapPredicate * | P, |
Instruction * | Loc | ||
) |
A specialized variant of expandCodeForPredicate, handling the case when we are expanding code for a SCEVWrapPredicate.
Definition at line 2209 of file ScalarEvolutionExpander.cpp.
References A, llvm::IRBuilderBase::CreateOr(), generateOverflowCheck(), llvm::Value::getContext(), llvm::SCEVWrapPredicate::getExpr(), llvm::ConstantInt::getFalse(), llvm::SCEVWrapPredicate::getFlags(), llvm::SCEVWrapPredicate::IncrementNSSW, and llvm::SCEVWrapPredicate::IncrementNUSW.
Referenced by expandCodeForPredicate().
BasicBlock::iterator SCEVExpander::findInsertPointAfter | ( | Instruction * | I, |
Instruction * | MustDominate | ||
) | const |
Returns a suitable insert point after I
, that dominates MustDominate
.
Skips instructions inserted by the expander.
Definition at line 138 of file ScalarEvolutionExpander.cpp.
References assert(), llvm::ilist_detail::node_parent_access< NodeTy, ParentTy >::getParent(), I, II, and isInsertedInstruction().
Value * SCEVExpander::generateOverflowCheck | ( | const SCEVAddRecExpr * | AR, |
Instruction * | Loc, | ||
bool | Signed | ||
) |
Generates code that evaluates if the AR
expression will overflow.
Definition at line 2084 of file ScalarEvolutionExpander.cpp.
References llvm::Add, assert(), llvm::IRBuilderBase::CreateAdd(), llvm::IRBuilderBase::CreateAnd(), llvm::IRBuilderBase::CreateCall(), llvm::IRBuilderBase::CreateExtractValue(), llvm::IRBuilderBase::CreateICmp(), llvm::IRBuilderBase::CreateNeg(), llvm::IRBuilderBase::CreateOr(), llvm::IRBuilderBase::CreatePtrAdd(), llvm::IRBuilderBase::CreateSelect(), llvm::IRBuilderBase::CreateSub(), llvm::IRBuilderBase::CreateZExtOrTrunc(), llvm::IntegerType::get(), llvm::Value::getContext(), llvm::Intrinsic::getDeclaration(), llvm::ConstantInt::getFalse(), llvm::SCEVAddRecExpr::getLoop(), llvm::APInt::getMaxValue(), llvm::Instruction::getModule(), llvm::ScalarEvolution::getNegativeSCEV(), llvm::ScalarEvolution::getPredicatedSymbolicMaxBackedgeTakenCount(), llvm::SCEVAddRecExpr::getStart(), llvm::SCEVAddRecExpr::getStepRecurrence(), llvm::SCEV::getType(), llvm::SCEVAddRecExpr::getType(), llvm::ScalarEvolution::getTypeSizeInBits(), llvm::APInt::getZero(), llvm::CmpInst::ICMP_NE, llvm::CmpInst::ICMP_SGT, llvm::CmpInst::ICMP_SLT, llvm::CmpInst::ICMP_UGT, llvm::CmpInst::ICMP_ULT, llvm::SCEVAddRecExpr::isAffine(), llvm::ScalarEvolution::isKnownNegative(), llvm::ScalarEvolution::isKnownPositive(), llvm::SCEV::isOne(), llvm::Mul, llvm::IRBuilderBase::SetInsertPoint(), Signed, and llvm::APInt::zext().
Referenced by expandWrapPredicate().
|
inline |
Return a vector containing all instructions inserted during expansion.
Definition at line 217 of file ScalarEvolutionExpander.h.
References llvm::SmallPtrSetImpl< PtrType >::contains().
Referenced by llvm::SCEVExpanderCleaner::cleanup().
|
inline |
Get location information used by debugging information.
Definition at line 393 of file ScalarEvolutionExpander.h.
References llvm::IRBuilderBase::getCurrentDebugLocation().
|
inline |
Definition at line 214 of file ScalarEvolutionExpander.h.
Instruction * SCEVExpander::getIVIncOperand | ( | Instruction * | IncV, |
Instruction * | InsertPos, | ||
bool | allowScale | ||
) |
Return the induction variable increment's IV operand.
getIVIncOperand returns an induction variable increment's induction variable operand.
If allowScale is set, any type of GEP is allowed as long as the nonIV operands dominate InsertPos.
If allowScale is not set, ensure that a GEP increment conforms to one of the simple patterns generated by getAddRecExprPHILiterally and expandAddtoGEP. If the pattern isn't recognized, return NULL.
Definition at line 711 of file ScalarEvolutionExpander.cpp.
References llvm::DominatorTree::dominates(), llvm::drop_begin(), llvm::Instruction::getOpcode(), llvm::User::getOperand(), and llvm::User::operands().
Referenced by hoistIVInc().
|
inline |
Definition at line 213 of file ScalarEvolutionExpander.h.
Referenced by llvm::addDiffRuntimeChecks().
Determine whether there is an existing expansion of S that can be reused.
This is used to check whether S can be expanded cheaply.
L is a hint which tells in which loop to look for the suitable value.
Note that this function does not perform an exhaustive search. I.e if it didn't find any value it does not mean that there is no such value.
Definition at line 1773 of file ScalarEvolutionExpander.cpp.
References llvm::DominatorTree::dominates(), llvm::ScalarEvolution::getSCEV(), LHS, llvm::PatternMatch::m_BasicBlock(), llvm::PatternMatch::m_Br(), llvm::PatternMatch::m_ICmp(), llvm::PatternMatch::m_Instruction(), llvm::PatternMatch::match(), and RHS.
bool SCEVExpander::hoistIVInc | ( | Instruction * | IncV, |
Instruction * | InsertPos, | ||
bool | RecomputePoisonFlags = false |
||
) |
Utility for hoisting IncV
(with all subexpressions requried for its computation) before InsertPos
.
hoistStep - Attempt to hoist a simple IV increment above InsertPos to make it available to other uses in this loop.
If RecomputePoisonFlags
is set, drops all poison-generating flags from instructions being hoisted and tries to re-infer them in the new location. It should be used when we are going to introduce a new use in the new position that didn't exist before, and may trigger new UB in case of poison.
Recursively hoist any operands, until we reach a value that dominates InsertPos.
Definition at line 771 of file ScalarEvolutionExpander.cpp.
References llvm::DominatorTree::dominates(), llvm::SCEV::FlagNSW, llvm::SCEV::FlagNUW, getIVIncOperand(), llvm::ilist_detail::node_parent_access< NodeTy, ParentTy >::getParent(), llvm::ScalarEvolution::getStrengthenedNoWrapFlagsFromBinOp(), I, llvm::ScalarEvolution::maskFlags(), llvm::LoopInfo::movementPreservesLCSSAForm(), llvm::SmallVectorTemplateBase< T, bool >::push_back(), llvm::reverse(), llvm::Instruction::setHasNoSignedWrap(), and llvm::Instruction::setHasNoUnsignedWrap().
|
inline |
Return true for expressions that can't be evaluated at runtime within given Budget.
At
is a parameter which specifies point in code where user is going to expand these expressions. Sometimes this knowledge can lead to a less pessimistic cost estimation.
Definition at line 243 of file ScalarEvolutionExpander.h.
References assert(), llvm::SmallVectorImpl< T >::emplace_back(), llvm::SmallVectorBase< Size_T >::empty(), llvm::SmallVectorImpl< T >::pop_back_val(), and llvm::TargetTransformInfo::TCC_Basic.
Referenced by canFoldTermCondOfLoop(), and llvm::UnrollRuntimeLoopRemainder().
|
inline |
Return true if the specified instruction was inserted by the code rewriter.
If so, the client should not modify the instruction. Note that this also includes instructions re-used during expansion.
Definition at line 400 of file ScalarEvolutionExpander.h.
References llvm::detail::DenseSetImpl< ValueT, MapTy, ValueInfoT >::count(), and I.
Referenced by findInsertPointAfter().
Return true if the given expression is safe to expand in the sense that all materialized values are safe to speculate anywhere their operands are defined, and the expander is capable of expanding the expression.
Definition at line 2344 of file ScalarEvolutionExpander.cpp.
References llvm::visitAll().
Referenced by canFoldTermCondOfLoop(), isSafeToExpandAt(), and RunTermFold().
bool SCEVExpander::isSafeToExpandAt | ( | const SCEV * | S, |
const Instruction * | InsertionPoint | ||
) | const |
Return true if the given expression is safe to expand in the sense that all materialized values are defined and safe to speculate at the specified location and their operands are defined at this location.
Definition at line 2350 of file ScalarEvolutionExpander.cpp.
References llvm::ScalarEvolution::dominates(), llvm::ilist_detail::node_parent_access< NodeTy, ParentTy >::getParent(), llvm::is_contained(), isSafeToExpand(), llvm::User::operand_values(), and llvm::ScalarEvolution::properlyDominates().
Referenced by llvm::LoopConstrainer::run().
unsigned SCEVExpander::replaceCongruentIVs | ( | Loop * | L, |
const DominatorTree * | DT, | ||
SmallVectorImpl< WeakTrackingVH > & | DeadInsts, | ||
const TargetTransformInfo * | TTI = nullptr |
||
) |
replace congruent phis with their most canonical representative.
replaceCongruentIVs - Check for congruent phis in this loop header and replace them with their most canonical representative.
Return the number of phis eliminated.
Return the number of phis eliminated.
This does not depend on any SCEVExpander state but should be used in the same context that SCEVExpander is used.
Definition at line 1675 of file ScalarEvolutionExpander.cpp.
References llvm::SmallVectorTemplateCommon< T, typename >::back(), llvm::IRBuilderBase::CreateTruncOrBitCast(), llvm::dbgs(), llvm::SmallVectorImpl< T >::emplace_back(), llvm::ScalarEvolution::forgetValue(), llvm::details::FixedOrScalableQuantity< LeafTy, ValueTy >::getFixedValue(), llvm::Type::getPrimitiveSizeInBits(), llvm::ScalarEvolution::getSCEV(), llvm::ScalarEvolution::getTruncateExpr(), llvm::Value::getType(), llvm::Type::isIntegerTy(), llvm::Type::isPointerTy(), llvm::ScalarEvolution::isSCEVable(), llvm::TargetTransformInfo::isTruncateFree(), LHS, llvm::SmallVectorTemplateBase< T, bool >::push_back(), RHS, SCEV_DEBUG_WITH_TYPE, llvm::IRBuilderBase::SetCurrentDebugLocation(), llvm::simplifyInstruction(), and llvm::stable_sort().
|
inline |
Definition at line 404 of file ScalarEvolutionExpander.h.
References llvm::detail::DenseSetImpl< ValueT, MapTy, ValueInfoT >::insert().
|
inline |
Set location information used by debugging information.
Definition at line 388 of file ScalarEvolutionExpander.h.
References llvm::IRBuilderBase::SetCurrentDebugLocation().
|
inline |
Definition at line 379 of file ScalarEvolutionExpander.h.
References llvm::IRBuilderBase::SetInsertPoint().
|
inline |
Set the current insertion point.
This is useful if multiple calls to expandCodeFor() are going to be made with the same insert point and the insert point may be moved during one of the expansions (e.g. if the insert point is not a block terminator).
Definition at line 374 of file ScalarEvolutionExpander.h.
References assert(), and llvm::IRBuilderBase::SetInsertPoint().
Referenced by expandCodeFor().
|
inline |
Set the current IV increment loop and position.
Definition at line 339 of file ScalarEvolutionExpander.h.
References assert().
|
inline |
Enable post-inc expansion for addrecs referring to the given loops.
Post-inc expansion is only supported in non-canonical mode.
Definition at line 348 of file ScalarEvolutionExpander.h.
References assert().
|
friend |
Definition at line 62 of file ScalarEvolutionExpander.h.
|
friend |
Definition at line 168 of file ScalarEvolutionExpander.h.