//===- GreedyPatternRewriteDriver.h - Greedy Pattern Driver -----*- C++ -*-===// // // 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 file declares methods for applying a set of patterns greedily, choosing // the patterns with the highest local benefit, until a fixed point is reached. // //===----------------------------------------------------------------------===// #ifndef MLIR_TRANSFORMS_GREEDYPATTERNREWRITEDRIVER_H_ #define MLIR_TRANSFORMS_GREEDYPATTERNREWRITEDRIVER_H_ #include "mlir/Rewrite/FrozenRewritePatternSet.h" namespace mlir { /// This enum controls which ops are put on the worklist during a greedy /// pattern rewrite. enum class GreedyRewriteStrictness { … }; enum class GreedySimplifyRegionLevel { … }; /// This class allows control over how the GreedyPatternRewriteDriver works. class GreedyRewriteConfig { … }; //===----------------------------------------------------------------------===// // applyPatternsGreedily //===----------------------------------------------------------------------===// /// Rewrite ops in the given region, which must be isolated from above, by /// repeatedly applying the highest benefit patterns in a greedy worklist /// driven manner until a fixpoint is reached. /// /// The greedy rewrite may prematurely stop after a maximum number of /// iterations, which can be configured in the configuration parameter. /// /// Also performs folding and simple dead-code elimination before attempting to /// match any of the provided patterns. /// /// A region scope can be set in the configuration parameter. By default, the /// scope is set to the specified region. Only in-scope ops are added to the /// worklist and only in-scope ops are allowed to be modified by the patterns. /// /// Returns "success" if the iterative process converged (i.e., fixpoint was /// reached) and no more patterns can be matched within the region. `changed` /// is set to "true" if the IR was modified at all. /// /// Note: This method does not apply patterns to the region's parent operation. LogicalResult applyPatternsAndFoldGreedily(Region ®ion, const FrozenRewritePatternSet &patterns, GreedyRewriteConfig config = GreedyRewriteConfig(), bool *changed = nullptr); /// Rewrite ops nested under the given operation, which must be isolated from /// above, by repeatedly applying the highest benefit patterns in a greedy /// worklist driven manner until a fixpoint is reached. /// /// The greedy rewrite may prematurely stop after a maximum number of /// iterations, which can be configured in the configuration parameter. /// /// Also performs folding and simple dead-code elimination before attempting to /// match any of the provided patterns. /// /// This overload runs a separate greedy rewrite for each region of the /// specified op. A region scope can be set in the configuration parameter. By /// default, the scope is set to the region of the current greedy rewrite. Only /// in-scope ops are added to the worklist and only in-scope ops and the /// specified op itself are allowed to be modified by the patterns. /// /// Note: The specified op may be modified, but it may not be removed by the /// patterns. /// /// Returns "success" if the iterative process converged (i.e., fixpoint was /// reached) and no more patterns can be matched within the region. `changed` /// is set to "true" if the IR was modified at all. /// /// Note: This method does not apply patterns to the given operation itself. inline LogicalResult applyPatternsAndFoldGreedily(Operation *op, const FrozenRewritePatternSet &patterns, GreedyRewriteConfig config = GreedyRewriteConfig(), bool *changed = nullptr) { … } /// Rewrite the specified ops by repeatedly applying the highest benefit /// patterns in a greedy worklist driven manner until a fixpoint is reached. /// /// The greedy rewrite may prematurely stop after a maximum number of /// iterations, which can be configured in the configuration parameter. /// /// Also performs folding and simple dead-code elimination before attempting to /// match any of the provided patterns. /// /// Newly created ops and other pre-existing ops that use results of rewritten /// ops or supply operands to such ops are also processed, unless such ops are /// excluded via `config.strictMode`. Any other ops remain unmodified (i.e., /// regardless of `strictMode`). /// /// In addition to strictness, a region scope can be specified. Only ops within /// the scope are simplified. This is similar to `applyPatternsAndFoldGreedily`, /// where only ops within the given region/op are simplified by default. If no /// scope is specified, it is assumed to be the first common enclosing region of /// the given ops. /// /// Note that ops in `ops` could be erased as result of folding, becoming dead, /// or via pattern rewrites. If more far reaching simplification is desired, /// `applyPatternsAndFoldGreedily` should be used. /// /// Returns "success" if the iterative process converged (i.e., fixpoint was /// reached) and no more patterns can be matched. `changed` is set to "true" if /// the IR was modified at all. `allOpsErased` is set to "true" if all ops in /// `ops` were erased. LogicalResult applyOpPatternsAndFold(ArrayRef<Operation *> ops, const FrozenRewritePatternSet &patterns, GreedyRewriteConfig config = GreedyRewriteConfig(), bool *changed = nullptr, bool *allErased = nullptr); } // namespace mlir #endif // MLIR_TRANSFORMS_GREEDYPATTERNREWRITEDRIVER_H_