This revision adds support for generating utilities for passes such as options/statistics/etc. that can be inferred from the tablegen definition. This removes additional boilerplate from the pass, and also makes it easier to remove the reliance on the pass registry to provide certain things(e.g. the pass argument). Differential Revision: https://reviews.llvm.org/D76659
47 lines
1.6 KiB
C++
47 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 "mlir/IR/PatternMatch.h"
|
|
#include "mlir/Pass/Pass.h"
|
|
#include "mlir/Transforms/Passes.h"
|
|
|
|
using namespace mlir;
|
|
|
|
namespace {
|
|
/// Canonicalize operations in nested regions.
|
|
struct Canonicalizer : public OperationPass<Canonicalizer> {
|
|
/// Include the generated pass utilities.
|
|
#define GEN_PASS_Canonicalizer
|
|
#include "mlir/Transforms/Passes.h.inc"
|
|
|
|
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();
|
|
applyPatternsGreedily(op->getRegions(), patterns);
|
|
}
|
|
};
|
|
} // end anonymous namespace
|
|
|
|
/// Create a Canonicalizer pass.
|
|
std::unique_ptr<Pass> mlir::createCanonicalizerPass() {
|
|
return std::make_unique<Canonicalizer>();
|
|
}
|