//===- PassDetail.h - MLIR Pass details -------------------------*- C++ -*-===// // // Part of the MLIR 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 { //===----------------------------------------------------------------------===// // Verifier Pass //===----------------------------------------------------------------------===// /// Pass to verify an operation and signal failure if necessary. class VerifierPass : public OperationPass { void runOnOperation() override; }; //===----------------------------------------------------------------------===// // OpToOpPassAdaptor //===----------------------------------------------------------------------===// /// A base class for Op-to-Op adaptor passes. class OpToOpPassAdaptorBase { public: OpToOpPassAdaptorBase(OpPassManager &&mgr); OpToOpPassAdaptorBase(const OpToOpPassAdaptorBase &rhs) = default; /// Merge the current pass adaptor into given 'rhs'. void mergeInto(OpToOpPassAdaptorBase &rhs); /// Returns the pass managers held by this adaptor. MutableArrayRef getPassManagers() { return mgrs; } /// Returns the adaptor pass name. std::string getName(); protected: // A set of adaptors to run. SmallVector mgrs; }; /// An adaptor pass used to run operation passes over nested operations /// synchronously on a single thread. class OpToOpPassAdaptor : public OperationPass, public OpToOpPassAdaptorBase { public: OpToOpPassAdaptor(OpPassManager &&mgr); /// Run the held pipeline over all operations. void runOnOperation() override; }; /// An adaptor pass used to run operation passes over nested operations /// asynchronously across multiple threads. class OpToOpPassAdaptorParallel : public OperationPass, public OpToOpPassAdaptorBase { public: OpToOpPassAdaptorParallel(OpPassManager &&mgr); /// Run the held pipeline over all operations. void runOnOperation() override; /// Return the async pass managers held by this parallel adaptor. MutableArrayRef> getParallelPassManagers() { return asyncExecutors; } private: // A set of executors, cloned from the main executor, that run asynchronously // on different threads. SmallVector, 8> asyncExecutors; }; /// Utility function to convert the given class to the base adaptor it is an /// adaptor pass, returns nullptr otherwise. OpToOpPassAdaptorBase *getAdaptorPassBase(Pass *pass); /// Utility function to return if a pass refers to an adaptor pass. Adaptor /// passes are those that internally execute a pipeline. inline bool isAdaptorPass(Pass *pass) { return isa(pass) || isa(pass); } } // end namespace detail } // end namespace mlir #endif // MLIR_PASS_PASSDETAIL_H_