namespace mlir {
class BlockAndValueMapping;
+class GreedyRewriteConfig;
class Operation;
class Pass;
class Region;
std::unique_ptr<mlir::Pass> createAnnotateConstantOperandsPass();
std::unique_ptr<mlir::Pass> createSimplifyRegionLitePass();
std::unique_ptr<mlir::Pass> createAlgebraicSimplificationPass();
+std::unique_ptr<mlir::Pass>
+createAlgebraicSimplificationPass(const mlir::GreedyRewriteConfig &config);
// declarative passes
#define GEN_PASS_REGISTRATION
pm.addPass(fir::createSimplifyRegionLitePass());
// Algebraic simplifications may increase code size.
if (optLevel.isOptimizingForSpeed())
- pm.addPass(fir::createAlgebraicSimplificationPass());
+ pm.addPass(fir::createAlgebraicSimplificationPass(config));
pm.addPass(mlir::createCSEPass());
fir::addMemoryAllocationOpt(pm);
namespace {
struct AlgebraicSimplification
: public fir::AlgebraicSimplificationBase<AlgebraicSimplification> {
+ AlgebraicSimplification(const GreedyRewriteConfig &rewriteConfig) {
+ config = rewriteConfig;
+ }
void runOnOperation() override;
+
+ mlir::GreedyRewriteConfig config;
};
} // namespace
void AlgebraicSimplification::runOnOperation() {
RewritePatternSet patterns(&getContext());
populateMathAlgebraicSimplificationPatterns(patterns);
- (void)applyPatternsAndFoldGreedily(getOperation(), std::move(patterns));
+ (void)applyPatternsAndFoldGreedily(getOperation(), std::move(patterns),
+ config);
}
std::unique_ptr<mlir::Pass> fir::createAlgebraicSimplificationPass() {
- return std::make_unique<AlgebraicSimplification>();
+ return std::make_unique<AlgebraicSimplification>(GreedyRewriteConfig());
+}
+
+std::unique_ptr<mlir::Pass> fir::createAlgebraicSimplificationPass(
+ const mlir::GreedyRewriteConfig &config) {
+ return std::make_unique<AlgebraicSimplification>(config);
}