78#define DEBUG_TYPE "loop-unroll"
81STATISTIC(NumCompletelyUnrolled,
"Number of loops completely unrolled");
82STATISTIC(NumUnrolled,
"Number of loops unrolled (completely or otherwise)");
83STATISTIC(NumUnrolledNotLatch,
"Number of loops unrolled without a conditional "
84 "latch (completely or otherwise)");
88 cl::desc(
"Allow runtime unrolled loops to be unrolled "
89 "with epilog instead of prolog."));
93 cl::desc(
"Verify domtree after unrolling"),
94#ifdef EXPENSIVE_CHECKS
103 cl::desc(
"Verify loopinfo after unrolling"),
104#ifdef EXPENSIVE_CHECKS
122 const std::vector<BasicBlock *> &
Blocks,
128 for (
Use &U :
I.operands()) {
129 if (
const auto *Def = dyn_cast<Instruction>(U)) {
151 assert(OldLoop &&
"Should (at least) be in the loop being unrolled!");
153 Loop *&NewLoop = NewLoops[OldLoop];
157 "Header should be first in RPO");
201 BasicBlock *PreHeader = L->getLoopPreheader();
203 assert(PreHeader && Header);
204 for (
const PHINode &PN : Header->phis()) {
205 if (isa<ConstantInt>(PN.getIncomingValueForBlock(PreHeader)))
221 unsigned CurrentGeneration;
222 unsigned ChildGeneration;
226 bool Processed =
false;
232 : LoadScope(AvailableLoads), CurrentGeneration(cg), ChildGeneration(cg),
233 Node(
N), ChildIter(Child), EndIter(
End) {}
266 if (!MSSA->
dominates(LaterDef, EarlierMA))
280 unsigned CurrentGeneration = 0;
281 while (!NodesToProcess.
empty()) {
300 auto *Load = dyn_cast<LoadInst>(&
I);
301 if (!Load || !Load->isSimple()) {
302 if (
I.mayWriteToMemory())
307 const SCEV *PtrSCEV = SE.
getSCEV(Load->getPointerOperand());
312 Load->replaceAllUsesWith(M);
313 Load->eraseFromParent();
321 }
else if (NodeToProcess->
childIter() != NodeToProcess->
end()) {
324 if (!L->contains(Child->
getBlock()))
348 if (SE && SimplifyIVs) {
354 while (!DeadInsts.
empty()) {
356 if (
Instruction *Inst = dyn_cast_or_null<Instruction>(V))
361 std::unique_ptr<MemorySSA> MSSA =
nullptr;
377 if (BB->getParent()->getSubprogram())
383 Inst.replaceAllUsesWith(V);
393 const APInt *C1, *C2;
395 auto *InnerI = dyn_cast<Instruction>(Inst.getOperand(0));
396 auto *InnerOBO = cast<OverflowingBinaryOperator>(Inst.getOperand(0));
399 Inst.setOperand(0,
X);
400 Inst.setOperand(1, ConstantInt::get(Inst.getType(), NewC));
401 Inst.setHasNoUnsignedWrap(Inst.hasNoUnsignedWrap() &&
402 InnerOBO->hasNoUnsignedWrap());
403 Inst.setHasNoSignedWrap(Inst.hasNoSignedWrap() &&
404 InnerOBO->hasNoSignedWrap() &&
426 for (
auto &BB : L->blocks()) {
427 for (
auto &
I : *BB) {
428 if (isa<ConvergenceControlInst>(
I))
430 if (
auto *CB = dyn_cast<CallBase>(&
I))
431 if (CB->isConvergent())
432 return CB->getConvergenceControlToken();
460 assert(DT &&
"DomTree is required");
462 if (!L->getLoopPreheader()) {
463 LLVM_DEBUG(
dbgs() <<
" Can't unroll; loop preheader-insertion failed.\n");
464 return LoopUnrollResult::Unmodified;
467 if (!L->getLoopLatch()) {
468 LLVM_DEBUG(
dbgs() <<
" Can't unroll; loop exit-block-insertion failed.\n");
469 return LoopUnrollResult::Unmodified;
473 if (!L->isSafeToClone()) {
474 LLVM_DEBUG(
dbgs() <<
" Can't unroll; Loop body cannot be cloned.\n");
475 return LoopUnrollResult::Unmodified;
478 if (L->getHeader()->hasAddressTaken()) {
481 dbgs() <<
" Won't unroll loop: address of header block is taken.\n");
482 return LoopUnrollResult::Unmodified;
489 BasicBlock *Preheader = L->getLoopPreheader();
493 L->getExitBlocks(ExitBlocks);
494 std::vector<BasicBlock *> OriginalLoopBlocks = L->getBlocks();
498 unsigned EstimatedLoopInvocationWeight = 0;
499 std::optional<unsigned> OriginalTripCount =
504 if (MaxTripCount && ULO.
Count > MaxTripCount)
505 ULO.
Count = MaxTripCount;
509 unsigned TripMultiple;
510 unsigned BreakoutTrip;
517 L->getExitingBlocks(ExitingBlocks);
518 for (
auto *ExitingBlock : ExitingBlocks) {
521 auto *BI = dyn_cast<BranchInst>(ExitingBlock->getTerminator());
525 ExitInfo &
Info = ExitInfos[ExitingBlock];
528 if (
Info.TripCount != 0) {
530 Info.TripMultiple = 0;
532 Info.BreakoutTrip =
Info.TripMultiple =
535 Info.ExitOnTrue = !L->contains(BI->getSuccessor(0));
536 Info.ExitingBlocks.push_back(ExitingBlock);
537 LLVM_DEBUG(
dbgs() <<
" Exiting block %" << ExitingBlock->getName()
538 <<
": TripCount=" <<
Info.TripCount
539 <<
", TripMultiple=" <<
Info.TripMultiple
540 <<
", BreakoutTrip=" <<
Info.BreakoutTrip <<
"\n");
546 const bool CompletelyUnroll = ULO.
Count == MaxTripCount;
548 const bool PreserveOnlyFirst = CompletelyUnroll && MaxOrZero;
552 if (CompletelyUnroll)
561 bool NeedToFixLCSSA =
562 PreserveLCSSA && CompletelyUnroll &&
576 bool LatchIsExiting = L->isLoopExiting(LatchBlock);
577 if (!LatchBI || (LatchBI->isConditional() && !LatchIsExiting)) {
579 dbgs() <<
"Can't unroll; a conditional latch must exit the loop");
580 return LoopUnrollResult::Unmodified;
584 "Can't runtime unroll if loop contains a convergent operation.");
586 bool EpilogProfitability =
600 "generated when assuming runtime trip count\n");
601 return LoopUnrollResult::Unmodified;
607 if (CompletelyUnroll) {
608 LLVM_DEBUG(
dbgs() <<
"COMPLETELY UNROLLING loop %" << Header->getName()
609 <<
" with trip count " << ULO.
Count <<
"!\n");
614 <<
"completely unrolled loop with "
615 << NV(
"UnrollCount", ULO.
Count) <<
" iterations";
618 LLVM_DEBUG(
dbgs() <<
"UNROLLING loop %" << Header->getName() <<
" by "
628 Diag <<
"unrolled loop by a factor of " << NV(
"UnrollCount", ULO.
Count);
630 Diag <<
" with run-time trip count";
653 ++NumUnrolledNotLatch;
658 std::vector<PHINode*> OrigPHINode;
660 OrigPHINode.push_back(cast<PHINode>(
I));
663 std::vector<BasicBlock *> Headers;
664 std::vector<BasicBlock *> Latches;
665 Headers.push_back(Header);
666 Latches.push_back(LatchBlock);
678 std::vector<BasicBlock*> UnrolledLoopBlocks = L->getBlocks();
689 if (Header->getParent()->shouldEmitDebugInfoForProfiling() &&
693 if (!
I.isDebugOrPseudoInst())
695 auto NewDIL = DIL->cloneByMultiplyingDuplicationFactor(ULO.
Count);
697 I.setDebugLoc(*NewDIL);
700 <<
"Failed to create new discriminator: "
701 << DIL->getFilename() <<
" Line: " << DIL->getLine());
712 auto BlockInsertPt = std::next(LatchBlock->
getIterator());
713 for (
unsigned It = 1; It != ULO.
Count; ++It) {
721 Header->getParent()->insert(BlockInsertPt, New);
724 "Header should not be in a sub-loop");
728 LoopsToSimplify.
insert(NewLoops[OldLoop]);
733 for (
PHINode *OrigPHI : OrigPHINode) {
734 PHINode *NewPHI = cast<PHINode>(VMap[OrigPHI]);
736 if (
Instruction *InValI = dyn_cast<Instruction>(InVal))
737 if (It > 1 && L->contains(InValI))
738 InVal = LastValueMap[InValI];
739 VMap[OrigPHI] = InVal;
747 Instruction *heartCopy = cast<Instruction>(it->second);
762 LastValueMap[*BB] = New;
765 LastValueMap[VI->first] = VI->second;
769 if (L->contains(Succ))
774 if (It != LastValueMap.
end())
783 Headers.push_back(New);
784 if (*BB == LatchBlock)
785 Latches.push_back(New);
789 auto ExitInfoIt = ExitInfos.
find(*BB);
790 if (ExitInfoIt != ExitInfos.
end())
791 ExitInfoIt->second.ExitingBlocks.push_back(New);
794 UnrolledLoopBlocks.push_back(New);
803 auto BBDomNode = DT->
getNode(*BB);
804 auto BBIDom = BBDomNode->
getIDom();
805 BasicBlock *OriginalBBIDom = BBIDom->getBlock();
807 New, cast<BasicBlock>(LastValueMap[cast<Value>(OriginalBBIDom)]));
816 if (
auto *
II = dyn_cast<AssumeInst>(&
I))
823 std::string ext = (
Twine(
"It") +
Twine(It)).str();
825 Header->getContext(), ext);
830 for (
PHINode *PN : OrigPHINode) {
831 if (CompletelyUnroll) {
832 PN->replaceAllUsesWith(PN->getIncomingValueForBlock(Preheader));
833 PN->eraseFromParent();
834 }
else if (ULO.
Count > 1) {
835 Value *InVal = PN->removeIncomingValue(LatchBlock,
false);
838 if (
Instruction *InValI = dyn_cast<Instruction>(InVal)) {
839 if (L->contains(InValI))
840 InVal = LastValueMap[InVal];
842 assert(Latches.back() == LastValueMap[LatchBlock] &&
"bad last latch");
843 PN->addIncoming(InVal, Latches.back());
849 for (
unsigned i = 0, e = Latches.size(); i != e; ++i) {
850 unsigned j = (i + 1) % e;
851 Latches[i]->getTerminator()->replaceSuccessorWith(Headers[i], Headers[j]);
859 for (
auto *BB : OriginalLoopBlocks) {
860 auto *BBDomNode = DT->
getNode(BB);
862 for (
auto *ChildDomNode : BBDomNode->children()) {
863 auto *ChildBB = ChildDomNode->getBlock();
864 if (!L->contains(ChildBB))
872 for (
auto *ChildBB : ChildrenToUpdate)
878 DT->
verify(DominatorTree::VerificationLevel::Fast));
881 auto SetDest = [&](
BasicBlock *Src,
bool WillExit,
bool ExitOnTrue) {
882 auto *Term = cast<BranchInst>(Src->getTerminator());
883 const unsigned Idx = ExitOnTrue ^ WillExit;
892 BI->setDebugLoc(Term->getDebugLoc());
893 Term->eraseFromParent();
895 DTUpdates.
emplace_back(DominatorTree::Delete, Src, DeadSucc);
898 auto WillExit = [&](
const ExitInfo &
Info,
unsigned i,
unsigned j,
899 bool IsLatch) -> std::optional<bool> {
900 if (CompletelyUnroll) {
901 if (PreserveOnlyFirst) {
909 if (
Info.TripCount && j !=
Info.TripCount)
917 if (IsLatch && j != 0)
922 if (j !=
Info.BreakoutTrip &&
923 (
Info.TripMultiple == 0 || j %
Info.TripMultiple != 0)) {
933 for (
auto &Pair : ExitInfos) {
934 ExitInfo &
Info = Pair.second;
935 for (
unsigned i = 0, e =
Info.ExitingBlocks.size(); i != e; ++i) {
937 unsigned j = (i + 1) % e;
938 bool IsLatch = Pair.first == LatchBlock;
939 std::optional<bool> KnownWillExit = WillExit(
Info, i, j, IsLatch);
940 if (!KnownWillExit) {
941 if (!
Info.FirstExitingBlock)
942 Info.FirstExitingBlock =
Info.ExitingBlocks[i];
951 if (*KnownWillExit && !IsLatch) {
952 if (!
Info.FirstExitingBlock)
953 Info.FirstExitingBlock =
Info.ExitingBlocks[i];
957 SetDest(
Info.ExitingBlocks[i], *KnownWillExit,
Info.ExitOnTrue);
963 if (ExitingBlocks.
size() == 1 && ExitInfos.
size() == 1) {
971 auto &[OriginalExit,
Info] = *ExitInfos.
begin();
972 if (!
Info.FirstExitingBlock)
973 Info.FirstExitingBlock =
Info.ExitingBlocks.back();
975 if (L->contains(
C->getBlock()))
984 if (!LatchIsExiting && CompletelyUnroll) {
994 BranchInst *Term = dyn_cast<BranchInst>(Latch->getTerminator());
996 (CompletelyUnroll && !LatchIsExiting && Latch == Latches.back())) &&
997 "Need a branch as terminator, except when fully unrolling with "
998 "unconditional latch");
999 if (Term && Term->isUnconditional()) {
1005 DTUToUse ?
nullptr : DT)) {
1018 DT->
verify(DominatorTree::VerificationLevel::Fast));
1025 NumCompletelyUnrolled += CompletelyUnroll;
1028 Loop *OuterL = L->getParentLoop();
1030 if (CompletelyUnroll) {
1034 }
else if (OriginalTripCount) {
1038 EstimatedLoopInvocationWeight);
1053 if (PreserveLCSSA && OuterL && CompletelyUnroll && !NeedToFixLCSSA)
1063 if (NeedToFixLCSSA) {
1068 Loop *FixLCSSALoop = OuterL;
1069 if (!FixLCSSALoop->
contains(LatchLoop))
1074 }
else if (PreserveLCSSA) {
1076 "Loops should be in LCSSA form after loop-unroll.");
1081 simplifyLoop(OuterL, DT, LI, SE, AC,
nullptr, PreserveLCSSA);
1084 for (
Loop *SubLoop : LoopsToSimplify)
1085 simplifyLoop(SubLoop, DT, LI, SE, AC,
nullptr, PreserveLCSSA);
1088 return CompletelyUnroll ? LoopUnrollResult::FullyUnrolled
1089 : LoopUnrollResult::PartiallyUnrolled;
1101 MDNode *MD = dyn_cast<MDNode>(MDO);
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
Analysis containing CSE Info
Optimize for code generation
#define LLVM_ATTRIBUTE_USED
This file contains the declarations for the subclasses of Constant, which represent the different fla...
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.
DenseMap< Block *, BlockRelaxAux > Blocks
static GCMetadataPrinterRegistry::Add< ErlangGCPrinter > X("erlang", "erlang-compatible garbage collector")
This file defines a set of templates that efficiently compute a dominator tree over a generic graph.
This file provides various utilities for inspecting and working with the control flow graph in LLVM I...
This defines the Use class.
static bool needToInsertPhisForLCSSA(Loop *L, const std::vector< BasicBlock * > &Blocks, LoopInfo *LI)
Check if unrolling created a situation where we need to insert phi nodes to preserve LCSSA form.
static bool isEpilogProfitable(Loop *L)
The function chooses which type of unroll (epilog or prolog) is more profitabale.
void loadCSE(Loop *L, DominatorTree &DT, ScalarEvolution &SE, LoopInfo &LI, BatchAAResults &BAA, function_ref< MemorySSA *()> GetMSSA)
Value * getMatchingValue(LoadValue LV, LoadInst *LI, unsigned CurrentGeneration, BatchAAResults &BAA, function_ref< MemorySSA *()> GetMSSA)
static cl::opt< bool > UnrollRuntimeEpilog("unroll-runtime-epilog", cl::init(false), cl::Hidden, cl::desc("Allow runtime unrolled loops to be unrolled " "with epilog instead of prolog."))
static cl::opt< bool > UnrollVerifyLoopInfo("unroll-verify-loopinfo", cl::Hidden, cl::desc("Verify loopinfo after unrolling"), cl::init(false))
static cl::opt< bool > UnrollVerifyDomtree("unroll-verify-domtree", cl::Hidden, cl::desc("Verify domtree after unrolling"), cl::init(false))
static LLVM_ATTRIBUTE_USED bool canHaveUnrollRemainder(const Loop *L)
This file exposes an interface to building/using memory SSA to walk memory instructions using a use/d...
uint64_t IntrinsicInst * II
This file implements a set that has insertion order iteration characteristics.
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)
void childGeneration(unsigned generation)
unsigned currentGeneration() const
unsigned childGeneration() const
StackNode(ScopedHashTable< const SCEV *, LoadValue > &AvailableLoads, unsigned cg, DomTreeNode *N, DomTreeNode::const_iterator Child, DomTreeNode::const_iterator End)
DomTreeNode::const_iterator end() const
DomTreeNode * nextChild()
DomTreeNode::const_iterator childIter() const
A private abstract base class describing the concept of an individual alias analysis implementation.
Class for arbitrary precision integers.
LLVM_ABI APInt sadd_ov(const APInt &RHS, bool &Overflow) const
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 begin()
Instruction iterator methods.
LLVM_ABI const BasicBlock * getSinglePredecessor() const
Return the predecessor of this block if it has a single predecessor block.
LLVM_ABI const BasicBlock * getUniquePredecessor() const
Return the predecessor of this block if it has a unique predecessor block.
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...
LLVM_ABI void removePredecessor(BasicBlock *Pred, bool KeepOneInputPHIs=false)
Update PHI nodes in this BasicBlock before removal of predecessor Pred.
This class is a wrapper over an AAResults, and it is intended to be used only when there are no IR ch...
Conditional or Unconditional Branch instruction.
static BranchInst * Create(BasicBlock *IfTrue, InsertPosition InsertBefore=nullptr)
A parsed version of the target data layout string in and methods for querying it.
ValueT lookup(const_arg_type_t< KeyT > Val) const
lookup - Return the entry for the specified key, or a default constructed value if no such entry exis...
iterator find(const_arg_type_t< KeyT > Val)
iterator_range< iterator > children()
DomTreeNodeBase * getIDom() const
typename SmallVector< DomTreeNodeBase *, 4 >::const_iterator const_iterator
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...
DomTreeT & getDomTree()
Flush DomTree updates and return DomTree.
void applyUpdates(ArrayRef< UpdateT > Updates)
Submit updates to all available trees.
LLVM_ABI InstListType::iterator eraseFromParent()
This method unlinks 'this' from the containing basic block and deletes it.
An instruction for reading from memory.
bool contains(const LoopT *L) const
Return true if the specified loop is contained within in this loop.
BlockT * getHeader() const
void addBasicBlockToLoop(BlockT *NewBB, LoopInfoBase< BlockT, LoopT > &LI)
This method is used by other analyses to update loop information.
void addChildLoop(LoopT *NewChild)
Add the specified loop to be a child of this loop.
LoopT * getParentLoop() const
Return the parent loop if it exists or nullptr for top level loops.
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
void verify(const DominatorTreeBase< BlockT, false > &DomTree) const
void addTopLevelLoop(LoopT *New)
This adds the specified loop to the collection of top-level loops.
LoopT * AllocateLoop(ArgsTy &&...Args)
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.
LLVM_ABI void erase(Loop *L)
Update LoopInfo after removing the last backedge from a loop.
Represents a single loop in the control flow graph.
bool isLCSSAForm(const DominatorTree &DT, bool IgnoreTokens=true) const
Return true if the Loop is in LCSSA form.
const MDOperand & getOperand(unsigned I) const
ArrayRef< MDOperand > operands() const
unsigned getNumOperands() const
Return number of MDNode operands.
Tracking metadata reference owned by Metadata.
LLVM_ABI StringRef getString() const
MemoryAccess * getClobberingMemoryAccess(const Instruction *I, BatchAAResults &AA)
Given a memory Mod/Ref/ModRef'ing instruction, calling this will give you the nearest dominating Memo...
Encapsulates MemorySSA, including all data associated with memory accesses.
LLVM_ABI bool dominates(const MemoryAccess *A, const MemoryAccess *B) const
Given two memory accesses in potentially different blocks, determine whether MemoryAccess A dominates...
LLVM_ABI MemorySSAWalker * getWalker()
MemoryUseOrDef * getMemoryAccess(const Instruction *I) const
Given a memory Mod/Ref'ing instruction, get the MemorySSA access associated with it.
Value * getIncomingValueForBlock(const BasicBlock *BB) const
This class represents an analyzed expression in the program.
The main scalar evolution driver.
LLVM_ABI unsigned getSmallConstantTripMultiple(const Loop *L, const SCEV *ExitCount)
Returns the largest constant divisor of the trip count as a normal unsigned value,...
LLVM_ABI const SCEV * getSCEV(Value *V)
Return a SCEV expression for the full generality of the specified expression.
LLVM_ABI unsigned getSmallConstantMaxTripCount(const Loop *L, SmallVectorImpl< const SCEVPredicate * > *Predicates=nullptr)
Returns the upper bound of the loop trip count as a normal unsigned value.
LLVM_ABI bool isBackedgeTakenCountMaxOrZero(const Loop *L)
Return true if the backedge taken count is either the value returned by getConstantMaxBackedgeTakenCo...
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 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 unsigned getSmallConstantTripCount(const Loop *L)
Returns the exact trip count of the loop if we can compute it, and the result is a small constant.
LLVM_ABI void forgetAllLoops()
void insert(const K &Key, const V &Val)
V lookup(const K &Key) const
void insert_range(Range &&R)
bool insert(const value_type &X)
Insert a new element into the SetVector.
A SetVector that performs no allocations if smaller than a certain size.
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.
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
A Use represents the edge between a Value definition and its users.
iterator find(const KeyT &Val)
bool erase(const KeyT &Val)
DMAtomT AtomMap
Map {(InlinedAt, old atom number) -> new atom number}.
LLVM Value Representation.
Type * getType() const
All values are typed, get the type of this value.
int getNumOccurrences() const
An efficient, type-erasing, non-owning reference to a callable.
self_iterator getIterator()
@ C
The default llvm calling convention, compatible with C.
BinaryOp_match< LHS, RHS, Instruction::Add > m_Add(const LHS &L, const RHS &R)
bool match(Val *V, const Pattern &P)
apint_match m_APInt(const APInt *&Res)
Match a ConstantInt or splatted ConstantVector, binding the specified pointer to the contained APInt.
class_match< Value > m_Value()
Match an arbitrary value and ignore it.
initializer< Ty > init(const Ty &Val)
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.
auto drop_begin(T &&RangeOrContainer, size_t N=1)
Return a range covering RangeOrContainer with the first N elements excluded.
LLVM_ABI bool RemoveRedundantDbgInstrs(BasicBlock *BB)
Try to remove redundant dbg.value instructions from given basic block.
LLVM_ABI std::optional< unsigned > getLoopEstimatedTripCount(Loop *L, unsigned *EstimatedLoopInvocationWeight=nullptr)
Returns a loop's estimated trip count based on branch weight metadata.
LLVM_ABI void simplifyLoopAfterUnroll(Loop *L, bool SimplifyIVs, LoopInfo *LI, ScalarEvolution *SE, DominatorTree *DT, AssumptionCache *AC, const TargetTransformInfo *TTI, AAResults *AA=nullptr)
Perform some cleanup and simplifications on loops after unrolling.
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...
auto successors(const MachineBasicBlock *BB)
LLVM_ABI bool formLCSSARecursively(Loop &L, const DominatorTree &DT, const LoopInfo *LI, ScalarEvolution *SE)
Put a loop nest into LCSSA form.
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.
void erase(Container &C, ValueType V)
Wrapper function to remove a value from a container:
LLVM_ABI cl::opt< bool > EnableFSDiscriminator
bool any_of(R &&range, UnaryPredicate P)
Provide wrappers to std::any_of which take ranges instead of having to pass begin/end explicitly.
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.
LLVM_ABI CallBase * getLoopConvergenceHeart(const Loop *TheLoop)
Find the convergence heart of the loop.
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
bool simplifyLoopIVs(Loop *L, ScalarEvolution *SE, DominatorTree *DT, LoopInfo *LI, const TargetTransformInfo *TTI, SmallVectorImpl< WeakTrackingVH > &Dead)
SimplifyLoopIVs - Simplify users of induction variables within this loop.
SmallVector< ValueTypeFromRangeType< R >, Size > to_vector(R &&Range)
Given a range of type R, iterate the entire range and return a SmallVector with elements of the vecto...
LoopUnrollResult
Represents the result of a UnrollLoop invocation.
LLVM_ABI unsigned changeToUnreachable(Instruction *I, bool PreserveLCSSA=false, DomTreeUpdater *DTU=nullptr, MemorySSAUpdater *MSSAU=nullptr)
Insert an unreachable instruction before the specified instruction, making it and the rest of the cod...
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.
void replace(R &&Range, const T &OldValue, const T &NewValue)
Provide wrappers to std::replace which take ranges instead of having to pass begin/end explicitly.
LLVM_ABI bool setLoopEstimatedTripCount(Loop *L, unsigned EstimatedTripCount, unsigned EstimatedLoopInvocationWeight)
Set a loop's branch weight metadata to reflect that loop has EstimatedTripCount iterations and Estima...
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.
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...
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)
Insert code in the prolog/epilog code when unrolling a loop with a run-time trip-count.
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 MDNode * GetUnrollMetadata(MDNode *LoopID, StringRef Name)
Given an llvm.loop loop id metadata node, returns the loop hint metadata node with the given name (fo...
LLVM_ABI void RemapSourceAtom(Instruction *I, ValueToValueMapTy &VM)
Remap source location atom.
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.
LoadValue(Instruction *Inst, unsigned Generation)
Incoming for lane maks phi as machine instruction, incoming register Reg and incoming block Block are...
const Instruction * Heart
bool RuntimeUnrollMultiExit
bool AllowExpensiveTripCount
unsigned SCEVExpansionBudget