9 #ifndef MLIR_PASS_ANALYSISMANAGER_H 10 #define MLIR_PASS_ANALYSISMANAGER_H 15 #include "llvm/ADT/DenseMap.h" 16 #include "llvm/ADT/SmallPtrSet.h" 17 #include "llvm/Support/TypeName.h" 36 bool isAll()
const {
return preservedIDs.count(&allAnalysesID); }
39 bool isNone()
const {
return preservedIDs.empty(); }
42 template <
typename AnalysisT>
void preserve() {
43 preserve(AnalysisID::getID<AnalysisT>());
45 template <
typename AnalysisT,
typename AnalysisT2,
typename... OtherAnalysesT>
47 preserve<AnalysisT>();
48 preserve<AnalysisT2, OtherAnalysesT...>();
59 return preservedIDs.count(
id);
64 constexpr
static AnalysisID allAnalysesID = {};
70 namespace analysis_impl {
72 template <
typename T,
typename... Args>
74 std::declval<const PreservedAnalyses &>()));
77 template <
typename AnalysisT>
78 std::enable_if_t<is_detected<has_is_invalidated, AnalysisT>::value,
bool>
80 return analysis.isInvalidated(pa);
83 template <
typename AnalysisT>
84 std::enable_if_t<!is_detected<has_is_invalidated, AnalysisT>::value,
bool>
104 template <
typename... Args>
106 : analysis(std::forward<Args>(args)...) {}
125 template <
typename AnalysisT>
static StringRef getAnalysisName() {
126 StringRef name = llvm::getTypeName<AnalysisT>();
127 if (!name.consume_front(
"mlir::"))
128 name.consume_front(
"(anonymous namespace)::");
137 auto *
id = AnalysisID::getID<AnalysisT>();
139 typename ConceptMap::iterator it;
141 std::tie(it, wasInserted) = analyses.try_emplace(
id);
149 it->second = std::make_unique<AnalysisModel<AnalysisT>>(ir);
158 template <
typename AnalysisT>
160 auto res = analyses.find(AnalysisID::getID<AnalysisT>());
161 if (res == analyses.end())
176 for (
auto it = analyses.begin(), e = analyses.end(); it != e;) {
178 if (curIt->second->isInvalidated(pa))
179 analyses.erase(curIt);
226 template <
typename AnalysisT>
230 while (
auto *parentAM = curParent.dyn_cast<
const AnalysisManager *>()) {
231 if (parentAM->impl->getOperation() == parentOp)
232 return parentAM->getCachedAnalysis<AnalysisT>();
233 curParent = parentAM->parent;
240 return impl->analyses.getAnalysis<AnalysisT>(getPassInstrumentor());
244 template <
typename AnalysisT>
246 return impl->analyses.getCachedAnalysis<AnalysisT>();
251 return slice(op).template getAnalysis<AnalysisT>();
255 template <
typename AnalysisT>
259 auto it = impl->childAnalyses.find(op);
260 if (it == impl->childAnalyses.end())
262 return it->second->analyses.getCachedAnalysis<AnalysisT>();
273 impl->analyses.clear();
274 impl->childAnalyses.clear();
284 : parent(parent), impl(impl) {}
287 : parent(parent), impl(impl) {}
307 : analyses(module), passInstrumentor(passInstrumentor) {}
328 #endif // MLIR_PASS_ANALYSISMANAGER_H Definition: InferTypeOpInterface.cpp:20
AnalysisT & getAnalysis()
Definition: AnalysisManager.h:239
Definition: STLExtras.h:95
Definition: Operation.h:27
bool isAll() const
Returns true if all analyses were marked preserved.
Definition: AnalysisManager.h:36
bool isPreserved(const AnalysisID *id) const
Definition: AnalysisManager.h:58
Definition: AnalysisManager.h:217
void preserveAll()
Mark all analyses as preserved.
Definition: AnalysisManager.h:33
AnalysisMap(Operation *ir)
Definition: AnalysisManager.h:133
void runBeforeAnalysis(StringRef name, AnalysisID *id, Operation *op)
See PassInstrumentation::runBeforeAnalysis for details.
Definition: Pass.cpp:733
ModuleAnalysisManager(ModuleOp module, PassInstrumentor *passInstrumentor)
Definition: AnalysisManager.h:306
AnalysisT & getAnalysis(PassInstrumentor *pi)
Get an analysis for the current IR unit, computing it if necessary.
Definition: AnalysisManager.h:136
void invalidate(const PreservedAnalyses &pa)
Definition: AnalysisManager.h:174
Definition: AnalysisManager.h:304
AnalysisT analysis
The actual analysis object.
Definition: AnalysisManager.h:114
The abstract polymorphic base class representing an analysis.
Definition: AnalysisManager.h:91
decltype(std::declval< T & >().isInvalidated(std::declval< const PreservedAnalyses & >())) has_is_invalidated
Trait to check if T provides a static 'isInvalidated' method.
Definition: AnalysisManager.h:74
Operation * getOperation() const
Get the operation for this analysis map.
Definition: AnalysisManager.h:194
Definition: AnalysisManager.h:119
PassInstrumentor * getPassInstrumentor() const
Definition: AnalysisManager.h:313
detail::AnalysisMap analyses
The analyses for the owning module.
Definition: AnalysisManager.h:203
NestedAnalysisMap(Operation *op)
Definition: AnalysisManager.h:191
std::enable_if_t<!is_detected< has_is_invalidated, AnalysisT >::value, bool > isInvalidated(AnalysisT &analysis, const PreservedAnalyses &pa)
Default implementation of 'isInvalidated'.
Definition: AnalysisManager.h:85
void runAfterAnalysis(StringRef name, AnalysisID *id, Operation *op)
See PassInstrumentation::runAfterAnalysis for details.
Definition: Pass.cpp:741
Operation * getOperation() const
Returns the operation that this analysis map represents.
Definition: AnalysisManager.h:167
A utility class to represent the analyses that are known to be preserved.
Definition: AnalysisManager.h:30
mlir::edsc::intrinsics::ValueBuilder< SliceOp > slice
Definition: Intrinsics.h:24
bool isPreserved() const
Definition: AnalysisManager.h:55
bool isInvalidated(const PreservedAnalyses &pa) final
A hook used to query analyses for invalidation.
Definition: AnalysisManager.h:109
Optional< std::reference_wrapper< AnalysisT > > getCachedChildAnalysis(Operation *op) const
Query for a cached analysis of a child operation, or return null.
Definition: AnalysisManager.h:257
void invalidate(const PreservedAnalyses &pa)
Invalidate any non preserved analyses,.
Definition: AnalysisManager.h:269
std::enable_if_t< is_detected< has_is_invalidated, AnalysisT >::value, bool > isInvalidated(AnalysisT &analysis, const PreservedAnalyses &pa)
Implementation of 'isInvalidated' if the analysis provides a definition.
Definition: AnalysisManager.h:79
Definition: PassInstrumentation.h:89
void preserve()
Definition: AnalysisManager.h:46
DenseMap< Operation *, std::unique_ptr< NestedAnalysisMap > > childAnalyses
The cached analyses for nested operations.
Definition: AnalysisManager.h:200
Operation * getParentOp()
Definition: Operation.cpp:265
Definition: AnalysisManager.h:190
void clear()
Clear any held analyses.
Definition: AnalysisManager.h:272
Definition: StandardTypes.h:63
AnalysisT & getChildAnalysis(Operation *op)
Query for a analysis of a child operation, constructing it if necessary.
Definition: AnalysisManager.h:250
Optional< std::reference_wrapper< AnalysisT > > getCachedAnalysis() const
Definition: AnalysisManager.h:245
Optional< std::reference_wrapper< AnalysisT > > getCachedAnalysis() const
Get a cached analysis instance if one exists, otherwise return null.
Definition: AnalysisManager.h:159
Optional< std::reference_wrapper< AnalysisT > > getCachedParentAnalysis(Operation *parentOp) const
Definition: AnalysisManager.h:228
void preserve(const AnalysisID *id)
Definition: AnalysisManager.h:50
AnalysisModel(Args &&... args)
Definition: AnalysisManager.h:105
void clear()
Clear any held analyses.
Definition: AnalysisManager.h:170
A derived analysis model used to hold a specific analysis object.
Definition: AnalysisManager.h:103
bool isNone() const
Returns true if no analyses were marked preserved.
Definition: AnalysisManager.h:39
void preserve()
Preserve the given analyses.
Definition: AnalysisManager.h:42