14#ifndef LLVM_ANALYSIS_LOOPNESTANALYSIS_H
15#define LLVM_ANALYSIS_LOOPNESTANALYSIS_H
52 static bool arePerfectlyNested(
const Loop &OuterLoop,
const Loop &InnerLoop,
58 const Loop &InnerLoop,
78 bool CheckUniquePred =
false);
87 if (
Loops.size() == 1)
94 auto SecondLastLoopIter = ++
Loops.rbegin();
95 return (LastLoop->
getLoopDepth() == (*SecondLastLoopIter)->getLoopDepth())
108 for (
unsigned I = 0;
I < getNumLoops(); ++
I)
109 if (getLoop(
I) == &L)
123 Depth <=
Loops.back()->getLoopDepth() &&
"Invalid depth");
125 for (
unsigned I = 0;
I < getNumLoops(); ++
I) {
126 Loop *L = getLoop(
I);
127 if (L->getLoopDepth() ==
Depth)
129 else if (L->getLoopDepth() >
Depth)
158 Loops.back()->getLoopDepth() -
Loops.front()->getLoopDepth() + 1;
159 assert(NestDepth > 0 &&
"Expecting NestDepth to be at least 1");
168 return all_of(
Loops, [](
const Loop *L) {
return L->isLoopSimplifyForm(); });
173 return all_of(
Loops, [](
const Loop *L) {
return L->isRotatedForm(); });
178 return Loops.front()->getHeader()->getParent();
191 InvalidLoopStructure,
192 OuterLoopLowerBoundUnknown
194 static LoopNestEnum analyzeLoopNestForPerfectNest(
const Loop &OuterLoop,
195 const Loop &InnerLoop,
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
BlockVerifier::State From
This header provides classes for managing per-loop analyses.
A container for analyses that lazily runs them and caches their results.
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
LLVM Basic Block Representation.
This class provides an interface for updating the loop pass manager based on mutations to the loop ne...
unsigned getLoopDepth() const
Return the nesting level of this loop.
This analysis provides information for a loop nest.
LLVM_ABI Result run(Loop &L, LoopAnalysisManager &AM, LoopStandardAnalysisResults &AR)
Printer pass for the LoopNest results.
LoopNestPrinterPass(raw_ostream &OS)
LLVM_ABI PreservedAnalyses run(Loop &L, LoopAnalysisManager &AM, LoopStandardAnalysisResults &AR, LPMUpdater &U)
This class represents a loop nest and can be used to query its properties.
StringRef getName() const
ArrayRef< Loop * > getLoops() const
Get the loops in the nest.
unsigned getNestDepth() const
Return the loop nest depth (i.e.
const unsigned MaxPerfectDepth
LoopVectorTy getLoopsAtDepth(unsigned Depth) const
Get the loops in the nest at the given Depth.
Loop * getLoop(unsigned Index) const
Return the loop at the given Index.
bool areAllLoopsRotatedForm() const
Return true if all loops in the loop nest are in rotated form.
unsigned getMaxPerfectDepth() const
Return the maximum perfect nesting depth.
Function * getParent() const
Return the function to which the loop-nest belongs.
unsigned getLoopIndex(const Loop &L) const
Get the loop index of the given loop L.
Loop & getOutermostLoop() const
Return the outermost loop in the loop nest.
bool areAllLoopsSimplifyForm() const
Return true if all loops in the loop nest are in simplify form.
size_t getNumLoops() const
Return the number of loops in the nest.
Loop * getInnermostLoop() const
Return the innermost loop in the loop nest if the nest has only one innermost loop,...
Represents a single loop in the control flow graph.
A set of analyses that are preserved following a run of a transformation pass.
The main scalar evolution driver.
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.
This class implements an extremely fast bulk output stream that can only output to a stream.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
This is an optimization pass for GlobalISel generic memory operations.
bool all_of(R &&range, UnaryPredicate P)
Provide wrappers to std::all_of which take ranges instead of having to pass begin/end explicitly.
raw_ostream & operator<<(raw_ostream &OS, const APFixedPoint &FX)
SmallVector< Loop *, 8 > LoopVectorTy
A CRTP mix-in that provides informational APIs needed for analysis passes.
A special type used by analysis passes to provide an address that identifies that particular analysis...
The adaptor from a function pass to a loop pass computes these analyses and makes them available to t...
A CRTP mix-in to automatically provide informational APIs needed for passes.