47#define DEBUG_TYPE "loop-unroll" 
   50          "Number of loops unrolled with run-time trip counts");
 
   53    cl::desc(
"Allow runtime unrolling for loops with multiple exits, when " 
   54             "epilog is generated"));
 
   57    cl::desc(
"Assume the non latch exit block to be predictable"));
 
  102  assert(Latch && 
"Loop must have a latch");
 
  111    for (
PHINode &PN : Succ->phis()) {
 
  123      if (L->contains(&PN)) {
 
  125        NewPN->
addIncoming(PN.getIncomingValueForBlock(NewPreHeader),
 
  132      Value *V = PN.getIncomingValueForBlock(Latch);
 
  134        if (L->contains(
I)) {
 
  145      if (L->contains(&PN))
 
  146        PN.setIncomingValueForBlock(NewPreHeader, NewPN);
 
  148        PN.addIncoming(NewPN, PrologExit);
 
  162                           nullptr, PreserveLCSSA);
 
  177      B.CreateICmpULT(BECount, ConstantInt::get(BECount->
getType(), 
Count - 1));
 
  181                         nullptr, PreserveLCSSA);
 
  183  MDNode *BranchWeights = 
nullptr;
 
  189  B.CreateCondBr(BrLoopExit, OriginalLoopLatchExit, NewPreHeader,
 
 
  211  return ProbOneNotTooMany / ProbNotTooMany;
 
 
  243  assert(Latch && 
"Loop must have a latch");
 
  276    assert(PN.hasOneUse() && 
"The phi should have 1 use");
 
  278    assert(EpilogPN->
getParent() == Exit && 
"EpilogPN should be in Exit block");
 
  280    Value *V = PN.getIncomingValueForBlock(Latch);
 
  282    if (
I && L->contains(
I))
 
  290          "EpilogPN should have EpilogPreHeader incoming block");
 
  307    if (!L->contains(Succ))
 
  314    assert(Succ == L->getHeader() &&
 
  315           "Expect the only in-loop successor of latch to be the loop header");
 
  317    for (
PHINode &PN : Succ->phis()) {
 
  320                                        PN.getName() + 
".unr");
 
  323      NewPN0->
addIncoming(PN.getIncomingValueForBlock(Latch), Latch);
 
  327                                        PN.getName() + 
".epil.init");
 
  330      NewPN1->
addIncoming(PN.getIncomingValueForBlock(NewPreHeader), PreHeader);
 
  344  Value *BrLoopExit = 
B.CreateIsNotNull(ModVal, 
"lcmp.mod");
 
  345  assert(Exit && 
"Loop must have a single exit block only");
 
  351  MDNode *BranchWeights = 
nullptr;
 
  359      B.CreateCondBr(BrLoopExit, EpilogPreHeader, Exit, BranchWeights);
 
 
  385                             const bool UseEpilogRemainder,
 
  386                             const bool UnrollRemainder, 
BasicBlock *InsertTop,
 
  388                             std::vector<BasicBlock *> &NewBlocks,
 
  391                             std::optional<unsigned> OriginalTripCount,
 
  393  StringRef suffix = UseEpilogRemainder ? 
"epil" : 
"prol";
 
  399  Loop *ParentLoop = L->getParentLoop();
 
  401  NewLoops[ParentLoop] = ParentLoop;
 
  407    NewBlocks.push_back(NewBB);
 
  431      VMap.
erase((*BB)->getTerminator());
 
  441      auto *Zero = ConstantInt::get(NewIdx->
getType(), 0);
 
  442      auto *One = ConstantInt::get(NewIdx->
getType(), 1);
 
  444          Builder.CreateAdd(NewIdx, One, NewIdx->
getName() + 
".next");
 
  445      Value *IdxCmp = Builder.CreateICmpNE(IdxNext, NewIter, NewIdx->
getName() + 
".cmp");
 
  446      MDNode *BranchWeights = 
nullptr;
 
  447      if ((OriginalLoopProb.
isUnknown() || !UseEpilogRemainder) &&
 
  456          BackEdgeWeight = (
Count - 2) / 2;
 
  467          Builder.CreateCondBr(IdxCmp, FirstLoopBB, InsertBot, BranchWeights);
 
  468      if (!OriginalLoopProb.
isUnknown() && UseEpilogRemainder) {
 
  472        double FreqRemIters = 1;
 
  475          for (
unsigned N = 
Count - 2; 
N >= 1; --
N) {
 
  483        double ProbDouble = 1 - 1 / FreqRemIters;
 
  509  Loop *NewLoop = NewLoops[L];
 
  510  assert(NewLoop && 
"L should have been cloned");
 
  512  if (OriginalTripCount && UseEpilogRemainder)
 
  516  if (!UnrollRemainder)
 
 
  525    bool UseEpilogRemainder) {
 
  543  L->getExitingBlocks(ExitingBlocks);
 
  544  if (ExitingBlocks.
size() > 2)
 
  548  if (OtherExits.
size() == 0)
 
  557  return (OtherExits.
size() == 1 &&
 
  559           OtherExits[0]->getPostdominatingDeoptimizeCall()));
 
 
  584    return B.CreateAnd(TripCount, 
Count - 1, 
"xtraiter");
 
  589  Value *ModValTmp = 
B.CreateURem(BECount, CountC);
 
  590  Value *ModValAdd = 
B.CreateAdd(ModValTmp,
 
  591                                 ConstantInt::get(ModValTmp->
getType(), 1));
 
  594  return B.CreateURem(ModValAdd, CountC, 
"xtraiter");
 
 
  637    Loop *L, 
unsigned Count, 
bool AllowExpensiveTripCount,
 
  638    bool UseEpilogRemainder, 
bool UnrollRemainder, 
bool ForgetAllSCEV,
 
  641    unsigned SCEVExpansionBudget, 
bool RuntimeUnrollMultiExit,
 
  642    Loop **ResultLoop, std::optional<unsigned> OriginalTripCount,
 
  646  LLVM_DEBUG(UseEpilogRemainder ? 
dbgs() << 
"Using epilog remainder.\n" 
  647                                : 
dbgs() << 
"Using prolog remainder.\n");
 
  650  if (!L->isLoopSimplifyForm()) {
 
  665        << 
"Loop latch not terminated by a conditional branch.\n");
 
  669  unsigned ExitIndex = LatchBR->
getSuccessor(0) == Header ? 1 : 0;
 
  672  if (L->contains(LatchExit)) {
 
  677        << 
"One of the loop latch successors must be the exit block.\n");
 
  683  L->getUniqueNonLatchExitBlocks(OtherExits);
 
  686  if (!L->getExitingBlock() || OtherExits.
size()) {
 
  699      if (!RuntimeUnrollMultiExit &&
 
  701                                                   UseEpilogRemainder)) {
 
  703                             "multi-exit unrolling not enabled!\n");
 
  728  const SCEV *TripCountSC =
 
  735  BasicBlock *PreHeader = L->getLoopPreheader();
 
  739  if (!AllowExpensiveTripCount &&
 
  742    LLVM_DEBUG(
dbgs() << 
"High cost for expanding trip count scev!\n");
 
  751        << 
"Count failed constraint on overflow trip count calculation.\n");
 
  769  if (UseEpilogRemainder) {
 
  776                                     nullptr, PreserveLCSSA);
 
  781    NewExitTerminator->
setDebugLoc(Header->getTerminator()->getDebugLoc());
 
  783    EpilogPreHeader = 
SplitBlock(NewExit, NewExitTerminator, DT, LI);
 
  784    EpilogPreHeader->
setName(Header->getName() + 
".epil.preheader");
 
  792    if (
auto *ParentL = L->getParentLoop())
 
  793      if (LI->getLoopFor(LatchExit) != ParentL) {
 
  794        LI->removeBlock(NewExit);
 
  795        ParentL->addBasicBlockToLoop(NewExit, *LI);
 
  796        LI->removeBlock(EpilogPreHeader);
 
  797        ParentL->addBasicBlockToLoop(EpilogPreHeader, *LI);
 
  803    PrologPreHeader = 
SplitEdge(PreHeader, Header, DT, LI);
 
  804    PrologPreHeader->
setName(Header->getName() + 
".prol.preheader");
 
  807    PrologExit->
setName(Header->getName() + 
".prol.loopexit");
 
  841    TripCount = 
B.CreateFreeze(TripCount);
 
  854      UseEpilogRemainder ? 
B.CreateICmpULT(BECount,
 
  855                                           ConstantInt::get(BECount->
getType(),
 
  857                           B.CreateIsNotNull(ModVal, 
"lcmp.mod");
 
  859      UseEpilogRemainder ? EpilogPreHeader : PrologPreHeader;
 
  860  BasicBlock *UnrollingLoop = UseEpilogRemainder ? NewPreHeader : PrologExit;
 
  862  MDNode *BranchWeights = 
nullptr;
 
  863  if ((OriginalLoopProb.
isUnknown() || !UseEpilogRemainder) &&
 
  870      B.CreateCondBr(BranchVal, RemainderLoop, UnrollingLoop, BranchWeights);
 
  871  if (!OriginalLoopProb.
isUnknown() && UseEpilogRemainder) {
 
  882    if (UseEpilogRemainder)
 
  891  LoopBlocks.perform(LI);
 
  898  std::vector<BasicBlock *> NewBlocks;
 
  904  BasicBlock *InsertBot = UseEpilogRemainder ? LatchExit : PrologExit;
 
  905  BasicBlock *InsertTop = UseEpilogRemainder ? EpilogPreHeader : PrologPreHeader;
 
  906  Loop *remainderLoop =
 
  907      CloneLoopBlocks(L, ModVal, UseEpilogRemainder, UnrollRemainder, InsertTop,
 
  908                      InsertBot, NewPreHeader, NewBlocks, LoopBlocks, VMap, DT,
 
  909                      LI, 
Count, OriginalTripCount, OriginalLoopProb);
 
  912  F->splice(InsertBot->
getIterator(), 
F, NewBlocks[0]->getIterator(), 
F->end());
 
  918  for (
auto *BB : OtherExits) {
 
  922    for (
PHINode &PN : BB->phis()) {
 
  923     unsigned oldNumOperands = PN.getNumIncomingValues();
 
  926     for (
unsigned i = 0; i < oldNumOperands; i++){
 
  927       auto *PredBB =PN.getIncomingBlock(i);
 
  931       if (!L->contains(PredBB))
 
  936       auto *V = PN.getIncomingValue(i);
 
  943#if defined(EXPENSIVE_CHECKS) && !defined(NDEBUG) 
  946             "Breaks the definition of dedicated exits!");
 
  958  if (DT && !L->getExitingBlock()) {
 
  964    for (
auto *BB : L->blocks()) {
 
  965      auto *DomNodeBB = DT->
getNode(BB);
 
  966      for (
auto *DomChild : DomNodeBB->children()) {
 
  967        auto *DomChildBB = DomChild->getBlock();
 
  968        if (!L->contains(LI->
getLoopFor(DomChildBB)) &&
 
  969            DomChildBB->getUniquePredecessor() != BB)
 
  973    for (
auto *BB : ChildrenToUpdate)
 
  995    Module *M = BB->getModule();
 
 1004  if (UseEpilogRemainder) {
 
 1007    ConnectEpilog(L, ModVal, NewExit, LatchExit, PreHeader, EpilogPreHeader,
 
 1008                  NewPreHeader, VMap, DT, LI, PreserveLCSSA, *SE, 
Count, *AC,
 
 1021    auto *Zero = ConstantInt::get(NewIdx->
getType(), 0);
 
 1022    auto *One = ConstantInt::get(NewIdx->
getType(), 1);
 
 1033                  NewPreHeader, VMap, DT, LI, PreserveLCSSA, *SE);
 
 1041#if defined(EXPENSIVE_CHECKS) && !defined(NDEBUG) 
 1043    assert(DT->
verify(DominatorTree::VerificationLevel::Full));
 
 1049  if (
Count == 2 && DT && LI && SE) {
 
 1056    remainderLoop = 
nullptr;
 
 1059    const DataLayout &
DL = L->getHeader()->getDataLayout();
 
 1065            Inst.replaceAllUsesWith(V);
 
 1077    assert(ExitBB && 
"required after breaking cond br backedge");
 
 1085  if (OtherExits.
size() > 0) {
 
 1096  if (remainderLoop && UnrollRemainder) {
 
 1106           "A loop with a convergence heart does not allow runtime unrolling.");
 
 1107    UnrollResult = 
UnrollLoop(remainderLoop, ULO, LI, SE, DT, AC, 
TTI,
 
 1108                               nullptr, PreserveLCSSA);
 
 1112    *ResultLoop = remainderLoop;
 
 1113  NumRuntimeUnrolled++;
 
 
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")
 
Module.h This file contains the declarations for the Module class.
 
static void ConnectEpilog(Loop *L, Value *ModVal, BasicBlock *NewExit, BasicBlock *Exit, BasicBlock *PreHeader, BasicBlock *EpilogPreHeader, BasicBlock *NewPreHeader, ValueToValueMapTy &VMap, DominatorTree *DT, LoopInfo *LI, bool PreserveLCSSA, ScalarEvolution &SE, unsigned Count, AssumptionCache &AC, BranchProbability OriginalLoopProb)
Connect the unrolling epilog code to the original loop.
 
static const uint32_t UnrolledLoopHeaderWeights[]
 
static Value * CreateTripRemainder(IRBuilder<> &B, Value *BECount, Value *TripCount, unsigned Count)
Calculate ModVal = (BECount + 1) % Count on the abstract integer domain accounting for the possibilit...
 
static Loop * CloneLoopBlocks(Loop *L, Value *NewIter, const bool UseEpilogRemainder, const bool UnrollRemainder, BasicBlock *InsertTop, BasicBlock *InsertBot, BasicBlock *Preheader, std::vector< BasicBlock * > &NewBlocks, LoopBlocksDFS &LoopBlocks, ValueToValueMapTy &VMap, DominatorTree *DT, LoopInfo *LI, unsigned Count, std::optional< unsigned > OriginalTripCount, BranchProbability OriginalLoopProb)
Create a clone of the blocks in a loop and connect them together.
 
static cl::opt< bool > UnrollRuntimeOtherExitPredictable("unroll-runtime-other-exit-predictable", cl::init(false), cl::Hidden, cl::desc("Assume the non latch exit block to be predictable"))
 
static bool canProfitablyRuntimeUnrollMultiExitLoop(Loop *L, SmallVectorImpl< BasicBlock * > &OtherExits, BasicBlock *LatchExit, bool UseEpilogRemainder)
Returns true if we can profitably unroll the multi-exit loop L.
 
static const uint32_t EpilogHeaderWeights[]
 
static cl::opt< bool > UnrollRuntimeMultiExit("unroll-runtime-multi-exit", cl::init(false), cl::Hidden, cl::desc("Allow runtime unrolling for loops with multiple exits, when " "epilog is generated"))
 
static BranchProbability probOfNextInRemainder(BranchProbability OriginalLoopProb, unsigned N)
Assume, due to our position in the remainder loop or its guard, anywhere from 0 to N more iterations ...
 
static void ConnectProlog(Loop *L, Value *BECount, unsigned Count, BasicBlock *PrologExit, BasicBlock *OriginalLoopLatchExit, BasicBlock *PreHeader, BasicBlock *NewPreHeader, ValueToValueMapTy &VMap, DominatorTree *DT, LoopInfo *LI, bool PreserveLCSSA, ScalarEvolution &SE)
Connect the unrolling prolog code to the original loop.
 
This file contains the declarations for profiling metadata utility functions.
 
This file defines the 'Statistic' class, which is designed to be an easy way to expose various metric...
 
#define STATISTIC(VARNAME, DESC)
 
This represents the llvm.assume intrinsic.
 
A cache of @llvm.assume calls within a function.
 
LLVM_ABI void registerAssumption(AssumeInst *CI)
Add an @llvm.assume intrinsic to this function's cache.
 
LLVM Basic Block Representation.
 
iterator_range< const_phi_iterator > phis() const
Returns a range that iterates over the phis in the basic block.
 
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 BasicBlock * getSingleSuccessor() const
Return the successor of this block if it has a single successor.
 
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.
 
void setCondition(Value *V)
 
BasicBlock * getSuccessor(unsigned i) const
 
bool isUnconditional() const
 
static LLVM_ABI BranchProbability getBranchProbability(uint64_t Numerator, uint64_t Denominator)
 
static uint32_t getDenominator()
 
BranchProbability pow(unsigned N) const
Compute pow(Probability, N).
 
static BranchProbability getOne()
 
uint32_t getNumerator() const
 
BranchProbability getCompl() const
 
This is an important base class in LLVM.
 
static LLVM_ABI Constant * getAllOnesValue(Type *Ty)
 
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 CallInst * CreateAssumption(Value *Cond, ArrayRef< OperandBundleDef > OpBundles={})
Create an assume intrinsic call that allows the optimizer to assume that the provided condition will ...
 
Value * CreateSub(Value *LHS, Value *RHS, const Twine &Name="", bool HasNUW=false, bool HasNSW=false)
 
Value * CreateAdd(Value *LHS, Value *RHS, const Twine &Name="", bool HasNUW=false, bool HasNSW=false)
 
Value * CreateIsNotNull(Value *Arg, const Twine &Name="")
Return a boolean value testing if Arg != 0.
 
void SetInsertPoint(BasicBlock *TheBB)
This specifies that created instructions should be appended to the end of the specified block.
 
Value * CreateICmp(CmpInst::Predicate P, Value *LHS, Value *RHS, const Twine &Name="")
 
This provides a uniform API for creating instructions and inserting them into a basic block: either a...
 
LLVM_ABI void insertBefore(InstListType::iterator InsertPos)
Insert an unlinked instruction into a basic block immediately before the specified position.
 
LLVM_ABI InstListType::iterator eraseFromParent()
This method unlinks 'this' from the containing basic block and deletes it.
 
void setDebugLoc(DebugLoc Loc)
Set the debug location information for this instruction.
 
LLVM_ABI void setSuccessor(unsigned Idx, BasicBlock *BB)
Update the specified successor to point at the provided block.
 
bool contains(const LoopT *L) const
Return true if the specified loop is contained within in this loop.
 
BlockT * getLoopLatch() const
If there is a single latch block for this loop, return it.
 
ArrayRef< BlockT * > getBlocks() const
Get a list of the basic blocks which make up this loop.
 
Store the result of a depth first search within basic blocks contained by a single loop.
 
std::vector< BasicBlock * >::const_reverse_iterator RPOIterator
 
void verify(const DominatorTreeBase< BlockT, false > &DomTree) const
 
LoopT * getLoopFor(const BlockT *BB) const
Return the inner most loop that BB lives in.
 
bool replacementPreservesLCSSAForm(Instruction *From, Value *To)
Returns true if replacing From with To everywhere is guaranteed to preserve LCSSA form.
 
Represents a single loop in the control flow graph.
 
void setLoopAlreadyUnrolled()
Add llvm.loop.unroll.disable to this loop's loop id metadata.
 
LLVM_ABI MDNode * createBranchWeights(uint32_t TrueWeight, uint32_t FalseWeight, bool IsExpected=false)
Return metadata containing two branch weights.
 
A Module instance is used to store all the information related to an LLVM module.
 
void addIncoming(Value *V, BasicBlock *BB)
Add an incoming value to the end of the PHI list.
 
void setIncomingValueForBlock(const BasicBlock *BB, Value *V)
Set every incoming value(s) for block BB to V.
 
void setIncomingBlock(unsigned i, BasicBlock *BB)
 
void setIncomingValue(unsigned i, Value *V)
 
Value * getIncomingValue(unsigned i) const
Return incoming value number x.
 
int getBasicBlockIndex(const BasicBlock *BB) const
Return the first index of the specified basic block in the value list for this PHI.
 
static PHINode * Create(Type *Ty, unsigned NumReservedValues, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
Constructors - NumReservedValues is a hint for the number of incoming edges that this phi node will h...
 
static LLVM_ABI PoisonValue * get(Type *T)
Static factory methods - Return an 'poison' object of the specified type.
 
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.
 
This class represents an analyzed expression in the program.
 
LLVM_ABI Type * getType() const
Return the LLVM type of this SCEV expression.
 
The main scalar evolution driver.
 
LLVM_ABI const SCEV * getConstant(ConstantInt *V)
 
bool loopHasNoAbnormalExits(const Loop *L)
Return true if the loop has no abnormal exits.
 
LLVM_ABI void forgetTopmostLoop(const Loop *L)
 
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 const SCEV * getExitCount(const Loop *L, const BasicBlock *ExitingBlock, ExitCountKind Kind=Exact)
Return the number of times the backedge executes before the given exit would be taken; if not exactly...
 
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.
 
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
 
reference emplace_back(ArgTypes &&... Args)
 
void push_back(const T &Elt)
 
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
 
StringRef - Represent a constant reference to a string, i.e.
 
ValueT lookup(const KeyT &Val) const
lookup - Return the entry for the specified key, or a default constructed value if no such entry exis...
 
bool erase(const KeyT &Val)
 
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.
 
const ParentTy * getParent() const
 
self_iterator getIterator()
 
initializer< Ty > init(const Ty &Val)
 
This is an optimization pass for GlobalISel generic memory operations.
 
LLVM_ABI bool RecursivelyDeleteTriviallyDeadInstructions(Value *V, const TargetLibraryInfo *TLI=nullptr, MemorySSAUpdater *MSSAU=nullptr, std::function< void(Value *)> AboutToDeleteCallback=std::function< void(Value *)>())
If the specified value is a trivially dead instruction, delete it.
 
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.
 
auto successors(const MachineBasicBlock *BB)
 
SmallDenseMap< const Loop *, Loop *, 4 > NewLoopsMap
 
iterator_range< early_inc_iterator_impl< detail::IterOfRange< RangeT > > > make_early_inc_range(RangeT &&Range)
Make a range that does early increment to allow mutation of the underlying range without disrupting i...
 
LLVM_ABI Value * simplifyInstruction(Instruction *I, const SimplifyQuery &Q)
See if we can compute a simplified version of this instruction.
 
bool setBranchProbability(BranchInst *B, BranchProbability P, bool ForFirstTarget)
Set branch weight metadata for B to indicate that P and 1 - P are the probabilities of control flowin...
 
LLVM_ABI bool isInstructionTriviallyDead(Instruction *I, const TargetLibraryInfo *TLI=nullptr)
Return true if the result produced by the instruction is not used, and the instruction will return.
 
unsigned Log2_32(uint32_t Value)
Return the floor log base 2 of the specified value, -1 if the value is zero.
 
void RemapDbgRecordRange(Module *M, iterator_range< DbgRecordIterator > Range, ValueToValueMapTy &VM, RemapFlags Flags=RF_None, ValueMapTypeRemapper *TypeMapper=nullptr, ValueMaterializer *Materializer=nullptr, const MetadataPredicate *IdentityMD=nullptr)
Remap the Values used in the DbgRecords Range using the value map VM.
 
constexpr bool isPowerOf2_32(uint32_t Value)
Return true if the argument is a power of two > 0.
 
LLVM_ABI CallBase * getLoopConvergenceHeart(const Loop *TheLoop)
Find the convergence heart of the loop.
 
@ RF_IgnoreMissingLocals
If this flag is set, the remapper ignores missing function-local entries (Argument,...
 
@ RF_NoModuleLevelChanges
If this flag is set, the remapper knows that only local values within a function (such as an instruct...
 
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
 
FunctionAddr VTableAddr Count
 
@ Unmodified
The loop was not modified.
 
@ FullyUnrolled
The loop was fully unrolled into straight-line code.
 
LLVM_ABI void breakLoopBackedge(Loop *L, DominatorTree &DT, ScalarEvolution &SE, LoopInfo &LI, MemorySSA *MSSA)
Remove the backedge of the specified loop.
 
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 BasicBlock * SplitBlockPredecessors(BasicBlock *BB, ArrayRef< BasicBlock * > Preds, const char *Suffix, DominatorTree *DT, LoopInfo *LI=nullptr, MemorySSAUpdater *MSSAU=nullptr, bool PreserveLCSSA=false)
This method introduces at least one new basic block into the function and moves some of the predecess...
 
LLVM_ABI bool MergeBlockIntoPredecessor(BasicBlock *BB, DomTreeUpdater *DTU=nullptr, LoopInfo *LI=nullptr, MemorySSAUpdater *MSSAU=nullptr, MemoryDependenceResults *MemDep=nullptr, bool PredecessorWithTwoSuccessors=false, DominatorTree *DT=nullptr)
Attempts to merge a block into its predecessor, if possible.
 
LLVM_ABI bool formDedicatedExitBlocks(Loop *L, DominatorTree *DT, LoopInfo *LI, MemorySSAUpdater *MSSAU, bool PreserveLCSSA)
Ensure that all exit blocks of the loop are dedicated exits.
 
void RemapInstruction(Instruction *I, ValueToValueMapTy &VM, RemapFlags Flags=RF_None, ValueMapTypeRemapper *TypeMapper=nullptr, ValueMaterializer *Materializer=nullptr, const MetadataPredicate *IdentityMD=nullptr)
Convert the instruction operands from referencing the current values into those specified by VM.
 
LLVM_ABI bool isGuaranteedNotToBeUndefOrPoison(const Value *V, AssumptionCache *AC=nullptr, const Instruction *CtxI=nullptr, const DominatorTree *DT=nullptr, unsigned Depth=0)
Return true if this function can prove that V does not have undef bits and is never poison.
 
ValueMap< const Value *, WeakTrackingVH > ValueToValueMapTy
 
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 const Loop * addClonedBlockToLoopInfo(BasicBlock *OriginalBB, BasicBlock *ClonedBB, LoopInfo *LI, NewLoopsMap &NewLoops)
Adds ClonedBB to LoopInfo, creates a new loop for ClonedBB if necessary and adds a mapping from the o...
 
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.
 
auto predecessors(const MachineBasicBlock *BB)
 
bool is_contained(R &&Range, const E &Element)
Returns true if Element is found in Range.
 
LLVM_ABI bool hasBranchWeightMD(const Instruction &I)
Checks if an instructions has Branch Weight Metadata.
 
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 UnrollRuntimeLoopRemainder(Loop *L, unsigned Count, bool AllowExpensiveTripCount, bool UseEpilogRemainder, bool UnrollRemainder, bool ForgetAllSCEV, LoopInfo *LI, ScalarEvolution *SE, DominatorTree *DT, AssumptionCache *AC, const TargetTransformInfo *TTI, bool PreserveLCSSA, unsigned SCEVExpansionBudget, bool RuntimeUnrollMultiExit, Loop **ResultLoop=nullptr, std::optional< unsigned > OriginalTripCount=std::nullopt, BranchProbability OriginalLoopProb=BranchProbability::getUnknown())
Insert code in the prolog/epilog code when unrolling a loop with a run-time trip-count.
 
LLVM_ABI LoopUnrollResult UnrollLoop(Loop *L, UnrollLoopOptions ULO, LoopInfo *LI, ScalarEvolution *SE, DominatorTree *DT, AssumptionCache *AC, const llvm::TargetTransformInfo *TTI, OptimizationRemarkEmitter *ORE, bool PreserveLCSSA, Loop **RemainderLoop=nullptr, AAResults *AA=nullptr)
Unroll the given loop by Count.
 
bool AllowExpensiveTripCount