52#define DEBUG_TYPE "loop-peel"
55STATISTIC(NumPeeledEnd,
"Number of loops peeled from end");
60 cl::desc(
"Set the unroll peeling count, for testing purposes"));
64 cl::desc(
"Allows loops to be peeled when the dynamic "
65 "trip count is known to be low."));
70 cl::desc(
"Allows loop nests to be peeled."));
74 cl::desc(
"Max average trip count which will cause loop peeling."));
78 cl::desc(
"Force a peel count regardless of profiling information."));
83 "Disable advance peeling. Issues for convergent targets (D134803)."));
87 cl::desc(
"Enable peeling to convert Phi nodes into IVs"));
97 if (!L->isLoopSimplifyForm())
103 L->getUniqueNonLatchExitBlocks(Exits);
197 PhiAnalyzer(
const Loop &L,
unsigned MaxIterations,
bool PeelForIV);
201 std::optional<unsigned> calculateIterationsToPeel();
204 enum class PeelCounterType {
209 using PeelCounterValue = std::pair<unsigned, PeelCounterType>;
210 using PeelCounter = std::optional<PeelCounterValue>;
211 const PeelCounter Unknown = std::nullopt;
214 PeelCounter addOne(PeelCounter PC)
const {
217 auto [Val, Ty] = *PC;
218 return (Val + 1 <= MaxIterations) ? PeelCounter({Val + 1, Ty}) : Unknown;
222 PeelCounter makeZero(PeelCounterType Ty)
const {
223 return PeelCounter({0, Ty});
228 PeelCounter calculate(
const Value &);
232 PeelCounter mergeTwoCounters(
const Instruction &CmpOrBinaryOp,
233 const PeelCounterValue &
LHS,
234 const PeelCounterValue &
RHS)
const;
238 bool isInductionPHI(
const PHINode *Phi)
const;
241 const unsigned MaxIterations;
242 const bool PeelForIV;
245 SmallDenseMap<const Value *, PeelCounter> IterationsToInvarianceOrInduction;
248PhiAnalyzer::PhiAnalyzer(
const Loop &L,
unsigned MaxIterations,
bool PeelForIV)
249 :
L(
L), MaxIterations(MaxIterations), PeelForIV(PeelForIV) {
251 assert(MaxIterations > 0 &&
"no peeling is allowed?");
258bool PhiAnalyzer::isInductionPHI(
const PHINode *Phi)
const {
261 if (Latch ==
nullptr)
264 Value *Cur =
Phi->getIncomingValueForBlock(Latch);
265 SmallPtrSet<Value *, 4> Visited;
266 bool VisitBinOp =
false;
276 if (!Visited.
insert(Cur).second)
280 if (!
I || !
L.contains(
I))
284 Cur = Cast->getOperand(0);
286 if (BinOp->getOpcode() != Instruction::Add &&
287 BinOp->getOpcode() != Instruction::Sub)
293 Cur = BinOp->getOperand(0);
309PhiAnalyzer::PeelCounter
310PhiAnalyzer::mergeTwoCounters(
const Instruction &CmpOrBinaryOp,
311 const PeelCounterValue &
LHS,
312 const PeelCounterValue &
RHS)
const {
313 auto &[LVal, LTy] =
LHS;
314 auto &[RVal, RTy] =
RHS;
315 unsigned NewVal = std::max(LVal, RVal);
317 if (LTy == PeelCounterType::Induction || RTy == PeelCounterType::Induction) {
319 if (BinOp->getOpcode() == Instruction::Add ||
320 BinOp->getOpcode() == Instruction::Sub)
321 return PeelCounter({NewVal, PeelCounterType::Induction});
325 return PeelCounter({NewVal, PeelCounterType::Invariant});
342PhiAnalyzer::PeelCounter PhiAnalyzer::calculate(
const Value &V) {
347 IterationsToInvarianceOrInduction.try_emplace(&V,
Unknown);
351 if (
L.isLoopInvariant(&V))
353 return (IterationsToInvarianceOrInduction[&V] =
354 makeZero(PeelCounterType::Invariant));
356 if (
Phi->getParent() !=
L.getHeader()) {
359 "unexpected value saved");
364 if (PeelForIV && isInductionPHI(Phi))
365 return (IterationsToInvarianceOrInduction[&V] =
366 makeZero(PeelCounterType::Induction));
369 Value *Input =
Phi->getIncomingValueForBlock(
L.getLoopLatch());
370 PeelCounter Iterations = calculate(*Input);
371 assert(IterationsToInvarianceOrInduction[Input] == Iterations &&
372 "unexpected value saved");
373 return (IterationsToInvarianceOrInduction[Phi] = addOne(Iterations));
378 PeelCounter
LHS = calculate(*
I->getOperand(0));
381 PeelCounter
RHS = calculate(*
I->getOperand(1));
384 return (IterationsToInvarianceOrInduction[
I] =
385 mergeTwoCounters(*
I, *
LHS, *
RHS));
389 return (IterationsToInvarianceOrInduction[
I] =
390 calculate(*
I->getOperand(0)));
396 "unexpected value saved");
400std::optional<unsigned> PhiAnalyzer::calculateIterationsToPeel() {
401 unsigned Iterations = 0;
402 for (
auto &
PHI :
L.getHeader()->phis()) {
403 PeelCounter ToInvarianceOrInduction = calculate(
PHI);
404 if (ToInvarianceOrInduction !=
Unknown) {
405 unsigned Val = ToInvarianceOrInduction->first;
406 assert(Val <= MaxIterations &&
"bad result in phi analysis");
407 Iterations = std::max(Iterations, Val);
408 if (Iterations == MaxIterations)
412 assert((Iterations <= MaxIterations) &&
"bad result in phi analysis");
413 return Iterations ? std::optional<unsigned>(Iterations) : std::nullopt;
427 if (L.getExitingBlock())
433 L.getUniqueNonLatchExitBlocks(Exits);
450 if (
I.mayWriteToMemory())
460 Value *Ptr = LI->getPointerOperand();
461 if (DT.
dominates(BB, Latch) && L.isLoopInvariant(Ptr) &&
468 L.getExitingBlocks(ExitingBlocks);
492 return Latch && Latch == L.getExitingBlock() &&
515 SCEVExpander Expander(SE, L.getHeader()->getDataLayout(),
"loop-peel");
518 L.getLoopPredecessor()->getTerminator()))
544static std::pair<unsigned, unsigned>
547 assert(L.isLoopSimplifyForm() &&
"Loop needs to be in loop simplify form");
548 unsigned DesiredPeelCount = 0;
549 unsigned DesiredPeelCountLast = 0;
555 std::min((
unsigned)SC->getAPInt().getLimitedValue() - 1, MaxPeelCount);
560 auto PeelWhilePredicateIsKnown =
561 [&](
unsigned &PeelCount,
const SCEV *&IterVal,
const SCEV *BoundSCEV,
563 while (PeelCount < MaxPeelCount &&
572 const unsigned MaxDepth = 4;
573 std::function<void(
Value *,
unsigned)> ComputePeelCount =
574 [&](
Value *Condition,
unsigned Depth) ->
void {
578 Value *LeftVal, *RightVal;
581 ComputePeelCount(LeftVal,
Depth + 1);
582 ComputePeelCount(RightVal,
Depth + 1);
620 unsigned NewPeelCount = DesiredPeelCount;
632 if (!PeelWhilePredicateIsKnown(NewPeelCount, IterVal, RightSCEV, Step,
635 DesiredPeelCountLast = 1;
648 if (NewPeelCount >= MaxPeelCount)
653 DesiredPeelCount = std::max(DesiredPeelCount, NewPeelCount);
654 DesiredPeelCountLast = std::max(DesiredPeelCountLast, NewPeelCount);
658 if (!
MinMax->getType()->isIntegerTy())
661 const SCEV *BoundSCEV, *IterSCEV;
662 if (L.isLoopInvariant(
LHS)) {
665 }
else if (L.isLoopInvariant(
RHS)) {
672 if (!AddRec || !AddRec->isAffine() || AddRec->getLoop() != &L)
674 const SCEV *Step = AddRec->getStepRecurrence(SE);
675 bool IsSigned =
MinMax->isSigned();
686 if (!(IsSigned ? AddRec->hasNoSignedWrap() : AddRec->hasNoUnsignedWrap()))
688 unsigned NewPeelCount = DesiredPeelCount;
689 const SCEV *IterVal = AddRec->evaluateAtIteration(
690 SE.
getConstant(AddRec->getType(), NewPeelCount), SE);
691 if (!PeelWhilePredicateIsKnown(NewPeelCount, IterVal, BoundSCEV, Step,
694 DesiredPeelCountLast = 1;
697 DesiredPeelCount = NewPeelCount;
703 ComputePeelCount(
SI->getCondition(), 0);
705 ComputePeelCountMinMax(
MinMax);
709 if (!BI || BI->isUnconditional())
713 if (L.getLoopLatch() == BB)
716 ComputePeelCount(BI->getCondition(), 0);
719 return {DesiredPeelCount, DesiredPeelCountLast};
732 if (!LatchBR || LatchBR->
getNumSuccessors() != 2 || !L->isLoopExiting(Latch))
737 "At least one edge out of the latch must go to the header");
740 L->getUniqueNonLatchExitBlocks(ExitBlocks);
753 assert(LoopSize > 0 &&
"Zero loop size is not allowed!");
772 <<
" iterations.\n");
783 if (2 * LoopSize > Threshold)
786 unsigned AlreadyPeeled = 0;
788 AlreadyPeeled = *Peeled;
795 MaxPeelCount = std::min(MaxPeelCount, Threshold / LoopSize - 1);
799 unsigned DesiredPeelCount = TargetPeelCount;
806 if (MaxPeelCount > DesiredPeelCount) {
809 .calculateIterationsToPeel();
811 DesiredPeelCount = std::max(DesiredPeelCount, *NumPeels);
814 const auto &[CountToEliminateCmps, CountToEliminateCmpsLast] =
816 DesiredPeelCount = std::max(DesiredPeelCount, CountToEliminateCmps);
818 if (DesiredPeelCount == 0)
821 if (DesiredPeelCount > 0) {
822 DesiredPeelCount = std::min(DesiredPeelCount, MaxPeelCount);
824 assert(DesiredPeelCount > 0 &&
"Wrong loop size estimation?");
827 <<
" iteration(s) to turn"
828 <<
" some Phis into invariants or inductions.\n");
836 if (CountToEliminateCmpsLast > 0) {
837 unsigned DesiredPeelCountLast =
838 std::min(CountToEliminateCmpsLast, MaxPeelCount);
840 assert(DesiredPeelCountLast > 0 &&
"Wrong loop size estimation?");
843 <<
" iteration(s) to turn"
844 <<
" some Phis into invariants.\n");
865 if (L->getHeader()->getParent()->hasProfileData()) {
869 if (!EstimatedTripCount)
873 << *EstimatedTripCount <<
"\n");
875 if (*EstimatedTripCount + AlreadyPeeled <= MaxPeelCount) {
876 unsigned PeelCount = *EstimatedTripCount;
877 LLVM_DEBUG(
dbgs() <<
"Peeling first " << PeelCount <<
" iterations.\n");
881 LLVM_DEBUG(
dbgs() <<
"Already peel count: " << AlreadyPeeled <<
"\n");
886 << (Threshold / LoopSize - 1) <<
"\n");
902 Loop *L,
unsigned IterNumber,
bool PeelLast,
BasicBlock *InsertTop,
911 BasicBlock *PreHeader = L->getLoopPreheader();
916 Loop *ParentLoop = L->getParentLoop();
948 std::string Ext = (
Twine(
"Peel") +
Twine(IterNumber)).str();
950 Header->getContext(), Ext);
955 for (
Loop *ChildLoop : *L) {
956 cloneLoop(ChildLoop, ParentLoop, VMap, LI,
nullptr);
971 assert(IterNumber == 0 &&
"Only peeling a single iteration implemented.");
973 LatchTerm->setSuccessor(0, InsertBot);
974 LatchTerm->setSuccessor(1, InsertBot);
980 for (
unsigned idx = 0, e = LatchTerm->getNumSuccessors(); idx < e; ++idx) {
981 if (LatchTerm->getSuccessor(idx) == Header) {
982 LatchTerm->setSuccessor(idx, InsertBot);
1019 if (IterNumber == 0) {
1024 if (LatchInst && L->contains(LatchInst))
1025 VMap[&*
I] = LVMap[LatchInst];
1027 VMap[&*
I] = LatchVal;
1037 for (
auto Edge : ExitEdges)
1039 Value *LatchVal =
PHI.getIncomingValueForBlock(Edge.first);
1041 if (LatchInst && L->contains(LatchInst))
1042 LatchVal = VMap[LatchVal];
1049 for (
auto KV : VMap)
1050 LVMap[KV.first] = KV.second;
1053TargetTransformInfo::PeelingPreferences
1056 std::optional<bool> UserAllowPeeling,
1057 std::optional<bool> UserAllowProfileBasedPeeling,
1058 bool UnrollingSpecficValues) {
1069 TTI.getPeelingPreferences(L, SE, PP);
1072 if (UnrollingSpecficValues) {
1082 if (UserAllowPeeling)
1084 if (UserAllowProfileBasedPeeling)
1102 assert(PeelCount > 0 &&
"Attempt to peel out zero iterations?");
1103 assert(
canPeel(L) &&
"Attempt to peel a loop which is not peelable?");
1105 "when peeling the last iteration, the loop must be supported and can "
1106 "only peel a single iteration");
1109 LoopBlocks.perform(LI);
1112 BasicBlock *PreHeader = L->getLoopPreheader();
1115 L->getExitEdges(ExitEdges);
1122 for (
auto *BB : L->blocks()) {
1123 auto *BBDomNode = DT.
getNode(BB);
1125 for (
auto *ChildDomNode : BBDomNode->children()) {
1126 auto *ChildBB = ChildDomNode->getBlock();
1127 if (!L->contains(ChildBB))
1135 for (
auto *ChildBB : ChildrenToUpdate)
1136 NonLoopBlocksIDom[ChildBB] = NewIDom;
1173 ExitValues[&
P] =
P.getIncomingValueForBlock(Latch);
1177 InsertTop =
SplitEdge(Latch, Exit, &DT, LI);
1180 InsertTop->
setName(Exit->getName() +
".peel.begin");
1181 InsertBot->
setName(Exit->getName() +
".peel.next");
1182 NewPreHeader =
nullptr;
1203 double Freq = 1 / ExitP.toDouble();
1207 assert(Freq >= 1.0 &&
"expected freq >= 1 due to initial iteration");
1208 double NewFreq = std::max(Freq - 1, 1.0);
1214 NewPreHeader =
SplitEdge(PreHeader, Header, &DT, LI);
1222 B.CreateICmpNE(BTCValue, ConstantInt::get(BTCValue->
getType(), 0));
1223 auto *BI =
B.CreateCondBr(
Cond, NewPreHeader, InsertTop);
1228 if (HasBranchWeights) {
1237 if (L->getExitBlock() == OrigLatchBr->getSuccessor(0))
1292 InsertTop =
SplitEdge(PreHeader, Header, &DT, LI);
1296 InsertTop->
setName(Header->getName() +
".peel.begin");
1297 InsertBot->
setName(Header->getName() +
".peel.next");
1311 for (
unsigned Iter = 0; Iter < PeelCount; ++Iter) {
1315 NewPreHeader ? PreHeader :
nullptr, ExitEdges, NewBlocks,
1316 LoopBlocks, VMap, LVMap, &DT, LI,
1317 LoopLocalNoAliasDeclScopes, *SE);
1332 cast<ICmpInst>(L->getLoopLatch()->getTerminator()->getOperand(0));
1335 1,
B.CreateSub(Cmp->getOperand(1),
1336 ConstantInt::get(Cmp->getOperand(1)->getType(), 1)));
1339 for (
auto BBIDom : NonLoopBlocksIDom)
1345#ifdef EXPENSIVE_CHECKS
1346 assert(DT.
verify(DominatorTree::VerificationLevel::Fast));
1352 LatchTermCopy->setMetadata(LLVMContext::MD_loop,
nullptr);
1354 InsertTop = InsertBot;
1356 InsertBot->
setName(Header->getName() +
".peel.next");
1358 F->splice(InsertTop->
getIterator(),
F, NewBlocks[0]->getIterator(),
1365 for (
const auto &[
P, E] : ExitValues) {
1367 if (ExitInst && L->contains(ExitInst))
1368 P->replaceAllUsesWith(&*VMap[ExitInst]);
1370 P->replaceAllUsesWith(E);
1371 P->eraseFromParent();
1379 Value *NewVal =
PHI->getIncomingValueForBlock(Latch);
1381 if (LatchInst && L->contains(LatchInst))
1382 NewVal = LVMap[LatchInst];
1384 PHI->setIncomingValueForBlock(NewPreHeader, NewVal);
1389 unsigned AlreadyPeeled = 0;
1391 AlreadyPeeled = *Peeled;
1392 unsigned TotalPeeled = AlreadyPeeled + PeelCount;
1413 unsigned EstimatedTripCountNew = *EstimatedTripCount;
1414 if (EstimatedTripCountNew < TotalPeeled)
1415 EstimatedTripCountNew = 0;
1417 EstimatedTripCountNew -= TotalPeeled;
1421 if (
Loop *ParentLoop = L->getParentLoop())
1428#ifdef EXPENSIVE_CHECKS
1430 assert(DT.
verify(DominatorTree::VerificationLevel::Fast));
1434 simplifyLoop(L, &DT, LI, SE, AC,
nullptr, PreserveLCSSA);
1437 NumPeeledEnd += PeelLast;
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
This file defines the DenseMap class.
static bool shouldPeelLastIteration(Loop &L, CmpPredicate Pred, const SCEVAddRecExpr *LeftAR, const SCEV *RightSCEV, ScalarEvolution &SE, const TargetTransformInfo &TTI)
Returns true if the last iteration can be peeled off and the condition (Pred LeftAR,...
static bool violatesLegacyMultiExitLoopCheck(Loop *L)
This "heuristic" exactly matches implicit behavior which used to exist inside getLoopEstimatedTripCou...
static std::pair< unsigned, unsigned > countToEliminateCompares(Loop &L, unsigned MaxPeelCount, ScalarEvolution &SE, const TargetTransformInfo &TTI)
static unsigned peelToTurnInvariantLoadsDerefencebale(Loop &L, DominatorTree &DT, AssumptionCache *AC)
static void cloneLoopBlocks(Loop *L, unsigned IterNumber, bool PeelLast, BasicBlock *InsertTop, BasicBlock *InsertBot, BasicBlock *OrigPreHeader, SmallVectorImpl< std::pair< BasicBlock *, BasicBlock * > > &ExitEdges, SmallVectorImpl< BasicBlock * > &NewBlocks, LoopBlocksDFS &LoopBlocks, ValueToValueMapTy &VMap, ValueToValueMapTy &LVMap, DominatorTree *DT, LoopInfo *LI, ArrayRef< MDNode * > LoopLocalNoAliasDeclScopes, ScalarEvolution &SE)
Clones the body of the loop L, putting it between InsertTop and InsertBot.
This file contains the declarations for profiling metadata utility functions.
const SmallVectorImpl< MachineOperand > & Cond
This file defines the SmallVector class.
This file defines the 'Statistic' class, which is designed to be an easy way to expose various metric...
#define STATISTIC(VARNAME, DESC)
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
A cache of @llvm.assume calls within a function.
LLVM Basic Block Representation.
LLVM_ABI InstListType::const_iterator getFirstNonPHIIt() const
Returns an iterator to the first instruction in this block that is not a PHINode instruction.
LLVM_ABI const CallInst * getTerminatingDeoptimizeCall() const
Returns the call instruction calling @llvm.experimental.deoptimize prior to the terminating return in...
LLVM_ABI const DataLayout & getDataLayout() const
Get the data layout of the module this basic block belongs to.
InstListType::iterator iterator
Instruction iterators...
const Instruction * getTerminator() const LLVM_READONLY
Returns the terminator instruction if the block is well formed or null if the block is not well forme...
Conditional or Unconditional Branch instruction.
unsigned getNumSuccessors() const
BasicBlock * getSuccessor(unsigned i) const
static LLVM_ABI BranchProbability getBranchProbability(uint64_t Numerator, uint64_t Denominator)
Predicate
This enumeration lists the possible predicates for CmpInst subclasses.
@ ICMP_SLT
signed less than
@ ICMP_UGT
unsigned greater than
@ ICMP_SGT
signed greater than
@ ICMP_ULT
unsigned less than
Predicate getSwappedPredicate() const
For example, EQ->EQ, SLE->SGE, ULT->UGT, OEQ->OEQ, ULE->UGE, OLT->OGT, etc.
Predicate getInversePredicate() const
For example, EQ -> NE, UGT -> ULE, SLT -> SGE, OEQ -> UNE, UGT -> OLE, OLT -> UGE,...
An abstraction over a floating-point predicate, and a pack of an integer predicate with samesign info...
A parsed version of the target data layout string in and methods for querying it.
DomTreeNodeBase * getIDom() const
bool verify(VerificationLevel VL=VerificationLevel::Full) const
verify - checks if the tree is correct.
void changeImmediateDominator(DomTreeNodeBase< NodeT > *N, DomTreeNodeBase< NodeT > *NewIDom)
changeImmediateDominator - This method is used to update the dominator tree information when a node's...
DomTreeNodeBase< NodeT > * addNewBlock(NodeT *BB, NodeT *DomBB)
Add a new node to the dominator tree information.
DomTreeNodeBase< NodeT > * getNode(const NodeT *BB) const
getNode - return the (Post)DominatorTree node for the specified basic block.
Concrete subclass of DominatorTreeBase that is used to compute a normal dominator tree.
LLVM_ABI Instruction * findNearestCommonDominator(Instruction *I1, Instruction *I2) const
Find the nearest instruction I that dominates both I1 and I2, in the sense that a result produced bef...
LLVM_ABI bool dominates(const BasicBlock *BB, const Use &U) const
Return true if the (end of the) basic block BB dominates the use U.
static bool isEquality(Predicate P)
Return true if this predicate is either EQ or NE.
This provides a uniform API for creating instructions and inserting them into a basic block: either a...
LLVM_ABI InstListType::iterator eraseFromParent()
This method unlinks 'this' from the containing basic block and deletes it.
LLVM_ABI void setSuccessor(unsigned Idx, BasicBlock *BB)
Update the specified successor to point at the provided block.
void addBasicBlockToLoop(BlockT *NewBB, LoopInfoBase< BlockT, LoopT > &LI)
This method is used by other analyses to update loop information.
Store the result of a depth first search within basic blocks contained by a single loop.
std::vector< BasicBlock * >::const_reverse_iterator RPOIterator
LoopT * getLoopFor(const BlockT *BB) const
Return the inner most loop that BB lives in.
Represents a single loop in the control flow graph.
This class represents min/max intrinsics.
void addIncoming(Value *V, BasicBlock *BB)
Add an incoming value to the end of the PHI list.
Value * getIncomingValueForBlock(const BasicBlock *BB) const
This node represents a polynomial recurrence on the trip count of the specified loop.
LLVM_ABI const SCEV * evaluateAtIteration(const SCEV *It, ScalarEvolution &SE) const
Return the value of this chain of recurrences at the specified iteration number.
const SCEV * getStepRecurrence(ScalarEvolution &SE) const
Constructs and returns the recurrence indicating how much this expression steps by.
bool isAffine() const
Return true if this represents an expression A + B*x where A and B are loop invariant values.
const Loop * getLoop() const
This class represents a constant integer value.
This class uses information about analyze scalars to rewrite expressions in canonical form.
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.
LLVM_ABI Value * expandCodeFor(const SCEV *SH, Type *Ty, BasicBlock::iterator I)
Insert code to directly compute the specified SCEV expression into the program.
bool hasNoSelfWrap() const
This class represents an analyzed expression in the program.
LLVM_ABI Type * getType() const
Return the LLVM type of this SCEV expression.
static LLVM_ABI LoopGuards collect(const Loop *L, ScalarEvolution &SE)
Collect rewrite map for loop guards for loop L, together with flags indicating if NUW and NSW can be ...
The main scalar evolution driver.
const SCEV * getConstantMaxBackedgeTakenCount(const Loop *L)
When successful, this returns a SCEVConstant that is greater than or equal to (i.e.
LLVM_ABI bool isKnownNegative(const SCEV *S)
Test if the given expression is known to be negative.
LLVM_ABI bool isKnownNonZero(const SCEV *S)
Test if the given expression is known to be non-zero.
LLVM_ABI const SCEV * getBackedgeTakenCount(const Loop *L, ExitCountKind Kind=Exact)
If the specified loop has a predictable backedge-taken count, return it, otherwise return a SCEVCould...
LLVM_ABI const SCEV * getConstant(ConstantInt *V)
LLVM_ABI const SCEV * getSCEV(Value *V)
Return a SCEV expression for the full generality of the specified expression.
const SCEV * getOne(Type *Ty)
Return a SCEV for the constant 1 of a specific type.
LLVM_ABI bool isLoopInvariant(const SCEV *S, const Loop *L)
Return true if the value of the given SCEV is unchanging in the specified loop.
LLVM_ABI bool isKnownPositive(const SCEV *S)
Test if the given expression is known to be positive.
LLVM_ABI void forgetTopmostLoop(const Loop *L)
LLVM_ABI void forgetBlockAndLoopDispositions(Value *V=nullptr)
Called when the client has changed the disposition of values in a loop or block.
LLVM_ABI const SCEV * getMinusSCEV(const SCEV *LHS, const SCEV *RHS, SCEV::NoWrapFlags Flags=SCEV::FlagAnyWrap, unsigned Depth=0)
Return LHS-RHS.
LLVM_ABI void forgetLcssaPhiWithNewPredecessor(Loop *L, PHINode *V)
Forget LCSSA phi node V of loop L to which a new predecessor was added, such that it may no longer be...
LLVM_ABI std::optional< MonotonicPredicateType > getMonotonicPredicateType(const SCEVAddRecExpr *LHS, ICmpInst::Predicate Pred)
If, for all loop invariant X, the predicate "LHS `Pred` X" is monotonically increasing or decreasing,...
LLVM_ABI const SCEV * applyLoopGuards(const SCEV *Expr, const Loop *L)
Try to apply information from loop guards for L to Expr.
LLVM_ABI std::optional< bool > evaluatePredicate(CmpPredicate Pred, const SCEV *LHS, const SCEV *RHS)
Check whether the condition described by Pred, LHS, and RHS is true or false.
LLVM_ABI const SCEV * getAddExpr(SmallVectorImpl< const SCEV * > &Ops, SCEV::NoWrapFlags Flags=SCEV::FlagAnyWrap, unsigned Depth=0)
Get a canonical add expression, or something simpler if possible.
LLVM_ABI bool isKnownPredicate(CmpPredicate Pred, const SCEV *LHS, const SCEV *RHS)
Test if the given expression is known to satisfy the condition described by Pred, LHS,...
This class represents the LLVM 'select' instruction.
void insert_range(Range &&R)
std::pair< iterator, bool > insert(PtrType Ptr)
Inserts Ptr if and only if there is no element in the container equal to Ptr.
bool contains(ConstPtrType Ptr) const
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
bool isIntegerTy() const
True if this is an instance of IntegerType.
LLVM Value Representation.
Type * getType() const
All values are typed, get the type of this value.
LLVM_ABI void setName(const Twine &Name)
Change the name of the value.
LLVM_ABI StringRef getName() const
Return a constant reference to the value's name.
self_iterator getIterator()
@ BasicBlock
Various leaf nodes.
OneUse_match< SubPat > m_OneUse(const SubPat &SP)
BinaryOp_match< LHS, RHS, Instruction::And > m_And(const LHS &L, const RHS &R)
brc_match< Cond_t, bind_ty< BasicBlock >, bind_ty< BasicBlock > > m_Br(const Cond_t &C, BasicBlock *&T, BasicBlock *&F)
class_match< Value > m_Value()
Match an arbitrary value and ignore it.
CmpClass_match< LHS, RHS, ICmpInst > m_ICmp(CmpPredicate &Pred, const LHS &L, const RHS &R)
class_match< BasicBlock > m_BasicBlock()
Match an arbitrary basic block value and ignore it.
BinaryOp_match< LHS, RHS, Instruction::Or > m_Or(const LHS &L, const RHS &R)
cst_pred_ty< is_one > m_scev_One()
Match an integer 1.
specificloop_ty m_SpecificLoop(const Loop *L)
SCEVAffineAddRec_match< Op0_t, Op1_t, class_match< const Loop > > m_scev_AffineAddRec(const Op0_t &Op0, const Op1_t &Op1)
bool match(const SCEV *S, const Pattern &P)
class_match< const SCEV > m_SCEV()
initializer< Ty > init(const Ty &Val)
NodeAddr< PhiNode * > Phi
This is an optimization pass for GlobalISel generic memory operations.
LLVM_ABI bool simplifyLoop(Loop *L, DominatorTree *DT, LoopInfo *LI, ScalarEvolution *SE, AssumptionCache *AC, MemorySSAUpdater *MSSAU, bool PreserveLCSSA)
Simplify each loop in a loop nest recursively.
FunctionAddr VTableAddr Value
LLVM_ABI std::optional< unsigned > getLoopEstimatedTripCount(Loop *L, unsigned *EstimatedLoopInvocationWeight=nullptr)
Return either:
bool all_of(R &&range, UnaryPredicate P)
Provide wrappers to std::all_of which take ranges instead of having to pass begin/end explicitly.
static cl::opt< bool > DisableAdvancedPeeling("disable-advanced-peeling", cl::init(false), cl::Hidden, cl::desc("Disable advance peeling. Issues for convergent targets (D134803)."))
static cl::opt< bool > UnrollAllowPeeling("unroll-allow-peeling", cl::init(true), cl::Hidden, cl::desc("Allows loops to be peeled when the dynamic " "trip count is known to be low."))
LLVM_ABI bool IsBlockFollowedByDeoptOrUnreachable(const BasicBlock *BB)
Check if we can prove that all paths starting from this block converge to a block that either has a @...
static cl::opt< bool > EnablePeelingForIV("enable-peeling-for-iv", cl::init(false), cl::Hidden, cl::desc("Enable peeling to convert Phi nodes into IVs"))
LLVM_ABI BasicBlock * CloneBasicBlock(const BasicBlock *BB, ValueToValueMapTy &VMap, const Twine &NameSuffix="", Function *F=nullptr, ClonedCodeInfo *CodeInfo=nullptr, bool MapAtoms=true)
Return a copy of the specified basic block, but without embedding the block into a particular functio...
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
bool canPeel(const Loop *L)
bool canPeelLastIteration(const Loop &L, ScalarEvolution &SE)
Returns true if the last iteration of L can be peeled off.
LLVM_ABI void addStringMetadataToLoop(Loop *TheLoop, const char *MDString, unsigned V=0)
Set input string into loop metadata by keeping other values intact.
LLVM_ABI void setBranchWeights(Instruction &I, ArrayRef< uint32_t > Weights, bool IsExpected, bool ElideAllZero=false)
Create a new branch_weights metadata node and add or overwrite a prof metadata reference to instructi...
static const char * PeeledCountMetaData
DomTreeNodeBase< BasicBlock > DomTreeNode
bool any_of(R &&range, UnaryPredicate P)
Provide wrappers to std::any_of which take ranges instead of having to pass begin/end explicitly.
TargetTransformInfo::PeelingPreferences gatherPeelingPreferences(Loop *L, ScalarEvolution &SE, const TargetTransformInfo &TTI, std::optional< bool > UserAllowPeeling, std::optional< bool > UserAllowProfileBasedPeeling, bool UnrollingSpecficValues=false)
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
void computePeelCount(Loop *L, unsigned LoopSize, TargetTransformInfo::PeelingPreferences &PP, unsigned TripCount, DominatorTree &DT, ScalarEvolution &SE, const TargetTransformInfo &TTI, AssumptionCache *AC=nullptr, unsigned Threshold=UINT_MAX)
LLVM_ABI cl::opt< unsigned > SCEVCheapExpansionBudget
BranchProbability getLoopProbability(Loop *L)
Based on branch weight metadata, return either:
static cl::opt< unsigned > UnrollForcePeelCount("unroll-force-peel-count", cl::init(0), cl::Hidden, cl::desc("Force a peel count regardless of profiling information."))
bool isa(const From &Val)
isa<X> - Return true if the parameter to the template is an instance of one of the template type argu...
LLVM_ABI std::optional< int > getOptionalIntLoopAttribute(const Loop *TheLoop, StringRef Name)
Find named metadata for a loop with an integer value.
bool setLoopProbability(Loop *L, BranchProbability P)
Set branch weight metadata for the latch of L to indicate that, at the end of any iteration,...
static cl::opt< bool > UnrollAllowLoopNestsPeeling("unroll-allow-loop-nests-peeling", cl::init(false), cl::Hidden, cl::desc("Allows loop nests to be peeled."))
static cl::opt< unsigned > UnrollPeelMaxCount("unroll-peel-max-count", cl::init(7), cl::Hidden, cl::desc("Max average trip count which will cause loop peeling."))
LLVM_ABI void cloneAndAdaptNoAliasScopes(ArrayRef< MDNode * > NoAliasDeclScopes, ArrayRef< BasicBlock * > NewBlocks, LLVMContext &Context, StringRef Ext)
Clone the specified noalias decl scopes.
LLVM_ABI void remapInstructionsInBlocks(ArrayRef< BasicBlock * > Blocks, ValueToValueMapTy &VMap)
Remaps instructions in Blocks using the mapping in VMap.
ValueMap< const Value *, WeakTrackingVH > ValueToValueMapTy
LLVM_ABI bool isDereferenceablePointer(const Value *V, Type *Ty, const DataLayout &DL, const Instruction *CtxI=nullptr, AssumptionCache *AC=nullptr, const DominatorTree *DT=nullptr, const TargetLibraryInfo *TLI=nullptr)
Return true if this is always a dereferenceable pointer.
LLVM_ABI bool setLoopEstimatedTripCount(Loop *L, unsigned EstimatedTripCount, std::optional< unsigned > EstimatedLoopInvocationWeight=std::nullopt)
Set llvm.loop.estimated_trip_count with the value EstimatedTripCount in the loop metadata of L.
LLVM_ABI bool extractBranchWeights(const MDNode *ProfileData, SmallVectorImpl< uint32_t > &Weights)
Extract branch weights from MD_prof metadata.
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
LLVM_ABI BasicBlock * SplitBlock(BasicBlock *Old, BasicBlock::iterator SplitPt, DominatorTree *DT, LoopInfo *LI=nullptr, MemorySSAUpdater *MSSAU=nullptr, const Twine &BBName="", bool Before=false)
Split the specified block at the specified instruction.
cl::opt< bool > ProfcheckDisableMetadataFixes("profcheck-disable-metadata-fixes", cl::Hidden, cl::init(false), cl::desc("Disable metadata propagation fixes discovered through Issue #147390"))
LLVM_ABI void identifyNoAliasScopesToClone(ArrayRef< BasicBlock * > BBs, SmallVectorImpl< MDNode * > &NoAliasDeclScopes)
Find the 'llvm.experimental.noalias.scope.decl' intrinsics in the specified basic blocks and extract ...
LLVM_ABI BasicBlock * SplitEdge(BasicBlock *From, BasicBlock *To, DominatorTree *DT=nullptr, LoopInfo *LI=nullptr, MemorySSAUpdater *MSSAU=nullptr, const Twine &BBName="")
Split the edge connecting the specified blocks, and return the newly created basic block between From...
LLVM_ABI bool formLCSSA(Loop &L, const DominatorTree &DT, const LoopInfo *LI, ScalarEvolution *SE)
Put loop into LCSSA form.
bool peelLoop(Loop *L, unsigned PeelCount, bool PeelLast, LoopInfo *LI, ScalarEvolution *SE, DominatorTree &DT, AssumptionCache *AC, bool PreserveLCSSA, ValueToValueMapTy &VMap)
VMap is the value-map that maps instructions from the original loop to instructions in the last peele...
static cl::opt< unsigned > UnrollPeelCount("unroll-peel-count", cl::Hidden, cl::desc("Set the unroll peeling count, for testing purposes"))
LLVM_ABI Loop * cloneLoop(Loop *L, Loop *PL, ValueToValueMapTy &VM, LoopInfo *LI, LPPassManager *LPM)
Recursively clone the specified loop and all of its children, mapping the blocks with the specified m...
void swap(llvm::BitVector &LHS, llvm::BitVector &RHS)
Implement std::swap in terms of BitVector swap.