30 ? runWithLoopNestPasses(L, AM, AR, U)
31 : runWithoutLoopNestPasses(
L, AM, AR,
U);
48 MapClassName2PassName) {
49 assert(LoopPasses.size() + LoopNestPasses.size() == IsLoopNestPass.size());
51 unsigned IdxLP = 0, IdxLNP = 0;
52 for (
unsigned Idx = 0,
Size = IsLoopNestPass.size(); Idx !=
Size; ++Idx) {
53 if (IsLoopNestPass[Idx]) {
54 auto *
P = LoopNestPasses[IdxLNP++].get();
55 P->printPipeline(OS, MapClassName2PassName);
57 auto *
P = LoopPasses[IdxLP++].get();
58 P->printPipeline(OS, MapClassName2PassName);
71 "Loop-nest passes should only run on top-level loops.");
76 PassInstrumentation PI = AM.
getResult<PassInstrumentationAnalysis>(
L, AR);
78 unsigned LoopPassIndex = 0, LoopNestPassIndex = 0;
84 std::unique_ptr<LoopNest> LoopNestPtr;
85 bool IsLoopNestPtrValid =
false;
86 Loop *OuterMostLoop = &
L;
88 for (
size_t I = 0,
E = IsLoopNestPass.size();
I !=
E; ++
I) {
89 std::optional<PreservedAnalyses> PassPA;
90 if (!IsLoopNestPass[
I]) {
92 auto &
Pass = LoopPasses[LoopPassIndex++];
93 PassPA = runSinglePass(L,
Pass, AM, AR, U, PI);
96 auto &
Pass = LoopNestPasses[LoopNestPassIndex++];
104 if (!IsLoopNestPtrValid ||
U.isLoopNestChanged()) {
106 OuterMostLoop = ParentLoop;
108 IsLoopNestPtrValid =
true;
109 U.markLoopNestChanged(
false);
112 PassPA = runSinglePass(*LoopNestPtr,
Pass, AM, AR, U, PI);
122 if (
U.skipCurrentLoop()) {
129 AM.
invalidate(IsLoopNestPass[
I] ? *OuterMostLoop : L, *PassPA);
136 IsLoopNestPtrValid &= PassPA->getChecker<LoopNestAnalysis>().preserved();
141 U.setParentLoop((IsLoopNestPass[
I] ? *OuterMostLoop : L).getParentLoop());
157 PassInstrumentation PI = AM.
getResult<PassInstrumentationAnalysis>(
L, AR);
158 for (
auto &
Pass : LoopPasses) {
159 std::optional<PreservedAnalyses> PassPA =
160 runSinglePass(L,
Pass, AM, AR, U, PI);
169 if (
U.skipCurrentLoop()) {
185 U.setParentLoop(
L.getParentLoop());
193 OS << (UseMemorySSA ?
"loop-mssa(" :
"loop(");
194 Pass->printPipeline(OS, MapClassName2PassName);
209 PA = LoopCanonicalizationFPM.run(
F, AM);
227 UseBranchProbabilityInfo &&
F.hasProfileData()
246 auto &LAMFP = AM.
getResult<LoopAnalysisManagerFunctionProxy>(
F);
248 LAMFP.markMSSAUsed();
273 const Loop *L = LPtr ? *LPtr :
nullptr;
274 assert(L &&
"Loop should be valid for printing");
278 assert(L->isRecursivelyLCSSAForm(LAR.
DT, LI) &&
279 "Loops must remain in LCSSA form!");
285 assert(!(LoopNestMode && L->getParentLoop()) &&
286 "L should be a top-level loop in loop-nest mode.");
289 Updater.CurrentL = L;
290 Updater.SkipCurrentLoop =
false;
292#if LLVM_ENABLE_ABI_BREAKING_CHECKS
294 Updater.ParentL = L->getParentLoop();
312 "that does not preserve MemorySSA");
331 LAM.invalidate(*L, PassPA);
335 PA.intersect(std::move(PassPA));
336 }
while (!Worklist.
empty());
347 PA.preserve<LoopAnalysisManagerFunctionProxy>();
352 if (UseBlockFrequencyInfo &&
F.hasProfileData())
354 if (UseBranchProbabilityInfo &&
F.hasProfileData())
363 : OS(OS), Banner(Banner) {}
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
Legalize the Machine IR a function s Machine IR
This header provides classes for managing a pipeline of passes over loops in LLVM IR.
This file exposes an interface to building/using memory SSA to walk memory instructions using a use/d...
A manager for alias analyses.
This templated class represents "all analyses that operate over <aparticular IR unit>" (e....
void invalidate(IRUnitT &IR, const PreservedAnalyses &PA)
Invalidate cached analyses for an IR unit.
PassT::Result & getResult(IRUnitT &IR, ExtraArgTs... ExtraArgs)
Get the result of an analysis pass for a given IR unit.
A function analysis which provides an AssumptionCache.
Analysis pass which computes BlockFrequencyInfo.
BlockFrequencyInfo pass uses BlockFrequencyInfoImpl implementation to estimate IR basic block frequen...
Analysis pass which computes BranchProbabilityInfo.
Analysis providing branch probability information.
Analysis pass which computes a DominatorTree.
bool verify(VerificationLevel VL=VerificationLevel::Full) const
verify - checks if the tree is correct.
LLVM_ABI void printPipeline(raw_ostream &OS, function_ref< StringRef(StringRef)> MapClassName2PassName)
LLVM_ABI PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM)
Runs the loop passes across every loop in the function.
This class provides an interface for updating the loop pass manager based on mutations to the loop ne...
bool skipCurrentLoop() const
This can be queried by loop passes which run other loop passes (like pass managers) to know whether t...
Analysis pass that exposes the LoopInfo for a function.
LoopT * getParentLoop() const
Return the parent loop if it exists or nullptr for top level loops.
void verify(const DominatorTreeBase< BlockT, false > &DomTree) const
static std::unique_ptr< LoopNest > getLoopNest(Loop &Root, ScalarEvolution &SE)
Construct a LoopNest object.
Represents a single loop in the control flow graph.
An analysis that produces MemorySSA for a function.
Encapsulates MemorySSA, including all data associated with memory accesses.
LLVM_ABI void verifyMemorySSA(VerificationLevel=VerificationLevel::Fast) const
Verify that MemorySSA is self consistent (IE definitions dominate all uses, uses appear in the right ...
Pseudo-analysis pass that exposes the PassInstrumentation to pass managers.
This class provides instrumentation entry points for the Pass Manager, doing calls to callbacks regis...
void runAfterPassInvalidated(const PassT &Pass, const PreservedAnalyses &PA) const
AfterPassInvalidated instrumentation point - takes Pass instance that has just been executed.
void pushBeforeNonSkippedPassCallback(CallableT C)
void popBeforeNonSkippedPassCallback()
void runAfterPass(const PassT &Pass, const IRUnitT &IR, const PreservedAnalyses &PA) const
AfterPass instrumentation point - takes Pass instance that has just been executed and constant refere...
bool runBeforePass(const PassT &Pass, const IRUnitT &IR) const
BeforePass instrumentation point - takes Pass instance to be executed and constant reference to IR it...
Manages a sequence of passes over a particular unit of IR.
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 & preserveSet()
Mark an analysis set as preserved.
void intersect(const PreservedAnalyses &Arg)
Intersect this set with another in place.
PreservedAnalysisChecker getChecker() const
Build a checker for this PreservedAnalyses and the specified analysis type.
LLVM_ABI PreservedAnalyses run(Loop &L, LoopAnalysisManager &, LoopStandardAnalysisResults &, LPMUpdater &)
bool empty() const
Determine if the PriorityWorklist is empty or not.
bool insert(const T &X)
Insert a new element into the PriorityWorklist.
Analysis pass that exposes the ScalarEvolution for a function.
LLVM_ABI void verify() const
A version of PriorityWorklist that selects small size optimized data structures for the vector and ma...
StringRef - Represent a constant reference to a string, i.e.
Analysis pass providing the TargetTransformInfo.
Analysis pass providing the TargetLibraryInfo.
An efficient, type-erasing, non-owning reference to a callable.
This class implements an extremely fast bulk output stream that can only output to a stream.
This is an optimization pass for GlobalISel generic memory operations.
T any_cast(const Any &Value)
AnalysisManager< Loop, LoopStandardAnalysisResults & > LoopAnalysisManager
The loop analysis manager.
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
LLVM_TEMPLATE_ABI void appendLoopsToWorklist(RangeT &&, SmallPriorityWorklist< Loop *, 4 > &)
Utility that implements appending of loops onto a worklist given a range.
LLVM_ABI bool isSpecialPass(StringRef PassID, const std::vector< StringRef > &Specials)
LLVM_ABI bool VerifyLoopInfo
Enable verification of loop info.
LLVM_ABI bool VerifyMemorySSA
Enables verification of MemorySSA.
LLVM_ABI bool VerifyDomInfo
Enables verification of dominator trees.
AnalysisManager< Function > FunctionAnalysisManager
Convenience typedef for the Function analysis manager.
LLVM_ABI void printLoop(Loop &L, raw_ostream &OS, const std::string &Banner="")
Function to print a loop's contents as LLVM's text IR assembly.
LLVM_ABI void reportFatalUsageError(Error Err)
Report a fatal error that does not indicate a bug in LLVM.
The adaptor from a function pass to a loop pass computes these analyses and makes them available to t...