49#define DEBUG_TYPE "loop-peel"
55 cl::desc(
"Set the unroll peeling count, for testing purposes"));
59 cl::desc(
"Allows loops to be peeled when the dynamic "
60 "trip count is known to be low."));
65 cl::desc(
"Allows loop nests to be peeled."));
69 cl::desc(
"Max average trip count which will cause loop peeling."));
73 cl::desc(
"Force a peel count regardless of profiling information."));
78 "Disable advance peeling. Issues for convergent targets (D134803)."));
85 if (!L->isLoopSimplifyForm())
91 L->getUniqueNonLatchExitBlocks(Exits);
159 PhiAnalyzer(
const Loop &L,
unsigned MaxIterations);
163 std::optional<unsigned> calculateIterationsToPeel();
166 using PeelCounter = std::optional<unsigned>;
167 const PeelCounter Unknown = std::nullopt;
170 PeelCounter addOne(PeelCounter PC)
const {
173 return (*PC + 1 <= MaxIterations) ? PeelCounter{*PC + 1} :
Unknown;
178 PeelCounter calculate(
const Value &);
181 const unsigned MaxIterations;
187PhiAnalyzer::PhiAnalyzer(
const Loop &L,
unsigned MaxIterations)
188 :
L(
L), MaxIterations(MaxIterations) {
190 assert(MaxIterations > 0 &&
"no peeling is allowed?");
207PhiAnalyzer::PeelCounter PhiAnalyzer::calculate(
const Value &V) {
215 if (
L.isLoopInvariant(&V))
217 return (IterationsToInvariance[&V] = 0);
218 if (
const PHINode *Phi = dyn_cast<PHINode>(&V)) {
219 if (
Phi->getParent() !=
L.getHeader()) {
221 assert(IterationsToInvariance[&V] ==
Unknown &&
"unexpected value saved");
225 Value *Input =
Phi->getIncomingValueForBlock(
L.getLoopLatch());
226 PeelCounter Iterations = calculate(*Input);
227 assert(IterationsToInvariance[Input] == Iterations &&
228 "unexpected value saved");
229 return (IterationsToInvariance[Phi] = addOne(Iterations));
232 if (isa<CmpInst>(
I) ||
I->isBinaryOp()) {
234 PeelCounter
LHS = calculate(*
I->getOperand(0));
237 PeelCounter
RHS = calculate(*
I->getOperand(1));
240 return (IterationsToInvariance[
I] = {std::max(*LHS, *RHS)});
244 return (IterationsToInvariance[
I] = calculate(*
I->getOperand(0)));
249 assert(IterationsToInvariance[&V] ==
Unknown &&
"unexpected value saved");
253std::optional<unsigned> PhiAnalyzer::calculateIterationsToPeel() {
254 unsigned Iterations = 0;
255 for (
auto &
PHI :
L.getHeader()->phis()) {
256 PeelCounter ToInvariance = calculate(
PHI);
258 assert(*ToInvariance <= MaxIterations &&
"bad result in phi analysis");
259 Iterations = std::max(Iterations, *ToInvariance);
260 if (Iterations == MaxIterations)
264 assert((Iterations <= MaxIterations) &&
"bad result in phi analysis");
265 return Iterations ? std::optional<unsigned>(Iterations) :
std::nullopt;
279 if (L.getExitingBlock())
285 L.getUniqueNonLatchExitBlocks(Exits);
302 if (
I.mayWriteToMemory())
305 auto Iter = LoadUsers.
find(&
I);
306 if (Iter != LoadUsers.
end()) {
307 for (
Value *U :
I.users())
314 if (
auto *LI = dyn_cast<LoadInst>(&
I)) {
315 Value *
Ptr = LI->getPointerOperand();
316 if (DT.
dominates(BB, Latch) && L.isLoopInvariant(
Ptr) &&
318 for (
Value *U :
I.users())
324 L.getExitingBlocks(ExitingBlocks);
343 assert(L.isLoopSimplifyForm() &&
"Loop needs to be in loop simplify form");
344 unsigned DesiredPeelCount = 0;
348 if (
const SCEVConstant *SC = dyn_cast<SCEVConstant>(BE))
350 std::min((
unsigned)SC->getAPInt().getLimitedValue() - 1, MaxPeelCount);
355 auto PeelWhilePredicateIsKnown =
356 [&](
unsigned &PeelCount,
const SCEV *&IterVal,
const SCEV *BoundSCEV,
358 while (PeelCount < MaxPeelCount &&
368 std::function<void(
Value *,
unsigned)> ComputePeelCount =
369 [&](
Value *Condition,
unsigned Depth) ->
void {
373 Value *LeftVal, *RightVal;
376 ComputePeelCount(LeftVal,
Depth + 1);
377 ComputePeelCount(RightVal,
Depth + 1);
395 if (!isa<SCEVAddRecExpr>(LeftSCEV)) {
396 if (isa<SCEVAddRecExpr>(RightSCEV)) {
398 Pred = ICmpInst::getSwappedPredicate(Pred);
415 unsigned NewPeelCount = DesiredPeelCount;
424 Pred = ICmpInst::getInversePredicate(Pred);
427 if (!PeelWhilePredicateIsKnown(NewPeelCount, IterVal, RightSCEV, Step,
440 if (NewPeelCount >= MaxPeelCount)
445 DesiredPeelCount = std::max(DesiredPeelCount, NewPeelCount);
449 if (!
MinMax->getType()->isIntegerTy())
452 const SCEV *BoundSCEV, *IterSCEV;
453 if (L.isLoopInvariant(
LHS)) {
456 }
else if (L.isLoopInvariant(
RHS)) {
461 const auto *AddRec = dyn_cast<SCEVAddRecExpr>(IterSCEV);
463 if (!AddRec || !AddRec->isAffine() || AddRec->getLoop() != &L)
465 const SCEV *Step = AddRec->getStepRecurrence(SE);
466 bool IsSigned =
MinMax->isSigned();
471 Pred = IsSigned ? ICmpInst::ICMP_SLT : ICmpInst::ICMP_ULT;
473 Pred = IsSigned ? ICmpInst::ICMP_SGT : ICmpInst::ICMP_UGT;
477 if (!(IsSigned ? AddRec->hasNoSignedWrap() : AddRec->hasNoUnsignedWrap()))
479 unsigned NewPeelCount = DesiredPeelCount;
480 const SCEV *IterVal = AddRec->evaluateAtIteration(
481 SE.
getConstant(AddRec->getType(), NewPeelCount), SE);
482 if (!PeelWhilePredicateIsKnown(NewPeelCount, IterVal, BoundSCEV, Step,
485 DesiredPeelCount = NewPeelCount;
491 ComputePeelCount(SI->getCondition(), 0);
493 ComputePeelCountMinMax(
MinMax);
496 auto *BI = dyn_cast<BranchInst>(BB->getTerminator());
497 if (!BI || BI->isUnconditional())
501 if (L.getLoopLatch() == BB)
504 ComputePeelCount(BI->getCondition(), 0);
507 return DesiredPeelCount;
520 if (!LatchBR || LatchBR->
getNumSuccessors() != 2 || !L->isLoopExiting(Latch))
525 "At least one edge out of the latch must go to the header");
528 L->getUniqueNonLatchExitBlocks(ExitBlocks);
540 unsigned Threshold) {
541 assert(LoopSize > 0 &&
"Zero loop size is not allowed!");
559 <<
" iterations.\n");
570 if (2 * LoopSize > Threshold)
573 unsigned AlreadyPeeled = 0;
575 AlreadyPeeled = *Peeled;
582 MaxPeelCount = std::min(MaxPeelCount, Threshold / LoopSize - 1);
586 unsigned DesiredPeelCount = TargetPeelCount;
593 if (MaxPeelCount > DesiredPeelCount) {
595 auto NumPeels = PhiAnalyzer(*L, MaxPeelCount).calculateIterationsToPeel();
597 DesiredPeelCount = std::max(DesiredPeelCount, *NumPeels);
600 DesiredPeelCount = std::max(DesiredPeelCount,
603 if (DesiredPeelCount == 0)
606 if (DesiredPeelCount > 0) {
607 DesiredPeelCount = std::min(DesiredPeelCount, MaxPeelCount);
609 assert(DesiredPeelCount > 0 &&
"Wrong loop size estimation?");
612 <<
" iteration(s) to turn"
613 <<
" some Phis into invariants.\n");
633 if (L->getHeader()->getParent()->hasProfileData()) {
637 if (!EstimatedTripCount)
641 << *EstimatedTripCount <<
"\n");
643 if (*EstimatedTripCount) {
644 if (*EstimatedTripCount + AlreadyPeeled <= MaxPeelCount) {
645 unsigned PeelCount = *EstimatedTripCount;
646 LLVM_DEBUG(
dbgs() <<
"Peeling first " << PeelCount <<
" iterations.\n");
650 LLVM_DEBUG(
dbgs() <<
"Already peel count: " << AlreadyPeeled <<
"\n");
655 << (Threshold / LoopSize - 1) <<
"\n");
690 ? std::max(
Info.Weights[
Idx] - SubWeight, SubWeight)
698 L->getExitingBlocks(ExitingBlocks);
699 for (
BasicBlock *ExitingBlock : ExitingBlocks) {
710 if (L->contains(Succ))
711 FallThroughWeights += Weight;
713 ExitWeights += Weight;
717 if (FallThroughWeights == 0)
722 if (!L->contains(Succ)) {
730 double W = (double)Weight / (
double)FallThroughWeights;
734 WeightInfos.
insert({Term, {std::move(Weights), std::move(SubWeights)}});
757 BasicBlock *PreHeader = L->getLoopPreheader();
762 Loop *ParentLoop = L->getParentLoop();
794 std::string Ext = (
Twine(
"Peel") +
Twine(IterNumber)).str();
796 Header->getContext(), Ext);
801 for (
Loop *ChildLoop : *L) {
802 cloneLoop(ChildLoop, ParentLoop, VMap, LI,
nullptr);
816 BasicBlock *NewLatch = cast<BasicBlock>(VMap[Latch]);
817 auto *LatchTerm = cast<Instruction>(NewLatch->
getTerminator());
818 for (
unsigned idx = 0, e = LatchTerm->getNumSuccessors(); idx < e; ++idx)
819 if (LatchTerm->getSuccessor(idx) == Header) {
820 LatchTerm->setSuccessor(idx, InsertBot);
835 PHINode *NewPHI = cast<PHINode>(VMap[&*
I]);
836 if (IterNumber == 0) {
840 Instruction *LatchInst = dyn_cast<Instruction>(LatchVal);
841 if (LatchInst && L->contains(LatchInst))
842 VMap[&*
I] = LVMap[LatchInst];
844 VMap[&*
I] = LatchVal;
853 for (
auto Edge : ExitEdges)
855 Value *LatchVal =
PHI.getIncomingValueForBlock(Edge.first);
856 Instruction *LatchInst = dyn_cast<Instruction>(LatchVal);
857 if (LatchInst && L->contains(LatchInst))
858 LatchVal = VMap[LatchVal];
859 PHI.addIncoming(LatchVal, cast<BasicBlock>(VMap[Edge.first]));
866 LVMap[KV.first] = KV.second;
872 std::optional<bool> UserAllowPeeling,
873 std::optional<bool> UserAllowProfileBasedPeeling,
874 bool UnrollingSpecficValues) {
887 if (UnrollingSpecficValues) {
897 if (UserAllowPeeling)
899 if (UserAllowProfileBasedPeeling)
917 assert(PeelCount > 0 &&
"Attempt to peel out zero iterations?");
918 assert(
canPeel(L) &&
"Attempt to peel a loop which is not peelable?");
924 BasicBlock *PreHeader = L->getLoopPreheader();
927 L->getExitEdges(ExitEdges);
934 for (
auto *BB : L->blocks()) {
935 auto *BBDomNode = DT.
getNode(BB);
937 for (
auto *ChildDomNode : BBDomNode->children()) {
938 auto *ChildBB = ChildDomNode->getBlock();
939 if (!L->contains(ChildBB))
947 for (
auto *ChildBB : ChildrenToUpdate)
948 NonLoopBlocksIDom[ChildBB] = NewIDom;
1004 InsertTop->
setName(Header->getName() +
".peel.begin");
1005 InsertBot->
setName(Header->getName() +
".peel.next");
1009 cast<Instruction>(cast<BasicBlock>(Latch)->getTerminator());
1022 for (
unsigned Iter = 0; Iter < PeelCount; ++Iter) {
1027 LoopBlocks, VMap, LVMap, &DT, LI,
1028 LoopLocalNoAliasDeclScopes, *SE);
1036 for (
auto BBIDom : NonLoopBlocksIDom)
1038 cast<BasicBlock>(LVMap[BBIDom.second]));
1039#ifdef EXPENSIVE_CHECKS
1040 assert(DT.
verify(DominatorTree::VerificationLevel::Fast));
1043 for (
auto &[Term,
Info] : Weights) {
1044 auto *TermCopy = cast<Instruction>(VMap[Term]);
1050 auto *LatchTermCopy = cast<Instruction>(VMap[LatchTerm]);
1051 LatchTermCopy->setMetadata(LLVMContext::MD_loop,
nullptr);
1053 InsertTop = InsertBot;
1055 InsertBot->
setName(Header->getName() +
".peel.next");
1057 F->splice(InsertTop->
getIterator(),
F, NewBlocks[0]->getIterator(),
1065 Value *NewVal =
PHI->getIncomingValueForBlock(Latch);
1066 Instruction *LatchInst = dyn_cast<Instruction>(NewVal);
1067 if (LatchInst && L->contains(LatchInst))
1068 NewVal = LVMap[LatchInst];
1070 PHI->setIncomingValueForBlock(NewPreHeader, NewVal);
1073 for (
const auto &[Term,
Info] : Weights) {
1078 unsigned AlreadyPeeled = 0;
1080 AlreadyPeeled = *Peeled;
1083 if (
Loop *ParentLoop = L->getParentLoop())
1090#ifdef EXPENSIVE_CHECKS
1092 assert(DT.
verify(DominatorTree::VerificationLevel::Fast));
1096 simplifyLoop(L, &DT, LI, SE, AC,
nullptr, PreserveLCSSA);
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
Analysis containing CSE Info
Returns the sub type a function will return at a given Idx Should correspond to the result type of an ExtractValue instruction executed with just that one unsigned Idx
This file defines the DenseMap class.
static const unsigned MaxDepth
static void updateBranchWeights(Instruction *Term, WeightInfo &Info)
Update the branch weights of an exiting block of a peeled-off loop iteration.
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< unsigned > UnrollPeelMaxCount("unroll-peel-max-count", cl::init(7), cl::Hidden, cl::desc("Max average trip count which will cause loop peeling."))
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."))
static cl::opt< unsigned > UnrollForcePeelCount("unroll-force-peel-count", cl::init(0), cl::Hidden, cl::desc("Force a peel count regardless of profiling information."))
static unsigned countToEliminateCompares(Loop &L, unsigned MaxPeelCount, ScalarEvolution &SE)
static bool violatesLegacyMultiExitLoopCheck(Loop *L)
This "heuristic" exactly matches implicit behavior which used to exist inside getLoopEstimatedTripCou...
static const char * PeeledCountMetaData
static void cloneLoopBlocks(Loop *L, unsigned IterNumber, BasicBlock *InsertTop, BasicBlock *InsertBot, 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.
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 > UnrollPeelCount("unroll-peel-count", cl::Hidden, cl::desc("Set the unroll peeling count, for testing purposes"))
static unsigned peelToTurnInvariantLoadsDerefencebale(Loop &L, DominatorTree &DT, AssumptionCache *AC)
static void initBranchWeights(DenseMap< Instruction *, WeightInfo > &WeightInfos, Loop *L)
Initialize the weights for all exiting blocks.
This file contains the declarations for profiling metadata utility functions.
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
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.
const CallInst * getTerminatingDeoptimizeCall() const
Returns the call instruction calling @llvm.experimental.deoptimize prior to the terminating return in...
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
Predicate
This enumeration lists the possible predicates for CmpInst subclasses.
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.
std::pair< iterator, bool > insert(const std::pair< KeyT, ValueT > &KV)
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.
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...
bool dominates(const BasicBlock *BB, const Use &U) const
Return true if the (end of the) basic block BB dominates the use U.
bool isEquality() const
Return true if this predicate is either EQ or NE.
InstListType::iterator eraseFromParent()
This method unlinks 'this' from the containing basic block and deletes it.
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.
RPOIterator beginRPO() const
Reverse iterate over the cached postorder blocks.
std::vector< BasicBlock * >::const_reverse_iterator RPOIterator
void perform(const LoopInfo *LI)
Traverse the loop blocks and store the DFS result.
RPOIterator endRPO() const
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.
Value * getIncomingValueForBlock(const BasicBlock *BB) const
This node represents a polynomial recurrence on the trip count of the specified loop.
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.
bool hasNoSelfWrap() const
This class represents an analyzed expression in the program.
Type * getType() const
Return the LLVM type of this SCEV expression.
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.
bool isKnownNegative(const SCEV *S)
Test if the given expression is known to be negative.
const SCEV * getConstant(ConstantInt *V)
const SCEV * getSCEV(Value *V)
Return a SCEV expression for the full generality of the specified expression.
std::optional< bool > evaluatePredicate(ICmpInst::Predicate Pred, const SCEV *LHS, const SCEV *RHS)
Check whether the condition described by Pred, LHS, and RHS is true or false.
bool isKnownPositive(const SCEV *S)
Test if the given expression is known to be positive.
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,...
void forgetTopmostLoop(const Loop *L)
void forgetBlockAndLoopDispositions(Value *V=nullptr)
Called when the client has changed the disposition of values in a loop or block.
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...
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,...
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.
This class represents the LLVM 'select' instruction.
iterator find(ConstPtrType Ptr) const
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.
void setName(const Twine &Name)
Change the name of the value.
StringRef getName() const
Return a constant reference to the value's name.
self_iterator getIterator()
BinaryOp_match< LHS, RHS, Instruction::And > m_And(const LHS &L, const RHS &R)
bool match(Val *V, const Pattern &P)
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)
BinaryOp_match< LHS, RHS, Instruction::Or > m_Or(const LHS &L, const RHS &R)
initializer< Ty > init(const Ty &Val)
NodeAddr< PhiNode * > Phi
This is an optimization pass for GlobalISel generic memory operations.
bool simplifyLoop(Loop *L, DominatorTree *DT, LoopInfo *LI, ScalarEvolution *SE, AssumptionCache *AC, MemorySSAUpdater *MSSAU, bool PreserveLCSSA)
Simplify each loop in a loop nest recursively.
detail::zippy< detail::zip_shortest, T, U, Args... > zip(T &&t, U &&u, Args &&...args)
zip iterator for two or more iteratable types.
std::optional< unsigned > getLoopEstimatedTripCount(Loop *L, unsigned *EstimatedLoopInvocationWeight=nullptr)
Returns a loop's estimated trip count based on branch weight metadata.
bool all_of(R &&range, UnaryPredicate P)
Provide wrappers to std::all_of which take ranges instead of having to pass begin/end explicitly.
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 @...
void computePeelCount(Loop *L, unsigned LoopSize, TargetTransformInfo::PeelingPreferences &PP, unsigned TripCount, DominatorTree &DT, ScalarEvolution &SE, AssumptionCache *AC=nullptr, unsigned Threshold=UINT_MAX)
auto enumerate(FirstRange &&First, RestRanges &&...Rest)
Given two or more input ranges, returns a new range whose values are tuples (A, B,...
auto successors(const MachineBasicBlock *BB)
bool canPeel(const Loop *L)
void addStringMetadataToLoop(Loop *TheLoop, const char *MDString, unsigned V=0)
Set input string into loop metadata by keeping other values intact.
bool any_of(R &&range, UnaryPredicate P)
Provide wrappers to std::any_of which take ranges instead of having to pass begin/end explicitly.
void setBranchWeights(Instruction &I, ArrayRef< uint32_t > Weights, bool IsExpected)
Create a new branch_weights metadata node and add or overwrite a prof metadata reference to instructi...
TargetTransformInfo::PeelingPreferences gatherPeelingPreferences(Loop *L, ScalarEvolution &SE, const TargetTransformInfo &TTI, std::optional< bool > UserAllowPeeling, std::optional< bool > UserAllowProfileBasedPeeling, bool UnrollingSpecficValues=false)
raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
std::optional< int > getOptionalIntLoopAttribute(const Loop *TheLoop, StringRef Name)
Find named metadata for a loop with an integer value.
BasicBlock * CloneBasicBlock(const BasicBlock *BB, ValueToValueMapTy &VMap, const Twine &NameSuffix="", Function *F=nullptr, ClonedCodeInfo *CodeInfo=nullptr)
Return a copy of the specified basic block, but without embedding the block into a particular functio...
void cloneAndAdaptNoAliasScopes(ArrayRef< MDNode * > NoAliasDeclScopes, ArrayRef< BasicBlock * > NewBlocks, LLVMContext &Context, StringRef Ext)
Clone the specified noalias decl scopes.
void remapInstructionsInBlocks(ArrayRef< BasicBlock * > Blocks, ValueToValueMapTy &VMap)
Remaps instructions in Blocks using the mapping in VMap.
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.
bool extractBranchWeights(const MDNode *ProfileData, SmallVectorImpl< uint32_t > &Weights)
Extract branch weights from MD_prof metadata.
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.
void identifyNoAliasScopesToClone(ArrayRef< BasicBlock * > BBs, SmallVectorImpl< MDNode * > &NoAliasDeclScopes)
Find the 'llvm.experimental.noalias.scope.decl' intrinsics in the specified basic blocks and extract ...
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...
bool peelLoop(Loop *L, unsigned PeelCount, 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...
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...
Implement std::hash so that hash_code can be used in STL containers.
void swap(llvm::BitVector &LHS, llvm::BitVector &RHS)
Implement std::swap in terms of BitVector swap.
SmallVector< uint32_t > Weights
const SmallVector< uint32_t > SubWeights