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
44 lines
1.5 KiB
C++
44 lines
1.5 KiB
C++
//===- Canonicalizer.cpp - Canonicalize MLIR operations -------------------===//
|
|
//
|
|
// 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
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// This transformation pass converts operations into their canonical forms by
|
|
// folding constants, applying operation identity transformations etc.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "PassDetail.h"
|
|
#include "mlir/Pass/Pass.h"
|
|
#include "mlir/Transforms/GreedyPatternRewriteDriver.h"
|
|
#include "mlir/Transforms/Passes.h"
|
|
|
|
using namespace mlir;
|
|
|
|
namespace {
|
|
/// Canonicalize operations in nested regions.
|
|
struct Canonicalizer : public CanonicalizerBase<Canonicalizer> {
|
|
/// Initialize the canonicalizer by building the set of patterns used during
|
|
/// execution.
|
|
void initialize(MLIRContext *context) override {
|
|
OwningRewritePatternList owningPatterns;
|
|
for (auto *op : context->getRegisteredOperations())
|
|
op->getCanonicalizationPatterns(owningPatterns, context);
|
|
patterns = std::move(owningPatterns);
|
|
}
|
|
void runOnOperation() override {
|
|
applyPatternsAndFoldGreedily(getOperation()->getRegions(), patterns);
|
|
}
|
|
|
|
FrozenRewritePatternList patterns;
|
|
};
|
|
} // end anonymous namespace
|
|
|
|
/// Create a Canonicalizer pass.
|
|
std::unique_ptr<Pass> mlir::createCanonicalizerPass() {
|
|
return std::make_unique<Canonicalizer>();
|
|
}
|