79#define DEBUG_TYPE "loop-unroll" 
   82STATISTIC(NumCompletelyUnrolled, 
"Number of loops completely unrolled");
 
   83STATISTIC(NumUnrolled, 
"Number of loops unrolled (completely or otherwise)");
 
   84STATISTIC(NumUnrolledNotLatch, 
"Number of loops unrolled without a conditional " 
   85                               "latch (completely or otherwise)");
 
   89                    cl::desc(
"Allow runtime unrolled loops to be unrolled " 
   90                             "with epilog instead of prolog."));
 
   94                    cl::desc(
"Verify domtree after unrolling"),
 
   95#ifdef EXPENSIVE_CHECKS
 
  104                    cl::desc(
"Verify loopinfo after unrolling"),
 
  105#ifdef EXPENSIVE_CHECKS
 
  114    cl::desc(
"Allow unrolling to add parallel reduction phis."));
 
  126                                     const std::vector<BasicBlock *> &Blocks,
 
  132      for (
Use &U : 
I.operands()) {
 
 
  155  assert(OldLoop && 
"Should (at least) be in the loop being unrolled!");
 
  157  Loop *&NewLoop = NewLoops[OldLoop];
 
  161           "Header should be first in RPO");
 
 
  205  BasicBlock *PreHeader = L->getLoopPreheader();
 
  207  assert(PreHeader && Header);
 
  208  for (
const PHINode &PN : Header->phis()) {
 
 
  225  unsigned CurrentGeneration;
 
  226  unsigned ChildGeneration;
 
  230  bool Processed = 
false;
 
  236      : LoadScope(AvailableLoads), CurrentGeneration(cg), ChildGeneration(cg),
 
  237        Node(
N), ChildIter(Child), EndIter(End) {}
 
 
 
  270    if (!MSSA->
dominates(LaterDef, EarlierMA))
 
 
  284  unsigned CurrentGeneration = 0;
 
  285  while (!NodesToProcess.
empty()) {
 
  305        if (!Load || !Load->isSimple()) {
 
  306          if (
I.mayWriteToMemory())
 
  311        const SCEV *PtrSCEV = SE.
getSCEV(Load->getPointerOperand());
 
  316            Load->replaceAllUsesWith(M);
 
  317            Load->eraseFromParent();
 
  325    } 
else if (NodeToProcess->
childIter() != NodeToProcess->
end()) {
 
  328      if (!L->contains(Child->
getBlock()))
 
 
  352  if (SE && SimplifyIVs) {
 
  358    while (!DeadInsts.
empty()) {
 
  365      std::unique_ptr<MemorySSA> MSSA = 
nullptr;
 
  381    if (BB->getParent()->getSubprogram())
 
  387          Inst.replaceAllUsesWith(V);
 
  397        const APInt *C1, *C2;
 
  403          Inst.setOperand(0, 
X);
 
  404          Inst.setOperand(1, ConstantInt::get(Inst.getType(), NewC));
 
  405          Inst.setHasNoUnsignedWrap(Inst.hasNoUnsignedWrap() &&
 
  406                                    InnerOBO->hasNoUnsignedWrap());
 
  407          Inst.setHasNoSignedWrap(Inst.hasNoSignedWrap() &&
 
  408                                  InnerOBO->hasNoSignedWrap() &&
 
 
  430  for (
auto &BB : L->blocks()) {
 
  431    for (
auto &
I : *BB) {
 
  435        if (CB->isConvergent())
 
  436          return CB->getConvergenceControlToken();
 
 
  464  assert(DT && 
"DomTree is required");
 
  466  if (!L->getLoopPreheader()) {
 
  467    LLVM_DEBUG(
dbgs() << 
"  Can't unroll; loop preheader-insertion failed.\n");
 
  471  if (!L->getLoopLatch()) {
 
  472    LLVM_DEBUG(
dbgs() << 
"  Can't unroll; loop exit-block-insertion failed.\n");
 
  477  if (!L->isSafeToClone()) {
 
  478    LLVM_DEBUG(
dbgs() << 
"  Can't unroll; Loop body cannot be cloned.\n");
 
  482  if (L->getHeader()->hasAddressTaken()) {
 
  485        dbgs() << 
"  Won't unroll loop: address of header block is taken.\n");
 
  493  BasicBlock *Preheader = L->getLoopPreheader();
 
  497  L->getExitBlocks(ExitBlocks);
 
  498  std::vector<BasicBlock *> OriginalLoopBlocks = L->getBlocks();
 
  502  std::optional<unsigned> OriginalTripCount =
 
  508  if (MaxTripCount && ULO.
Count > MaxTripCount)
 
  509    ULO.
Count = MaxTripCount;
 
  513    unsigned TripMultiple;
 
  514    unsigned BreakoutTrip;
 
  521  L->getExitingBlocks(ExitingBlocks);
 
  522  for (
auto *ExitingBlock : ExitingBlocks) {
 
  529    ExitInfo &Info = ExitInfos[ExitingBlock];
 
  532    if (Info.TripCount != 0) {
 
  533      Info.BreakoutTrip = Info.TripCount % ULO.
Count;
 
  534      Info.TripMultiple = 0;
 
  536      Info.BreakoutTrip = Info.TripMultiple =
 
  539    Info.ExitOnTrue = !L->contains(BI->getSuccessor(0));
 
  540    Info.ExitingBlocks.push_back(ExitingBlock);
 
  541    LLVM_DEBUG(
dbgs() << 
"  Exiting block %" << ExitingBlock->getName()
 
  542                      << 
": TripCount=" << Info.TripCount
 
  543                      << 
", TripMultiple=" << Info.TripMultiple
 
  544                      << 
", BreakoutTrip=" << Info.BreakoutTrip << 
"\n");
 
  550  const bool CompletelyUnroll = ULO.
Count == MaxTripCount;
 
  552  const bool PreserveOnlyFirst = CompletelyUnroll && MaxOrZero;
 
  556  if (CompletelyUnroll)
 
  565  bool NeedToFixLCSSA =
 
  566      PreserveLCSSA && CompletelyUnroll &&
 
  580  bool LatchIsExiting = L->isLoopExiting(LatchBlock);
 
  581  if (!LatchBI || (LatchBI->isConditional() && !LatchIsExiting)) {
 
  583        dbgs() << 
"Can't unroll; a conditional latch must exit the loop");
 
  588         "Can't runtime unroll if loop contains a convergent operation.");
 
  590  bool EpilogProfitability =
 
  599          RemainderLoop, OriginalTripCount, OriginalLoopProb)) {
 
  604                           "generated when assuming runtime trip count\n");
 
  611  if (CompletelyUnroll) {
 
  612    LLVM_DEBUG(
dbgs() << 
"COMPLETELY UNROLLING loop %" << Header->getName()
 
  613                      << 
" with trip count " << ULO.
Count << 
"!\n");
 
  618               << 
"completely unrolled loop with " 
  619               << NV(
"UnrollCount", ULO.
Count) << 
" iterations";
 
  622    LLVM_DEBUG(
dbgs() << 
"UNROLLING loop %" << Header->getName() << 
" by " 
  632        Diag << 
"unrolled loop by a factor of " << NV(
"UnrollCount", ULO.
Count);
 
  634          Diag << 
" with run-time trip count";
 
  657    ++NumUnrolledNotLatch;
 
  662  std::vector<PHINode*> OrigPHINode;
 
  673  bool CanAddAdditionalAccumulators =
 
  677      !CompletelyUnroll && L->getNumBlocks() == 1 &&
 
  679       (ExitInfos.
contains(Header) && ((ExitInfos[Header].TripCount != 0 &&
 
  680                                        ExitInfos[Header].BreakoutTrip == 0))));
 
  687  if (CanAddAdditionalAccumulators && ULO.
Count <= 4) {
 
  688    for (
PHINode &Phi : Header->phis()) {
 
  702  std::vector<BasicBlock *> Headers;
 
  703  std::vector<BasicBlock *> Latches;
 
  704  Headers.push_back(Header);
 
  705  Latches.push_back(LatchBlock);
 
  717  std::vector<BasicBlock*> UnrolledLoopBlocks = L->getBlocks();
 
  728  if (Header->getParent()->shouldEmitDebugInfoForProfiling() &&
 
  732        if (!
I.isDebugOrPseudoInst())
 
  734            auto NewDIL = DIL->cloneByMultiplyingDuplicationFactor(ULO.
Count);
 
  736              I.setDebugLoc(*NewDIL);
 
  739                         << 
"Failed to create new discriminator: " 
  740                         << DIL->getFilename() << 
" Line: " << DIL->getLine());
 
  751  auto BlockInsertPt = std::next(LatchBlock->
getIterator());
 
  753  for (
unsigned It = 1; It != ULO.
Count; ++It) {
 
  761      Header->getParent()->insert(BlockInsertPt, New);
 
  764             "Header should not be in a sub-loop");
 
  768        LoopsToSimplify.
insert(NewLoops[OldLoop]);
 
  773        for (
PHINode *OrigPHI : OrigPHINode) {
 
  781            if (PartialReductions.
empty())
 
  789                L->getLoopPreheader(),
 
  802            if (It > 1 && L->contains(InValI))
 
  803              InVal = LastValueMap[InValI];
 
  804          VMap[OrigPHI] = InVal;
 
  827      LastValueMap[*BB] = New;
 
  830        LastValueMap[VI->first] = VI->second;
 
  834        if (L->contains(Succ))
 
  839          if (It != LastValueMap.
end())
 
  848        Headers.push_back(New);
 
  849      if (*BB == LatchBlock)
 
  850        Latches.push_back(New);
 
  854      auto ExitInfoIt = ExitInfos.
find(*BB);
 
  855      if (ExitInfoIt != ExitInfos.
end())
 
  856        ExitInfoIt->second.ExitingBlocks.push_back(New);
 
  859      UnrolledLoopBlocks.push_back(New);
 
  868        auto BBDomNode = DT->
getNode(*BB);
 
  869        auto BBIDom = BBDomNode->
getIDom();
 
  870        BasicBlock *OriginalBBIDom = BBIDom->getBlock();
 
  888      std::string ext = (
Twine(
"It") + 
Twine(It)).str();
 
  890                                 Header->getContext(), ext);
 
  895  for (
PHINode *PN : OrigPHINode) {
 
  896    if (CompletelyUnroll) {
 
  897      PN->replaceAllUsesWith(PN->getIncomingValueForBlock(Preheader));
 
  898      PN->eraseFromParent();
 
  899    } 
else if (ULO.
Count > 1) {
 
  903      Value *InVal = PN->removeIncomingValue(LatchBlock, 
false);
 
  907        if (L->contains(InValI))
 
  908          InVal = LastValueMap[InVal];
 
  910      assert(Latches.back() == LastValueMap[LatchBlock] && 
"bad last latch");
 
  911      PN->addIncoming(InVal, Latches.back());
 
  917  for (
unsigned i = 0, e = Latches.size(); i != e; ++i) {
 
  918    unsigned j = (i + 1) % e;
 
  919    Latches[i]->getTerminator()->replaceSuccessorWith(Headers[i], Headers[j]);
 
  927    for (
auto *BB : OriginalLoopBlocks) {
 
  928      auto *BBDomNode = DT->
getNode(BB);
 
  930      for (
auto *ChildDomNode : BBDomNode->children()) {
 
  931        auto *ChildBB = ChildDomNode->getBlock();
 
  932        if (!L->contains(ChildBB))
 
  940      for (
auto *ChildBB : ChildrenToUpdate)
 
  946         DT->
verify(DominatorTree::VerificationLevel::Fast));
 
  949  auto SetDest = [&](
BasicBlock *Src, 
bool WillExit, 
bool ExitOnTrue) {
 
  951    const unsigned Idx = ExitOnTrue ^ WillExit;
 
  953    BasicBlock *DeadSucc = Term->getSuccessor(1-Idx);
 
  960    BI->setDebugLoc(Term->getDebugLoc());
 
  961    Term->eraseFromParent();
 
  966  auto WillExit = [&](
const ExitInfo &Info, 
unsigned i, 
unsigned j,
 
  967                      bool IsLatch) -> std::optional<bool> {
 
  968    if (CompletelyUnroll) {
 
  969      if (PreserveOnlyFirst) {
 
  977      if (Info.TripCount && j != Info.TripCount)
 
  985      if (IsLatch && j != 0)
 
  990    if (j != Info.BreakoutTrip &&
 
  991        (Info.TripMultiple == 0 || j % Info.TripMultiple != 0)) {
 
 1001  for (
auto &Pair : ExitInfos) {
 
 1002    ExitInfo &Info = Pair.second;
 
 1003    for (
unsigned i = 0, e = Info.ExitingBlocks.size(); i != e; ++i) {
 
 1005      unsigned j = (i + 1) % e;
 
 1006      bool IsLatch = Pair.first == LatchBlock;
 
 1007      std::optional<bool> KnownWillExit = WillExit(Info, i, j, IsLatch);
 
 1008      if (!KnownWillExit) {
 
 1009        if (!Info.FirstExitingBlock)
 
 1010          Info.FirstExitingBlock = Info.ExitingBlocks[i];
 
 1019      if (*KnownWillExit && !IsLatch) {
 
 1020        if (!Info.FirstExitingBlock)
 
 1021          Info.FirstExitingBlock = Info.ExitingBlocks[i];
 
 1025      SetDest(Info.ExitingBlocks[i], *KnownWillExit, Info.ExitOnTrue);
 
 1031  if (ExitingBlocks.
size() == 1 && ExitInfos.
size() == 1) {
 
 1039    auto &[OriginalExit, Info] = *ExitInfos.
begin();
 
 1040    if (!Info.FirstExitingBlock)
 
 1041      Info.FirstExitingBlock = Info.ExitingBlocks.back();
 
 1043      if (L->contains(
C->getBlock()))
 
 1045      C->setIDom(DT->
getNode(Info.FirstExitingBlock));
 
 1052  if (!LatchIsExiting && CompletelyUnroll) {
 
 1064            (CompletelyUnroll && !LatchIsExiting && Latch == Latches.back())) &&
 
 1065           "Need a branch as terminator, except when fully unrolling with " 
 1066           "unconditional latch");
 
 1067    if (Term && Term->isUnconditional()) {
 
 1073                                    DTUToUse ? 
nullptr : DT)) {
 
 1083  if (!PartialReductions.
empty()) {
 
 1086           "Can only introduce parallel reduction phis with single exit block");
 
 1088           "currently only a single reduction is supported");
 
 1089    Value *FinalRdxValue = PartialReductions.
back();
 
 1090    Value *RdxResult = 
nullptr;
 
 1092      if (Phi.getIncomingValueForBlock(L->getLoopLatch()) != FinalRdxValue)
 
 1095        RdxResult = PartialReductions.
front();
 
 1099          RdxResult = Builder.CreateBinOp(
 
 1101              RdxPart, RdxResult, 
"bin.rdx");
 
 1103        NeedToFixLCSSA = 
true;
 
 1105          RdxPart->dropPoisonGeneratingFlags();
 
 1108      Phi.replaceAllUsesWith(RdxResult);
 
 1117         DT->
verify(DominatorTree::VerificationLevel::Fast));
 
 1124  NumCompletelyUnrolled += CompletelyUnroll;
 
 1127  Loop *OuterL = L->getParentLoop();
 
 1129  if (CompletelyUnroll) {
 
 1167    if (OriginalTripCount) {
 
 1168      unsigned NewTripCount = *OriginalTripCount / ULO.
Count;
 
 1187  if (PreserveLCSSA && OuterL && CompletelyUnroll && !NeedToFixLCSSA)
 
 1197    if (NeedToFixLCSSA) {
 
 1202      Loop *FixLCSSALoop = OuterL;
 
 1203      if (!FixLCSSALoop->
contains(LatchLoop))
 
 1208    } 
else if (PreserveLCSSA) {
 
 1210             "Loops should be in LCSSA form after loop-unroll.");
 
 1215    simplifyLoop(OuterL, DT, LI, SE, AC, 
nullptr, PreserveLCSSA);
 
 1218    for (
Loop *SubLoop : LoopsToSimplify)
 
 1219      simplifyLoop(SubLoop, DT, LI, SE, AC, 
nullptr, PreserveLCSSA);
 
 
 1249std::optional<RecurrenceDescriptor>
 
 1255                                            nullptr, 
nullptr, SE))
 
 1256    return std::nullopt;
 
 1265    return std::nullopt;
 
 1268    return std::nullopt;
 
 1275    return std::nullopt;
 
 1282    return std::nullopt;
 
 
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
 
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
 
Optimize for code generation
 
#define LLVM_ATTRIBUTE_USED
 
This file contains the declarations for the subclasses of Constant, which represent the different fla...
 
This file defines the DenseMap class.
 
early cse Early CSE w MemorySSA
 
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)
 
static cl::opt< bool > UnrollAddParallelReductions("unroll-add-parallel-reductions", cl::init(false), cl::Hidden, cl::desc("Allow unrolling to add parallel reduction phis."))
 
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)
 
static TableGen::Emitter::OptClass< SkeletonEmitter > X("gen-skeleton-class", "Generate example skeleton class")
 
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
 
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.
 
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 * 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)
 
BranchProbability pow(unsigned N) const
Compute pow(Probability, N).
 
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)
 
bool contains(const_arg_type_t< KeyT > Val) const
Return true if the specified key is in the map, false otherwise.
 
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.
 
static constexpr UpdateKind Delete
 
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.
 
This provides a uniform API for creating instructions and inserting them into a basic block: either a...
 
LLVM_ABI void moveBefore(InstListType::iterator InsertPos)
Unlink this instruction from its current basic block and insert it into the basic block that MovePos ...
 
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.
 
void setIncomingValueForBlock(const BasicBlock *BB, Value *V)
Set every incoming value(s) for block BB to V.
 
Value * getIncomingValueForBlock(const BasicBlock *BB) const
 
The RecurrenceDescriptor is used to identify recurrences variables in a loop.
 
FastMathFlags getFastMathFlags() const
 
static LLVM_ABI unsigned getOpcode(RecurKind Kind)
Returns the opcode corresponding to the RecurrenceKind.
 
static LLVM_ABI bool isReductionPHI(PHINode *Phi, Loop *TheLoop, RecurrenceDescriptor &RedDes, DemandedBits *DB=nullptr, AssumptionCache *AC=nullptr, DominatorTree *DT=nullptr, ScalarEvolution *SE=nullptr)
Returns true if Phi is a reduction in TheLoop.
 
static bool isAnyOfRecurrenceKind(RecurKind Kind)
Returns true if the recurrence kind is of the form select(cmp(),x,y) where one of (x,...
 
RecurKind getRecurrenceKind() const
 
StoreInst * IntermediateStore
Reductions may store temporary or final result to an invariant address.
 
static bool isFindIVRecurrenceKind(RecurKind Kind)
Returns true if the recurrence kind is of the form select(cmp(),x,y) where one of (x,...
 
static LLVM_ABI bool isIntegerRecurrenceKind(RecurKind Kind)
Returns true if the recurrence kind is an integer kind.
 
static bool isMinMaxRecurrenceKind(RecurKind Kind)
Returns true if the recurrence kind is any min/max kind.
 
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
 
ScopedHashTableScope< K, V, KInfo, AllocatorTy > ScopeTy
ScopeTy - A type alias for easy access to the name of the scope for this hash table.
 
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.
 
LLVM_ABI bool replaceUsesOfWith(Value *From, Value *To)
Replace uses of one Value with another.
 
iterator find(const KeyT &Val)
 
ValueMapIteratorImpl< MapT, const Value *, false > iterator
 
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.
 
An efficient, type-erasing, non-owning reference to a callable.
 
self_iterator getIterator()
 
Abstract Attribute helper functions.
 
@ C
The default llvm calling convention, compatible with C.
 
BinaryOp_match< LHS, RHS, Instruction::Add > m_Add(const LHS &L, const RHS &R)
 
ap_match< APInt > m_APInt(const APInt *&Res)
Match a ConstantInt or splatted ConstantVector, binding the specified pointer to the contained APInt.
 
bool match(Val *V, const Pattern &P)
 
class_match< Value > m_Value()
Match an arbitrary value and ignore it.
 
initializer< Ty > init(const Ty &Val)
 
Add a small namespace to avoid name clashes with the classes used in the streaming interface.
 
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)
Return either:
 
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...
 
LLVM_ABI std::optional< RecurrenceDescriptor > canParallelizeReductionWhenUnrolling(PHINode &Phi, Loop *L, ScalarEvolution *SE)
 
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
 
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.
 
DomTreeNodeBase< BasicBlock > DomTreeNode
 
auto dyn_cast_or_null(const Y &Val)
 
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...
 
BranchProbability getLoopProbability(Loop *L)
Based on branch weight metadata, return either:
 
LoopUnrollResult
Represents the result of a UnrollLoop invocation.
 
@ PartiallyUnrolled
The loop was partially unrolled – we still have a loop, but with a smaller trip count.
 
@ Unmodified
The loop was not modified.
 
@ FullyUnrolled
The loop was fully unrolled into straight-line code.
 
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 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...
 
bool setLoopProbability(Loop *L, BranchProbability P)
Set branch weight metadata for the latch of L to indicate that, at the end of any iteration,...
 
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.
 
RecurKind
These are the kinds of recurrences that we support.
 
LLVM_ABI Value * getRecurrenceIdentity(RecurKind K, Type *Tp, FastMathFlags FMF)
Given information about an recurrence kind, return the identity for the @llvm.vector....
 
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 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.
 
bool is_contained(R &&Range, const E &Element)
Returns true if Element is found in Range.
 
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 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 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...
 
constexpr detail::IsaCheckPredicate< Types... > IsaPred
Function object wrapper for the llvm::isa type check.
 
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
 
bool AddAdditionalAccumulators
 
unsigned SCEVExpansionBudget
 
std::conditional_t< IsConst, const ValueT &, ValueT & > second