From 2848f6966ea35a1e8bdf1668ee4ae8fb0170235c Mon Sep 17 00:00:00 2001 From: Tres Popp Date: Tue, 10 Aug 2021 13:53:59 +0200 Subject: [PATCH] [mlir] Set top-down traversal for LinalgElementwiseOpFusion The primary pattern for this pass clones many operations from producers to consumers. Doing this top down prevents duplicated work when a producer has multiple consumers, if it also is consuming another linalg.generic. As an example, a chain of ~2600 generics that are fused into ~70 generics was resulting in 16255 pattern invocations. This took 14 seconds on one machine but takes only 0.3 seconds with top-down traversal. Differential Revision: https://reviews.llvm.org/D107818 --- mlir/lib/Dialect/Linalg/Transforms/ElementwiseOpFusion.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/mlir/lib/Dialect/Linalg/Transforms/ElementwiseOpFusion.cpp b/mlir/lib/Dialect/Linalg/Transforms/ElementwiseOpFusion.cpp index fdca523..43a4105 100644 --- a/mlir/lib/Dialect/Linalg/Transforms/ElementwiseOpFusion.cpp +++ b/mlir/lib/Dialect/Linalg/Transforms/ElementwiseOpFusion.cpp @@ -1294,7 +1294,12 @@ struct LinalgElementwiseOpFusionPass patterns, LinalgElementwiseFusionOptions().setControlFoldingReshapes( allowFoldingUnitDimReshapes ? allowFoldingFn : skipUnitDimReshape)); - (void)applyPatternsAndFoldGreedily(op->getRegions(), std::move(patterns)); + + // Use TopDownTraversal for compile time reasons + GreedyRewriteConfig grc; + grc.useTopDownTraversal = true; + (void)applyPatternsAndFoldGreedily(op->getRegions(), std::move(patterns), + grc); } }; -- 2.7.4