This revision adds a new `initialize(MLIRContext *)` hook to passes that allows for them to initialize any heavy state before the first execution of the pass. A concrete use case of this is with patterns that rely on PDL, given that PDL is compiled at run time it is imperative that compilation results are cached as much as possible. The first use of this hook is in the Canonicalizer, which has the added benefit of reducing the number of expensive accesses to the context when collecting patterns. Differential Revision: https://reviews.llvm.org/D93147
88 lines
3.3 KiB
C++
88 lines
3.3 KiB
C++
//===- 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_
|