LLVM 22.0.0git
LoopAnalysisManager.h
Go to the documentation of this file.
1//===- LoopAnalysisManager.h - Loop analysis management ---------*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8/// \file
9///
10/// This header provides classes for managing per-loop analyses. These are
11/// typically used as part of a loop pass pipeline over the loop nests of
12/// a function.
13///
14/// Loop analyses are allowed to make some simplifying assumptions:
15/// 1) Loops are, where possible, in simplified form.
16/// 2) Loops are *always* in LCSSA form.
17/// 3) A collection of analysis results are available:
18/// - LoopInfo
19/// - DominatorTree
20/// - ScalarEvolution
21/// - AAManager
22///
23/// The primary mechanism to provide these invariants is the loop pass manager,
24/// but they can also be manually provided in order to reason about a loop from
25/// outside of a dedicated pass manager.
26///
27//===----------------------------------------------------------------------===//
28
29#ifndef LLVM_ANALYSIS_LOOPANALYSISMANAGER_H
30#define LLVM_ANALYSIS_LOOPANALYSISMANAGER_H
31
32#include "llvm/IR/PassManager.h"
34
35namespace llvm {
36
37class AAResults;
38class AssumptionCache;
40class DominatorTree;
41class Function;
42class Loop;
43class LoopInfo;
44class MemorySSA;
45class ScalarEvolution;
48
49/// The adaptor from a function pass to a loop pass computes these analyses and
50/// makes them available to the loop passes "for free". Each loop pass is
51/// expected to update these analyses if necessary to ensure they're
52/// valid after it runs.
64
65/// Extern template declaration for the analysis set for this IR unit.
66extern template class LLVM_TEMPLATE_ABI AllAnalysesOn<Loop>;
67
68extern template class LLVM_TEMPLATE_ABI
70/// The loop analysis manager.
71///
72/// See the documentation for the AnalysisManager template for detail
73/// documentation. This typedef serves as a convenient way to refer to this
74/// construct in the adaptors and proxies used to integrate this into the larger
75/// pass manager infrastructure.
78
79/// A proxy from a \c LoopAnalysisManager to a \c Function.
81 LoopAnalysisManagerFunctionProxy;
82
83/// A specialized result for the \c LoopAnalysisManagerFunctionProxy which
84/// retains a \c LoopInfo reference.
85///
86/// This allows it to collect loop objects for which analysis results may be
87/// cached in the \c LoopAnalysisManager.
88template <> class LoopAnalysisManagerFunctionProxy::Result {
89public:
90 explicit Result(LoopAnalysisManager &InnerAM, LoopInfo &LI)
91 : InnerAM(&InnerAM), LI(&LI) {}
93 : InnerAM(std::move(Arg.InnerAM)), LI(Arg.LI), MSSAUsed(Arg.MSSAUsed) {
94 // We have to null out the analysis manager in the moved-from state
95 // because we are taking ownership of the responsibilty to clear the
96 // analysis state.
97 Arg.InnerAM = nullptr;
98 }
100 InnerAM = RHS.InnerAM;
101 LI = RHS.LI;
102 MSSAUsed = RHS.MSSAUsed;
103 // We have to null out the analysis manager in the moved-from state
104 // because we are taking ownership of the responsibilty to clear the
105 // analysis state.
106 RHS.InnerAM = nullptr;
107 return *this;
108 }
110 // InnerAM is cleared in a moved from state where there is nothing to do.
111 if (!InnerAM)
112 return;
113
114 // Clear out the analysis manager if we're being destroyed -- it means we
115 // didn't even see an invalidate call when we got invalidated.
116 InnerAM->clear();
117 }
118
119 /// Mark MemorySSA as used so we can invalidate self if MSSA is invalidated.
120 void markMSSAUsed() { MSSAUsed = true; }
121
122 /// Accessor for the analysis manager.
123 LoopAnalysisManager &getManager() { return *InnerAM; }
124
125 /// Handler for invalidation of the proxy for a particular function.
126 ///
127 /// If the proxy, \c LoopInfo, and associated analyses are preserved, this
128 /// will merely forward the invalidation event to any cached loop analysis
129 /// results for loops within this function.
130 ///
131 /// If the necessary loop infrastructure is not preserved, this will forcibly
132 /// clear all of the cached analysis results that are keyed on the \c
133 /// LoopInfo for this function.
135 FunctionAnalysisManager::Invalidator &Inv);
136
137private:
138 LoopAnalysisManager *InnerAM;
139 LoopInfo *LI;
140 bool MSSAUsed = false;
141};
142
143/// Provide a specialized run method for the \c LoopAnalysisManagerFunctionProxy
144/// so it can pass the \c LoopInfo to the result.
145template <>
146LLVM_ABI LoopAnalysisManagerFunctionProxy::Result
148
149// Ensure the \c LoopAnalysisManagerFunctionProxy is provided as an extern
150// template.
152
153extern template class LLVM_TEMPLATE_ABI OuterAnalysisManagerProxy<
155/// A proxy from a \c FunctionAnalysisManager to a \c Loop.
159
160/// Returns the minimum set of Analyses that all loop passes must preserve.
162}
163
164#endif // LLVM_ANALYSIS_LOOPANALYSISMANAGER_H
#define LLVM_ABI
Definition Compiler.h:213
#define LLVM_TEMPLATE_ABI
Definition Compiler.h:214
This header defines various interfaces for pass management in LLVM.
#define F(x, y, z)
Definition MD5.cpp:55
Value * RHS
This templated class represents "all analyses that operate over <aparticular IR unit>" (e....
Definition Analysis.h:50
A container for analyses that lazily runs them and caches their results.
A cache of @llvm.assume calls within a function.
BlockFrequencyInfo pass uses BlockFrequencyInfoImpl implementation to estimate IR basic block frequen...
Concrete subclass of DominatorTreeBase that is used to compute a normal dominator tree.
Definition Dominators.h:165
An analysis over an "outer" IR unit that provides access to an analysis manager over an "inner" IR un...
Result run(Function &IR, AnalysisManager< Function, ExtraArgTs... > &AM, ExtraArgTs...)
LLVM_ABI bool invalidate(Function &F, const PreservedAnalyses &PA, FunctionAnalysisManager::Invalidator &Inv)
Handler for invalidation of the proxy for a particular function.
LoopAnalysisManager & getManager()
Accessor for the analysis manager.
void markMSSAUsed()
Mark MemorySSA as used so we can invalidate self if MSSA is invalidated.
Result(LoopAnalysisManager &InnerAM, LoopInfo &LI)
Represents a single loop in the control flow graph.
Definition LoopInfo.h:40
Encapsulates MemorySSA, including all data associated with memory accesses.
Definition MemorySSA.h:702
An analysis over an "inner" IR unit that provides access to an analysis manager over a "outer" IR uni...
A set of analyses that are preserved following a run of a transformation pass.
Definition Analysis.h:112
The main scalar evolution driver.
Provides information about what library functions are available for the current target.
This pass provides access to the codegen interfaces that are needed for IR-level transformations.
This is an optimization pass for GlobalISel generic memory operations.
AnalysisManager< Loop, LoopStandardAnalysisResults & > LoopAnalysisManager
The loop analysis manager.
OuterAnalysisManagerProxy< FunctionAnalysisManager, Loop, LoopStandardAnalysisResults & > FunctionAnalysisManagerLoopProxy
A proxy from a FunctionAnalysisManager to a Loop.
OutputIt move(R &&Range, OutputIt Out)
Provide wrappers to std::move which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1847
LLVM_ABI PreservedAnalyses getLoopPassPreservedAnalyses()
Returns the minimum set of Analyses that all loop passes must preserve.
AnalysisManager< Function > FunctionAnalysisManager
Convenience typedef for the Function analysis manager.
Implement std::hash so that hash_code can be used in STL containers.
Definition BitVector.h:851
The adaptor from a function pass to a loop pass computes these analyses and makes them available to t...