36#ifndef LLVM_TRANSFORMS_SCALAR_LOOPPASSMANAGER_H
37#define LLVM_TRANSFORMS_SCALAR_LOOPPASSMANAGER_H
54class PassInstrumentation;
58template <
typename PassT>
59using HasRunOnLoopT =
decltype(std::declval<PassT>().run(
60 std::declval<Loop &>(), std::declval<LoopAnalysisManager &>(),
61 std::declval<LoopStandardAnalysisResults &>(),
62 std::declval<LPMUpdater &>()));
83 : IsLoopNestPass(
std::
move(Arg.IsLoopNestPass)),
84 LoopPasses(
std::
move(Arg.LoopPasses)),
85 LoopNestPasses(
std::
move(Arg.LoopNestPasses)) {}
88 IsLoopNestPass = std::move(
RHS.IsLoopNestPass);
89 LoopPasses = std::move(
RHS.LoopPasses);
90 LoopNestPasses = std::move(
RHS.LoopNestPasses);
105 template <
typename PassT>
107 std::enable_if_t<is_detected<HasRunOnLoopT, PassT>::value>
109 using LoopPassModelT =
112 IsLoopNestPass.push_back(
false);
115 LoopPasses.push_back(std::unique_ptr<LoopPassConceptT>(
116 new LoopPassModelT(std::forward<PassT>(
Pass))));
119 template <
typename PassT>
121 std::enable_if_t<!is_detected<HasRunOnLoopT, PassT>::value>
123 using LoopNestPassModelT =
126 IsLoopNestPass.push_back(
true);
129 LoopNestPasses.push_back(std::unique_ptr<LoopNestPassConceptT>(
130 new LoopNestPassModelT(std::forward<PassT>(
Pass))));
133 bool isEmpty()
const {
return LoopPasses.empty() && LoopNestPasses.empty(); }
157 template <
typename IRUnitT,
typename PassT>
158 std::optional<PreservedAnalyses>
171 static const Loop &getLoopFromIR(
Loop &L) {
return L; }
189template <
typename AnalysisT>
197 (void)AM.template getResult<AnalysisT>(L, AR);
202 auto ClassName = AnalysisT::name();
203 auto PassName = MapClassName2PassName(ClassName);
209template <
typename AnalysisT>
252 "Cannot delete a loop outside of the "
253 "subloop tree currently being processed.");
255 SkipCurrentLoop =
true;
259#if LLVM_ENABLE_ABI_BREAKING_CHECKS
272 "Child loops should not be pushed in loop-nest mode.");
275 Worklist.insert(CurrentL);
278 for (
Loop *NewL : NewChildLoops)
279 assert(NewL->getParentLoop() == CurrentL &&
"All of the new loops must "
280 "be immediate children of "
281 "the current loop!");
288 SkipCurrentLoop =
true;
298#if LLVM_ENABLE_ABI_BREAKING_CHECKS && !defined(NDEBUG)
299 for (
Loop *NewL : NewSibLoops)
300 assert(NewL->getParentLoop() == ParentL &&
301 "All of the new loops must be siblings of the current loop!");
305 Worklist.insert(NewSibLoops);
320 SkipCurrentLoop =
true;
323 Worklist.insert(CurrentL);
327 return LoopNestChanged;
333 LoopNestChanged = Changed;
346 bool SkipCurrentLoop;
347 const bool LoopNestMode;
348 bool LoopNestChanged;
350#if LLVM_ENABLE_ABI_BREAKING_CHECKS
358 bool LoopNestChanged =
false)
359 : Worklist(Worklist),
LAM(
LAM), LoopNestMode(LoopNestMode),
360 LoopNestChanged(LoopNestChanged) {}
363template <
typename IRUnitT,
typename PassT>
369 const Loop &L = getLoopFromIR(
IR);
372 if (!PI.runBeforePass<
Loop>(*
Pass, L))
378 if (U.skipCurrentLoop())
379 PI.runAfterPassInvalidated<IRUnitT>(*
Pass, PA);
381 PI.runAfterPass<
Loop>(*
Pass, L, PA);
409 bool UseMemorySSA =
false,
410 bool UseBlockFrequencyInfo =
false,
411 bool UseBranchProbabilityInfo =
false,
412 bool LoopNestMode =
false)
414 UseBlockFrequencyInfo(UseBlockFrequencyInfo),
415 UseBranchProbabilityInfo(UseBranchProbabilityInfo),
416 LoopNestMode(LoopNestMode) {
431 std::unique_ptr<PassConceptT>
Pass;
435 bool UseMemorySSA =
false;
436 bool UseBlockFrequencyInfo =
false;
437 bool UseBranchProbabilityInfo =
false;
438 const bool LoopNestMode;
445template <
typename LoopPassT>
446inline std::enable_if_t<is_detected<HasRunOnLoopT, LoopPassT>::value,
447 FunctionToLoopPassAdaptor>
449 bool UseBlockFrequencyInfo =
false,
450 bool UseBranchProbabilityInfo =
false) {
457 std::unique_ptr<FunctionToLoopPassAdaptor::PassConceptT>(
458 new PassModelT(std::forward<LoopPassT>(
Pass))),
459 UseMemorySSA, UseBlockFrequencyInfo, UseBranchProbabilityInfo,
false);
464template <
typename LoopNestPassT>
465inline std::enable_if_t<!is_detected<HasRunOnLoopT, LoopNestPassT>::value,
466 FunctionToLoopPassAdaptor>
468 bool UseBlockFrequencyInfo =
false,
469 bool UseBranchProbabilityInfo =
false) {
478 std::unique_ptr<FunctionToLoopPassAdaptor::PassConceptT>(
479 new PassModelT(std::move(LPM))),
480 UseMemorySSA, UseBlockFrequencyInfo, UseBranchProbabilityInfo,
true);
489 bool UseBranchProbabilityInfo) {
495 bool LoopNestMode = (LPM.getNumLoopPasses() == 0);
499 std::unique_ptr<FunctionToLoopPassAdaptor::PassConceptT>(
500 new PassModelT(std::move(LPM))),
501 UseMemorySSA, UseBlockFrequencyInfo, UseBranchProbabilityInfo,
aarch64 AArch64 CCMP Pass
#define LLVM_ATTRIBUTE_MINSIZE
This header defines various interfaces for pass management in LLVM.
Legalize the Machine IR a function s Machine IR
This header provides classes for managing per-loop analyses.
This file defines the interface for the loop nest analysis.
This file defines the Pass Instrumentation classes that provide instrumentation points into the pass ...
This file provides a priority worklist.
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
static const char PassName[]
A container for analyses that lazily runs them and caches their results.
void clear(IRUnitT &IR, llvm::StringRef Name)
Clear any cached analysis results for a single unit of IR.
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
void printPipeline(raw_ostream &OS, function_ref< StringRef(StringRef)> MapClassName2PassName)
bool isLoopNestMode() const
PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM)
Runs the loop passes across every loop in the function.
FunctionToLoopPassAdaptor(std::unique_ptr< PassConceptT > Pass, bool UseMemorySSA=false, bool UseBlockFrequencyInfo=false, bool UseBranchProbabilityInfo=false, bool LoopNestMode=false)
Converts loops into loop-closed SSA form.
This class provides an interface for updating the loop pass manager based on mutations to the loop ne...
void markLoopNestChanged(bool Changed)
Loopnest passes should use this method to indicate if the loopnest has been modified.
void setParentLoop(Loop *L)
bool isLoopNestChanged() const
void revisitCurrentLoop()
Restart the current loop.
bool skipCurrentLoop() const
This can be queried by loop passes which run other loop passes (like pass managers) to know whether t...
void addChildLoops(ArrayRef< Loop * > NewChildLoops)
Loop passes should use this method to indicate they have added new child loops of the current loop.
void markLoopAsDeleted(Loop &L, llvm::StringRef Name)
Loop passes should use this method to indicate they have deleted a loop from the nest.
void addSiblingLoops(ArrayRef< Loop * > NewSibLoops)
Loop passes should use this method to indicate they have added new sibling loops to the current loop.
bool contains(const LoopT *L) const
Return true if the specified loop is contained within in this loop.
This class represents a loop nest and can be used to query its properties.
Loop & getOutermostLoop() const
Return the outermost loop in the loop nest.
This pass is responsible for loop canonicalization.
Represents a single loop in the control flow graph.
This class provides instrumentation entry points for the Pass Manager, doing calls to callbacks regis...
size_t getNumLoopPasses() const
PassManager(PassManager &&Arg)
size_t getNumLoopNestPasses() const
LLVM_ATTRIBUTE_MINSIZE std::enable_if_t< is_detected< HasRunOnLoopT, PassT >::value > addPass(PassT &&Pass)
std::vector< std::unique_ptr< LoopNestPassConceptT > > LoopNestPasses
std::optional< PreservedAnalyses > runSinglePass(IRUnitT &IR, PassT &Pass, LoopAnalysisManager &AM, LoopStandardAnalysisResults &AR, LPMUpdater &U, PassInstrumentation &PI)
Run either a loop pass or a loop-nest pass.
LLVM_ATTRIBUTE_MINSIZE std::enable_if_t<!is_detected< HasRunOnLoopT, PassT >::value > addPass(PassT &&Pass)
std::vector< std::unique_ptr< LoopPassConceptT > > LoopPasses
PassManager & operator=(PassManager &&RHS)
Manages a sequence of passes over a particular unit of IR.
LLVM_ATTRIBUTE_MINSIZE std::enable_if_t<!std::is_same_v< PassT, PassManager > > addPass(PassT &&Pass)
Pass interface - Implemented by all 'passes'.
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.
Pass for printing a loop's contents as textual IR.
PreservedAnalyses run(Loop &L, LoopAnalysisManager &, LoopStandardAnalysisResults &, LPMUpdater &)
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.
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.
AnalysisManager< Loop, LoopStandardAnalysisResults & > LoopAnalysisManager
The loop analysis manager.
PassManager< Loop, LoopAnalysisManager, LoopStandardAnalysisResults &, LPMUpdater & > LoopPassManager
The Loop pass manager.
FunctionToLoopPassAdaptor createFunctionToLoopPassAdaptor< LoopPassManager >(LoopPassManager &&LPM, bool UseMemorySSA, bool UseBlockFrequencyInfo, bool UseBranchProbabilityInfo)
If Pass is an instance of LoopPassManager, the returned adaptor will be in loop-nest mode if the pass...
void appendLoopsToWorklist(RangeT &&, SmallPriorityWorklist< Loop *, 4 > &)
Utility that implements appending of loops onto a worklist given a range.
OutputIt move(R &&Range, OutputIt Out)
Provide wrappers to std::move which take ranges instead of having to pass begin/end explicitly.
std::enable_if_t< is_detected< HasRunOnLoopT, LoopPassT >::value, FunctionToLoopPassAdaptor > createFunctionToLoopPassAdaptor(LoopPassT &&Pass, bool UseMemorySSA=false, bool UseBlockFrequencyInfo=false, bool UseBranchProbabilityInfo=false)
A function to deduce a loop pass type and wrap it in the templated adaptor.
Implement std::hash so that hash_code can be used in STL containers.
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.
A partial specialization of the require analysis template pass to forward the extra parameters from a...
PreservedAnalyses run(Loop &L, LoopAnalysisManager &AM, LoopStandardAnalysisResults &AR, LPMUpdater &)
void printPipeline(raw_ostream &OS, function_ref< StringRef(StringRef)> MapClassName2PassName)
A utility pass template to force an analysis result to be available.
Template for the abstract base class used to dispatch polymorphically over pass objects.
A template wrapper used to implement the polymorphic API.