//===- AnalysisManager.h - Analysis Management Infrastructure ---*- C++ -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// #ifndef MLIR_PASS_ANALYSISMANAGER_H #define MLIR_PASS_ANALYSISMANAGER_H #include "mlir/IR/Operation.h" #include "mlir/Pass/PassInstrumentation.h" #include "mlir/Support/LLVM.h" #include "llvm/ADT/DenseMap.h" #include "llvm/ADT/MapVector.h" #include "llvm/ADT/SmallPtrSet.h" #include "llvm/Support/TypeName.h" #include <optional> namespace mlir { class AnalysisManager; //===----------------------------------------------------------------------===// // Analysis Preservation and Concept Modeling //===----------------------------------------------------------------------===// namespace detail { /// A utility class to represent the analyses that are known to be preserved. class PreservedAnalyses { … }; namespace analysis_impl { /// Trait to check if T provides a static 'isInvalidated' method. has_is_invalidated; /// Implementation of 'isInvalidated' if the analysis provides a definition. template <typename AnalysisT> std::enable_if_t<llvm::is_detected<has_is_invalidated, AnalysisT>::value, bool> isInvalidated(AnalysisT &analysis, const PreservedAnalyses &pa) { … } /// Default implementation of 'isInvalidated'. template <typename AnalysisT> std::enable_if_t<!llvm::is_detected<has_is_invalidated, AnalysisT>::value, bool> isInvalidated(AnalysisT &analysis, const PreservedAnalyses &pa) { … } } // namespace analysis_impl /// The abstract polymorphic base class representing an analysis. struct AnalysisConcept { … }; /// A derived analysis model used to hold a specific analysis object. template <typename AnalysisT> struct AnalysisModel : public AnalysisConcept { … }; /// This class represents a cache of analyses for a single operation. All /// computation, caching, and invalidation of analyses takes place here. class AnalysisMap { … }; /// An analysis map that contains a map for the current operation, and a set of /// maps for any child operations. struct NestedAnalysisMap { … }; } // namespace detail //===----------------------------------------------------------------------===// // Analysis Management //===----------------------------------------------------------------------===// class ModuleAnalysisManager; /// This class represents an analysis manager for a particular operation /// instance. It is used to manage and cache analyses on the operation as well /// as those for child operations, via nested AnalysisManager instances /// accessible via 'slice'. This class is intended to be passed around by value, /// and cannot be constructed directly. class AnalysisManager { … }; /// An analysis manager class specifically for the top-level operation. This /// class contains the memory allocations for all nested analysis managers, and /// provides an anchor point. This is necessary because AnalysisManager is /// designed to be a thin wrapper around an existing analysis map instance. class ModuleAnalysisManager { … }; } // namespace mlir #endif // MLIR_PASS_ANALYSISMANAGER_H