| //===- PassDetail.h - MLIR Pass details -------------------------*- 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_PASSDETAIL_H_ |
| #define MLIR_PASS_PASSDETAIL_H_ |
| |
| #include "mlir/Pass/Pass.h" |
| #include "mlir/Pass/PassManager.h" |
| |
| namespace mlir { |
| namespace detail { |
| |
| //===----------------------------------------------------------------------===// |
| // OpToOpPassAdaptor |
| //===----------------------------------------------------------------------===// |
| |
| /// An adaptor pass used to run operation passes over nested operations. |
| class OpToOpPassAdaptor |
| : public PassWrapper<OpToOpPassAdaptor, OperationPass<>> { |
| public: |
| OpToOpPassAdaptor(OpPassManager &&mgr); |
| OpToOpPassAdaptor(const OpToOpPassAdaptor &rhs) = default; |
| |
| /// Run the held pipeline over all operations. |
| void runOnOperation(bool verifyPasses); |
| void runOnOperation() override; |
| |
| /// Merge the current pass adaptor into given 'rhs'. |
| void mergeInto(OpToOpPassAdaptor &rhs); |
| |
| /// Returns the pass managers held by this adaptor. |
| MutableArrayRef<OpPassManager> getPassManagers() { return mgrs; } |
| |
| /// Populate the set of dependent dialects for the passes in the current |
| /// adaptor. |
| void getDependentDialects(DialectRegistry &dialects) const override; |
| |
| /// Return the async pass managers held by this parallel adaptor. |
| MutableArrayRef<SmallVector<OpPassManager, 1>> getParallelPassManagers() { |
| return asyncExecutors; |
| } |
| |
| /// Returns the adaptor pass name. |
| std::string getAdaptorName(); |
| |
| private: |
| /// Run this pass adaptor synchronously. |
| void runOnOperationImpl(bool verifyPasses); |
| |
| /// Run this pass adaptor asynchronously. |
| void runOnOperationAsyncImpl(bool verifyPasses); |
| |
| /// Run the given operation and analysis manager on a single pass. |
| /// `parentInitGeneration` is the initialization generation of the parent pass |
| /// manager, and is used to initialize any dynamic pass pipelines run by the |
| /// given pass. |
| static LogicalResult run(Pass *pass, Operation *op, AnalysisManager am, |
| bool verifyPasses, unsigned parentInitGeneration); |
| |
| /// Run the given operation and analysis manager on a provided op pass |
| /// manager. `parentInitGeneration` is the initialization generation of the |
| /// parent pass manager, and is used to initialize any dynamic pass pipelines |
| /// run by the given passes. |
| static LogicalResult runPipeline( |
| iterator_range<OpPassManager::pass_iterator> passes, Operation *op, |
| AnalysisManager am, bool verifyPasses, unsigned parentInitGeneration, |
| PassInstrumentor *instrumentor = nullptr, |
| const PassInstrumentation::PipelineParentInfo *parentInfo = nullptr); |
| |
| /// A set of adaptors to run. |
| SmallVector<OpPassManager, 1> mgrs; |
| |
| /// A set of executors, cloned from the main executor, that run asynchronously |
| /// on different threads. This is used when threading is enabled. |
| SmallVector<SmallVector<OpPassManager, 1>, 8> asyncExecutors; |
| |
| // For accessing "runPipeline". |
| friend class mlir::PassManager; |
| }; |
| |
| } // end namespace detail |
| } // end namespace mlir |
| #endif // MLIR_PASS_PASSDETAIL_H_ |