blob: 968d03863651fd1fb217288deb20b38c257c6ee4 [file] [edit]
//===-- O0CanonicalizerPass.cpp -- Canonicalization for O0 ----------------===//
//
// 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
//
//===----------------------------------------------------------------------===//
#include "flang/Optimizer/Transforms/Passes.h"
#include "mlir/Dialect/ControlFlow/IR/ControlFlow.h"
#include "mlir/IR/PatternMatch.h"
#include "mlir/Transforms/GreedyPatternRewriteDriver.h"
namespace fir {
#define GEN_PASS_DEF_O0CANONICALIZERPASS
#include "flang/Optimizer/Transforms/Passes.h.inc"
} // namespace fir
// FIR version of Canonicalizer::initialize that excludes cf dialect patterns
// under an option and also provides a way to filter patterns for given
// operations via a callback
void fir::populateCanonicalizationPatterns(
mlir::RewritePatternSet &patterns, bool includeCFPatterns,
llvm::function_ref<bool(mlir::RegisteredOperationName)> shouldCollect) {
mlir::MLIRContext *context = patterns.getContext();
auto includeDialect = [&](mlir::Dialect *dialect) {
return includeCFPatterns ||
!mlir::isa<mlir::cf::ControlFlowDialect>(dialect);
};
for (mlir::Dialect *dialect : context->getLoadedDialects())
if (includeDialect(dialect))
dialect->getCanonicalizationPatterns(patterns);
for (mlir::RegisteredOperationName op : context->getRegisteredOperations())
if (includeDialect(&op.getDialect()) &&
(!shouldCollect || shouldCollect(op)))
op.getCanonicalizationPatterns(patterns, context);
}
namespace {
class O0CanonicalizerPass
: public fir::impl::O0CanonicalizerPassBase<O0CanonicalizerPass> {
public:
mlir::LogicalResult initialize(mlir::MLIRContext *context) override {
mlir::RewritePatternSet owningPatterns(context);
fir::populateCanonicalizationPatterns(owningPatterns,
/*includeCFPatterns=*/false);
patterns = mlir::FrozenRewritePatternSet(std::move(owningPatterns));
return mlir::success();
}
void runOnOperation() override {
mlir::GreedyRewriteConfig config;
config.setRegionSimplificationLevel(
mlir::GreedySimplifyRegionLevel::Disabled);
// Like canonicalization, this cleanup is best-effort.
(void)mlir::applyPatternsGreedily(getOperation(), patterns, config);
}
private:
mlir::FrozenRewritePatternSet patterns;
};
} // namespace