71#define LDIST_NAME "loop-distribute"
72#define DEBUG_TYPE LDIST_NAME
77 "llvm.loop.distribute.followup_all";
79 "llvm.loop.distribute.followup_coincident";
81 "llvm.loop.distribute.followup_sequential";
83 "llvm.loop.distribute.followup_fallback";
88 cl::desc(
"Turn on DominatorTree and LoopInfo verification "
89 "after Loop Distribution"),
93 "loop-distribute-non-if-convertible",
cl::Hidden,
94 cl::desc(
"Whether to distribute into a loop that may not be "
95 "if-convertible by the loop vectorizer"),
100 cl::desc(
"The maximum number of SCEV checks allowed for Loop "
104 "loop-distribute-scev-check-threshold-with-pragma",
cl::init(128),
106 cl::desc(
"The maximum number of SCEV checks allowed for Loop "
107 "Distribution for loop marked with #pragma clang loop "
108 "distribute(enable)"));
112 cl::desc(
"Enable the new, experimental LoopDistribution Pass"),
117STATISTIC(NumLoopsDistributed,
"Number of loops distributed");
128 : DepCycle(DepCycle), OrigLoop(L) {
133 bool hasDepCycle()
const {
return DepCycle; }
136 void add(Instruction *
I) { Set.insert(
I); }
143 bool empty()
const {
return Set.empty(); }
147 void moveTo(InstPartition &
Other) {
148 Other.Set.insert_range(Set);
150 Other.DepCycle |= DepCycle;
155 void populateUsedSet() {
159 for (
auto *
B : OrigLoop->getBlocks())
160 Set.insert(
B->getTerminator());
164 SmallVector<Instruction *, 8> Worklist(Set.begin(), Set.end());
165 while (!Worklist.empty()) {
168 for (
Value *V :
I->operand_values()) {
170 if (
I && OrigLoop->contains(
I->getParent()) && Set.insert(
I))
171 Worklist.push_back(
I);
181 unsigned Index, LoopInfo *LI,
184 VMap, Twine(
".ldist") + Twine(Index),
185 LI, DT, ClonedLoopBlocks);
191 const Loop *getClonedLoop()
const {
return ClonedLoop; }
196 Loop *getDistributedLoop()
const {
197 return ClonedLoop ? ClonedLoop : OrigLoop;
205 void remapInstructions() {
211 void removeUnusedInsts() {
212 SmallVector<Instruction *, 8>
Unused;
214 for (
auto *
Block : OrigLoop->getBlocks())
215 for (
auto &Inst : *
Block)
216 if (!Set.count(&Inst)) {
222 "Branches are marked used early on");
223 Unused.push_back(NewInst);
228 for (
auto *Inst :
reverse(Unused)) {
230 if (!Inst->use_empty())
232 Inst->eraseFromParent();
236 void print(raw_ostream &OS)
const {
237 OS << (DepCycle ?
" (cycle)\n" :
"\n");
240 OS <<
" " <<
I->getParent()->getName() <<
":" << *
I <<
"\n";
243 void printBlocks(raw_ostream &OS)
const {
244 for (
auto *BB : getDistributedLoop()->getBlocks())
260 Loop *ClonedLoop =
nullptr;
264 SmallVector<BasicBlock *, 8> ClonedLoopBlocks;
274class InstPartitionContainer {
275 using InstToPartitionIdT = DenseMap<Instruction *, int>;
278 InstPartitionContainer(Loop *L, LoopInfo *LI, DominatorTree *DT)
279 : L(L), LI(LI), DT(DT) {}
282 unsigned getSize()
const {
return PartitionContainer.size(); }
286 void addToCyclicPartition(Instruction *Inst) {
288 if (PartitionContainer.empty() || !PartitionContainer.back().hasDepCycle())
289 PartitionContainer.emplace_back(Inst, L,
true);
291 PartitionContainer.back().add(Inst);
299 void addToNewNonCyclicPartition(Instruction *Inst) {
300 PartitionContainer.emplace_back(Inst, L);
308 void mergeAdjacentNonCyclic() {
309 mergeAdjacentPartitionsIf(
310 [](
const InstPartition *
P) {
return !
P->hasDepCycle(); });
315 void mergeNonIfConvertible() {
316 mergeAdjacentPartitionsIf([&](
const InstPartition *Partition) {
317 if (Partition->hasDepCycle())
321 bool seenStore =
false;
323 for (
auto *Inst : *Partition)
334 void mergeBeforePopulating() {
335 mergeAdjacentNonCyclic();
337 mergeNonIfConvertible();
347 bool mergeToAvoidDuplicatedLoads() {
348 using LoadToPartitionT = DenseMap<Instruction *, InstPartition *>;
349 using ToBeMergedT = EquivalenceClasses<InstPartition *>;
351 LoadToPartitionT LoadToPartition;
352 ToBeMergedT ToBeMerged;
357 for (PartitionContainerT::iterator
I = PartitionContainer.begin(),
358 E = PartitionContainer.end();
364 for (Instruction *Inst : *PartI)
367 LoadToPartitionT::iterator LoadToPart;
369 std::tie(LoadToPart, NewElt) =
370 LoadToPartition.insert(std::make_pair(Inst, PartI));
374 <<
"LDist: Merging partitions due to this load in multiple "
375 <<
"partitions: " << PartI <<
", " << LoadToPart->second <<
"\n"
381 ToBeMerged.unionSets(PartI, &*PartJ);
382 }
while (&*PartJ != LoadToPart->second);
386 if (ToBeMerged.empty())
391 for (
const auto &
C : ToBeMerged) {
395 auto PartI =
C->getData();
396 for (
auto *PartJ :
make_range(std::next(ToBeMerged.member_begin(*
C)),
397 ToBeMerged.member_end())) {
398 PartJ->moveTo(*PartI);
403 PartitionContainer.remove_if(
404 [](
const InstPartition &
P) {
return P.empty(); });
411 void setupPartitionIdOnInstructions() {
413 for (
const auto &Partition : PartitionContainer) {
414 for (Instruction *Inst : Partition) {
418 std::tie(Iter, NewElt) =
419 InstToPartitionId.insert(std::make_pair(Inst, PartitionID));
429 void populateUsedSet() {
430 for (
auto &
P : PartitionContainer)
441 assert(Pred &&
"Preheader does not have a single predecessor");
443 assert(ExitBlock &&
"No single exit block");
446 assert(!PartitionContainer.empty() &&
"at least two partitions expected");
450 "preheader not empty");
453 MDNode *OrigLoopID = L->getLoopID();
461 NewLoop = Part.cloneLoopWithPreheader(TopPH, Pred, Index, LI, DT);
463 Part.getVMap()[ExitBlock] = TopPH;
464 Part.remapInstructions();
465 setNewLoopID(OrigLoopID, &Part);
472 setNewLoopID(OrigLoopID, &PartitionContainer.back());
477 for (
auto Curr = PartitionContainer.cbegin(),
478 Next = std::next(PartitionContainer.cbegin()),
479 E = PartitionContainer.cend();
481 DT->changeImmediateDominator(
482 Next->getDistributedLoop()->getLoopPreheader(),
483 Curr->getDistributedLoop()->getExitingBlock());
487 void removeUnusedInsts() {
488 for (
auto &Partition : PartitionContainer)
489 Partition.removeUnusedInsts();
499 computePartitionSetForPointers(
const LoopAccessInfo &LAI) {
502 unsigned N = RtPtrCheck->
Pointers.size();
503 SmallVector<int, 8> PtrToPartitions(
N);
504 for (
unsigned I = 0;
I <
N; ++
I) {
507 auto ReadInstructions =
509 Instructions.append(ReadInstructions.begin(), ReadInstructions.end());
511 int &Partition = PtrToPartitions[
I];
514 for (Instruction *Inst : Instructions) {
517 int ThisPartition = this->InstToPartitionId[Inst];
519 Partition = ThisPartition;
521 else if (Partition == -1)
523 else if (Partition != ThisPartition)
526 assert(Partition != -2 &&
"Pointer not belonging to any partition");
529 return PtrToPartitions;
532 void print(raw_ostream &OS)
const {
534 for (
const auto &
P : PartitionContainer) {
535 OS <<
"LDist: Partition " <<
Index++ <<
":";
543 friend raw_ostream &
operator<<(raw_ostream &OS,
544 const InstPartitionContainer &Partitions) {
545 Partitions.print(OS);
550 void printBlocks(raw_ostream &OS)
const {
552 for (
const auto &
P : PartitionContainer) {
553 OS <<
"LDist: Partition " <<
Index++ <<
":";
559 using PartitionContainerT = std::list<InstPartition>;
562 PartitionContainerT PartitionContainer;
566 InstToPartitionIdT InstToPartitionId;
574 template <
class UnaryPredicate>
575 void mergeAdjacentPartitionsIf(UnaryPredicate Predicate) {
576 InstPartition *PrevMatch =
nullptr;
577 for (
auto I = PartitionContainer.begin();
I != PartitionContainer.end();) {
579 if (PrevMatch ==
nullptr && DoesMatch) {
582 }
else if (PrevMatch !=
nullptr && DoesMatch) {
583 I->moveTo(*PrevMatch);
584 I = PartitionContainer.erase(
I);
593 void setNewLoopID(MDNode *OrigLoopID, InstPartition *Part) {
600 Loop *NewLoop = Part->getDistributedLoop();
612class MemoryInstructionDependences {
613 using Dependence = MemoryDepChecker::Dependence;
618 unsigned NumUnsafeDependencesStartOrEnd = 0;
620 Entry(Instruction *Inst) : Inst(Inst) {}
623 using AccessesType = SmallVector<Entry, 8>;
628 MemoryInstructionDependences(
629 const SmallVectorImpl<Instruction *> &Instructions,
630 const SmallVectorImpl<Dependence> &Dependences) {
634 for (
const auto &Dep : Dependences)
635 if (Dep.isPossiblyBackward()) {
639 ++Accesses[Dep.Source].NumUnsafeDependencesStartOrEnd;
640 --Accesses[Dep.Destination].NumUnsafeDependencesStartOrEnd;
647 AccessesType Accesses;
651class LoopDistributeForLoop {
653 LoopDistributeForLoop(Loop *L, Function *F, LoopInfo *LI, DominatorTree *DT,
654 ScalarEvolution *SE, LoopAccessInfoManager &LAIs,
655 OptimizationRemarkEmitter *ORE)
656 : L(L), F(F), LI(LI), DT(DT), SE(SE), LAIs(LAIs), ORE(ORE) {
662 assert(L->isInnermost() &&
"Only process inner loops.");
665 << L->getHeader()->getParent()->getName() <<
"' from "
666 << L->getLocStr() <<
"\n");
669 if (!L->getExitBlock())
670 return fail(
"MultipleExitBlocks",
"multiple exit blocks");
671 if (!L->isLoopSimplifyForm())
672 return fail(
"NotLoopSimplifyForm",
673 "loop is not in loop-simplify form");
674 if (!L->isRotatedForm())
675 return fail(
"NotBottomTested",
"loop is not bottom tested");
679 LAI = &LAIs.getInfo(*L);
683 if (LAI->canVectorizeMemory())
684 return fail(
"MemOpsCanBeVectorized",
685 "memory operations are safe for vectorization");
687 auto *Dependences = LAI->getDepChecker().getDependences();
688 if (!Dependences || Dependences->empty())
689 return fail(
"NoUnsafeDeps",
"no unsafe dependences to isolate");
692 << L->getHeader()->getName() <<
"\n");
694 InstPartitionContainer Partitions(L, LI, DT);
715 const MemoryDepChecker &DepChecker = LAI->getDepChecker();
719 int NumUnsafeDependencesActive = 0;
720 for (
const auto &InstDep : MID) {
724 if (NumUnsafeDependencesActive ||
725 InstDep.NumUnsafeDependencesStartOrEnd > 0)
726 Partitions.addToCyclicPartition(
I);
728 Partitions.addToNewNonCyclicPartition(
I);
729 NumUnsafeDependencesActive += InstDep.NumUnsafeDependencesStartOrEnd;
730 assert(NumUnsafeDependencesActive >= 0 &&
731 "Negative number of dependences active");
740 for (
auto *Inst : DefsUsedOutside)
741 Partitions.addToNewNonCyclicPartition(Inst);
743 LLVM_DEBUG(
dbgs() <<
"LDist: Seeded partitions:\n" << Partitions);
744 if (Partitions.getSize() < 2)
745 return fail(
"CantIsolateUnsafeDeps",
746 "cannot isolate unsafe dependencies");
750 Partitions.mergeBeforePopulating();
751 LLVM_DEBUG(
dbgs() <<
"LDist: Merged partitions:\n" << Partitions);
752 if (Partitions.getSize() < 2)
753 return fail(
"CantIsolateUnsafeDeps",
754 "cannot isolate unsafe dependencies");
757 Partitions.populateUsedSet();
758 LLVM_DEBUG(
dbgs() <<
"LDist: Populated partitions:\n" << Partitions);
762 if (Partitions.mergeToAvoidDuplicatedLoads()) {
763 LLVM_DEBUG(
dbgs() <<
"LDist: Partitions merged to ensure unique loads:\n"
765 if (Partitions.getSize() < 2)
766 return fail(
"CantIsolateUnsafeDeps",
767 "cannot isolate unsafe dependencies");
772 const SCEVPredicate &Pred = LAI->getPSE().getPredicate();
774 return fail(
"RuntimeCheckWithConvergent",
775 "may not insert runtime check with convergent operation");
781 return fail(
"TooManySCEVRuntimeChecks",
782 "too many SCEV run-time checks needed.\n");
785 return fail(
"HeuristicDisabled",
"distribution heuristic disabled");
788 << L->getHeader()->getName() <<
"\n");
791 Partitions.setupPartitionIdOnInstructions();
794 auto PtrToPartition = Partitions.computePartitionSetForPointers(*LAI);
795 const auto *RtPtrChecking = LAI->getRuntimePointerChecking();
796 const auto &AllChecks = RtPtrChecking->getChecks();
797 auto Checks = includeOnlyCrossPartitionChecks(AllChecks, PtrToPartition,
800 if (LAI->hasConvergentOp() && !Checks.empty()) {
801 return fail(
"RuntimeCheckWithConvergent",
802 "may not insert runtime check with convergent operation");
812 assert(!LAI->hasConvergentOp() &&
"inserting illegal loop versioning");
814 MDNode *OrigLoopID = L->getLoopID();
817 LLVM_DEBUG(LAI->getRuntimePointerChecking()->printChecks(
dbgs(), Checks));
818 LoopVersioning LVer(*LAI, Checks, L, LI, DT, SE);
819 LVer.versionLoop(DefsUsedOutside);
820 LVer.annotateLoopWithNoAlias();
828 "llvm.loop.distribute.",
true);
829 LVer.getNonVersionedLoop()->setLoopID(UnversionedLoopID);
836 Partitions.cloneLoops();
840 Partitions.removeUnusedInsts();
846 assert(DT->verify(DominatorTree::VerificationLevel::Fast));
849 ++NumLoopsDistributed;
852 return OptimizationRemark(
LDIST_NAME,
"Distribute", L->getStartLoc(),
854 <<
"distributed loop";
860 bool fail(StringRef RemarkName, StringRef Message) {
861 LLVMContext &Ctx = F->getContext();
862 bool Forced = isForced().value_or(
false);
868 return OptimizationRemarkMissed(
LDIST_NAME,
"NotDistributed",
869 L->getStartLoc(), L->getHeader())
870 <<
"loop not distributed: use -Rpass-analysis=loop-distribute for "
877 ORE->emit(OptimizationRemarkAnalysis(
879 RemarkName, L->getStartLoc(), L->getHeader())
880 <<
"loop not distributed: " << Message);
885 Ctx.
diagnose(DiagnosticInfoOptimizationFailure(
886 *F, L->getStartLoc(),
"loop not distributed: failed "
887 "explicitly specified loop distribution"));
897 const std::optional<bool> &isForced()
const {
return IsForced; }
905 SmallVector<RuntimePointerCheck, 4> includeOnlyCrossPartitionChecks(
906 const SmallVectorImpl<RuntimePointerCheck> &AllChecks,
907 const SmallVectorImpl<int> &PtrToPartition,
908 const RuntimePointerChecking *RtPtrChecking) {
909 SmallVector<RuntimePointerCheck, 4> Checks;
911 copy_if(AllChecks, std::back_inserter(Checks),
913 for (
unsigned PtrIdx1 :
Check.first->Members)
914 for (
unsigned PtrIdx2 :
Check.second->Members)
930 PtrToPartition, PtrIdx1, PtrIdx2))
941 std::optional<const MDOperand *>
Value =
956 const LoopAccessInfo *LAI =
nullptr;
959 LoopAccessInfoManager &LAIs;
960 OptimizationRemarkEmitter *ORE;
968 std::optional<bool> IsForced;
981 for (
Loop *TopLevelLoop : *LI)
984 if (L->isInnermost())
989 for (
Loop *L : Worklist) {
990 LoopDistributeForLoop LDL(L, &
F, LI, DT, SE, LAIs, ORE);
995 dbgs() <<
"LDist: Distributed loop guarded for reprocessing\n");
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static void fail(const SDLoc &DL, SelectionDAG &DAG, const Twine &Msg, SDValue Val={})
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
This file contains the declarations for the subclasses of Constant, which represent the different fla...
This file defines the DenseMap class.
This file builds on the ADT/GraphTraits.h file to build generic depth first graph iterator.
Generic implementation of equivalence classes through the use Tarjan's efficient union-find algorithm...
static bool runImpl(Function &F, const TargetLowering &TLI, AssumptionCache *AC)
This is the interface for a simple mod/ref and alias analysis over globals.
This header defines various interfaces for pass management in LLVM.
This header provides classes for managing per-loop analyses.
static const char *const LLVMLoopDistributeFollowupCoincident
static cl::opt< bool > DistributeNonIfConvertible("loop-distribute-non-if-convertible", cl::Hidden, cl::desc("Whether to distribute into a loop that may not be " "if-convertible by the loop vectorizer"), cl::init(false))
static cl::opt< bool > EnableLoopDistribute("enable-loop-distribute", cl::Hidden, cl::desc("Enable the new, experimental LoopDistribution Pass"), cl::init(false))
static cl::opt< unsigned > DistributeSCEVCheckThreshold("loop-distribute-scev-check-threshold", cl::init(8), cl::Hidden, cl::desc("The maximum number of SCEV checks allowed for Loop " "Distribution"))
static const char *const LLVMLoopDistributeFollowupSequential
static const char *const LLVMLoopDistributeFollowupAll
static const char * DistributedMetaData
static cl::opt< unsigned > PragmaDistributeSCEVCheckThreshold("loop-distribute-scev-check-threshold-with-pragma", cl::init(128), cl::Hidden, cl::desc("The maximum number of SCEV checks allowed for Loop " "Distribution for loop marked with #pragma clang loop " "distribute(enable)"))
static const char *const LLVMLoopDistributeFollowupFallback
static bool runImpl(Function &F, LoopInfo *LI, DominatorTree *DT, ScalarEvolution *SE, OptimizationRemarkEmitter *ORE, LoopAccessInfoManager &LAIs)
static cl::opt< bool > LDistVerify("loop-distribute-verify", cl::Hidden, cl::desc("Turn on DominatorTree and LoopInfo verification " "after Loop Distribution"), cl::init(false))
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 unsigned getSize(unsigned Kind)
PassT::Result & getResult(IRUnitT &IR, ExtraArgTs... ExtraArgs)
Get the result of an analysis pass for a given IR unit.
iterator begin()
Instruction iterator methods.
LLVM_ABI const BasicBlock * getSinglePredecessor() const
Return the predecessor of this block if it has a single predecessor block.
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...
DenseMapIterator< KeyT, ValueT, KeyInfoT, BucketT > iterator
Analysis pass which computes a DominatorTree.
Concrete subclass of DominatorTreeBase that is used to compute a normal dominator tree.
LLVM_ABI void diagnose(const DiagnosticInfo &DI)
Report a message to the currently installed diagnostic handler.
This analysis provides dependence information for the memory accesses of a loop.
const RuntimePointerChecking * getRuntimePointerChecking() const
static LLVM_ABI bool blockNeedsPredication(const BasicBlock *BB, const Loop *TheLoop, const DominatorTree *DT)
Return true if the block BB needs to be predicated in order for the loop to be vectorized.
SmallVector< Instruction *, 4 > getInstructionsForAccess(Value *Ptr, bool isWrite) const
Return the list of instructions that use Ptr to read or write memory.
Analysis pass that exposes the LoopInfo for a function.
BlockT * getLoopPreheader() const
If there is a preheader for this loop, return it.
PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM)
Represents a single loop in the control flow graph.
void setLoopID(MDNode *LoopID) const
Set the llvm.loop loop id metadata for this loop.
const SmallVectorImpl< Instruction * > & getMemoryInstructions() const
The vector of memory access instructions.
static LLVM_ABI PoisonValue * get(Type *T)
Static factory methods - Return an 'poison' object of the specified type.
A set of analyses that are preserved following a run of a transformation pass.
static PreservedAnalyses all()
Construct a special preserved set that preserves all passes.
PreservedAnalyses & preserve()
Mark an analysis as preserved.
LLVM_ABI bool needsChecking(const RuntimeCheckingPtrGroup &M, const RuntimeCheckingPtrGroup &N) const
Decide if we need to add a check between two groups of pointers, according to needsChecking.
static LLVM_ABI bool arePointersInSamePartition(const SmallVectorImpl< int > &PtrToPartition, unsigned PtrIdx1, unsigned PtrIdx2)
Check if pointers are in the same partition.
SmallVector< PointerInfo, 2 > Pointers
Information about the pointers that may require checking.
virtual unsigned getComplexity() const
Returns the estimated complexity of this predicate.
virtual bool isAlwaysTrue() const =0
Returns true if the predicate is always true.
Analysis pass that exposes the ScalarEvolution for a function.
The main scalar evolution driver.
typename vector_type::const_iterator iterator
typename vector_type::const_iterator const_iterator
A SetVector that performs no allocations if smaller than a certain size.
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
LLVM_ABI bool replaceUsesOfWith(Value *From, Value *To)
Replace uses of one Value with another.
const ParentTy * getParent() const
This provides a very simple, boring adaptor for a begin and end iterator into a range type.
@ C
The default llvm calling convention, compatible with C.
@ BasicBlock
Various leaf nodes.
Predicate
Predicate - These are "(BI << 5) | BO" for various predicates.
initializer< Ty > init(const Ty &Val)
std::enable_if_t< detail::IsValidPointer< X, Y >::value, bool > hasa(Y &&MD)
Check whether Metadata has a Value.
std::enable_if_t< detail::IsValidPointer< X, Y >::value, X * > extract(Y &&MD)
Extract a Value from Metadata.
friend class Instruction
Iterator for Instructions in a `BasicBlock.
LLVM_ABI iterator begin() const
This is an optimization pass for GlobalISel generic memory operations.
auto drop_begin(T &&RangeOrContainer, size_t N=1)
Return a range covering RangeOrContainer with the first N elements excluded.
void dump(const SparseBitVector< ElementSize > &LHS, raw_ostream &out)
FunctionAddr VTableAddr Value
Printable print(const GCNRegPressure &RP, const GCNSubtarget *ST=nullptr, unsigned DynamicVGPRBlockSize=0)
std::pair< const RuntimeCheckingPtrGroup *, const RuntimeCheckingPtrGroup * > RuntimePointerCheck
A memcheck which made up of a pair of grouped pointers.
LLVM_ABI std::optional< bool > getOptionalBoolLoopAttribute(const Loop *TheLoop, StringRef Name)
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
LLVM_ABI std::optional< const MDOperand * > findStringMetadataForLoop(const Loop *TheLoop, StringRef Name)
Find string metadata for loop.
LLVM_ABI void salvageDebugInfo(const MachineRegisterInfo &MRI, MachineInstr &MI)
Assuming the instruction MI is going to be deleted, attempt to salvage debug users of MI by writing t...
iterator_range< T > make_range(T x, T y)
Convenience function for iterating over sub-ranges.
LLVM_ABI std::optional< MDNode * > makeFollowupLoopID(MDNode *OrigLoopID, ArrayRef< StringRef > FollowupAttrs, const char *InheritOptionsAttrsPrefix="", bool AlwaysNew=false)
Create a new loop identifier for a loop created from a loop transformation.
OutputIt copy_if(R &&Range, OutputIt Out, UnaryPredicate P)
Provide wrappers to std::copy_if which take ranges instead of having to pass begin/end explicitly.
LLVM_ABI void addStringMetadataToLoop(Loop *TheLoop, const char *MDString, unsigned V=0)
Set input string into loop metadata by keeping other values intact.
LLVM_ABI SmallVector< Instruction *, 8 > findDefsUsedOutsideOfLoop(Loop *L)
Returns the instructions that use values defined in the loop.
auto reverse(ContainerTy &&C)
LLVM_ABI Loop * cloneLoopWithPreheader(BasicBlock *Before, BasicBlock *LoopDomBB, Loop *OrigLoop, ValueToValueMapTy &VMap, const Twine &NameSuffix, LoopInfo *LI, DominatorTree *DT, SmallVectorImpl< BasicBlock * > &Blocks)
Clones a loop OrigLoop.
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
LLVM_ABI bool hasDisableAllTransformsHint(const Loop *L)
Look for the loop attribute that disables all transformation heuristic.
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...
FunctionAddr VTableAddr Next
DWARFExpression::Operation Op
raw_ostream & operator<<(raw_ostream &OS, const APFixedPoint &FX)
LLVM_ABI void remapInstructionsInBlocks(ArrayRef< BasicBlock * > Blocks, ValueToValueMapTy &VMap)
Remaps instructions in Blocks using the mapping in VMap.
ValueMap< const Value *, WeakTrackingVH > ValueToValueMapTy
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.
iterator_range< df_iterator< T > > depth_first(const T &G)
AnalysisManager< Function > FunctionAnalysisManager
Convenience typedef for the Function analysis manager.