This class represents a rewrite pattern list that has been frozen, and thus immutable. This replaces the uses of OwningRewritePatternList in pattern driver related API, such as dialect conversion. When PDL becomes more prevalent, this API will allow for optimizing a set of patterns once without the need to do this per run of a pass. Differential Revision: https://reviews.llvm.org/D89104
44 lines
1.6 KiB
C++
44 lines
1.6 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> {
|
|
void runOnOperation() override {
|
|
OwningRewritePatternList patterns;
|
|
|
|
// TODO: Instead of adding all known patterns from the whole system lazily
|
|
// add and cache the canonicalization patterns for ops we see in practice
|
|
// when building the worklist. For now, we just grab everything.
|
|
auto *context = &getContext();
|
|
for (auto *op : context->getRegisteredOperations())
|
|
op->getCanonicalizationPatterns(patterns, context);
|
|
|
|
Operation *op = getOperation();
|
|
applyPatternsAndFoldGreedily(op->getRegions(), std::move(patterns));
|
|
}
|
|
};
|
|
} // end anonymous namespace
|
|
|
|
/// Create a Canonicalizer pass.
|
|
std::unique_ptr<Pass> mlir::createCanonicalizerPass() {
|
|
return std::make_unique<Canonicalizer>();
|
|
}
|