[Mlir-commits] [mlir] 783eeb2 - [MLIR][Linalg][NFC] Simplify tiling canonical pattern (#182909)
llvmlistbot at llvm.org
llvmlistbot at llvm.org
Tue Feb 24 08:04:09 PST 2026
Author: Renato Golin
Date: 2026-02-24T16:04:04Z
New Revision: 783eeb2ccfcac136f2191bda705ecd4a1a553718
URL: https://github.com/llvm/llvm-project/commit/783eeb2ccfcac136f2191bda705ecd4a1a553718
DIFF: https://github.com/llvm/llvm-project/commit/783eeb2ccfcac136f2191bda705ecd4a1a553718.diff
LOG: [MLIR][Linalg][NFC] Simplify tiling canonical pattern (#182909)
Prepare for better composition of canonicalization patterns by splitting
the linalg own canonicalizers from others for particular purposes (ex.
tiling).
Once dialects have their own registration mechanisms, specific passes
can just add more ops/dialects using a yet-to-be-created helper that
would be similar to the existing
`populateLinalgTilingCanonicalizationPatterns`.
Added:
Modified:
mlir/include/mlir/Dialect/Linalg/Transforms/Transforms.h
mlir/lib/Dialect/Linalg/Transforms/Tiling.cpp
mlir/test/lib/Dialect/Linalg/TestLinalgFusionTransforms.cpp
Removed:
################################################################################
diff --git a/mlir/include/mlir/Dialect/Linalg/Transforms/Transforms.h b/mlir/include/mlir/Dialect/Linalg/Transforms/Transforms.h
index 32067358438d3..deb84d556ae0a 100644
--- a/mlir/include/mlir/Dialect/Linalg/Transforms/Transforms.h
+++ b/mlir/include/mlir/Dialect/Linalg/Transforms/Transforms.h
@@ -1928,7 +1928,6 @@ struct ExtractSliceOfPadTensorSwapPattern
/// Canonicalization patterns relevant to apply after tiling patterns. These
/// are applied automatically by the tiling pass but need to be applied
/// manually when tiling is called programmatically.
-RewritePatternSet getLinalgTilingCanonicalizationPatterns(MLIRContext *ctx);
void populateLinalgTilingCanonicalizationPatterns(RewritePatternSet &patterns);
/// Linalg generalization patterns
diff --git a/mlir/lib/Dialect/Linalg/Transforms/Tiling.cpp b/mlir/lib/Dialect/Linalg/Transforms/Tiling.cpp
index 8e14ef4a2ea12..39fdfa9cdbd47 100644
--- a/mlir/lib/Dialect/Linalg/Transforms/Tiling.cpp
+++ b/mlir/lib/Dialect/Linalg/Transforms/Tiling.cpp
@@ -827,6 +827,9 @@ mlir::linalg::tileLinalgOp(RewriterBase &b, LinalgOp op,
namespace {
/// Helper classes for type list expansion.
+/// TODO: Move this to a common header, so all dialects, passes and
+/// transforms can utilize this method to compose canonicalization
+/// patterns.
template <typename... OpTypes>
class CanonicalizationPatternList;
@@ -844,35 +847,13 @@ class CanonicalizationPatternList<OpTy, OpTypes...> {
CanonicalizationPatternList<OpTypes...>::insert(patterns);
}
};
-} // namespace
-
-RewritePatternSet
-mlir::linalg::getLinalgTilingCanonicalizationPatterns(MLIRContext *ctx) {
- RewritePatternSet patterns(ctx);
- populateLinalgTilingCanonicalizationPatterns(patterns);
- return patterns;
-}
-void mlir::linalg::populateLinalgTilingCanonicalizationPatterns(
- RewritePatternSet &patterns) {
+/// TODO: Move this into `getCanonicalizationPattern` and do the same for all
+/// dialects, so that we don't need this hack to also get the operations'
+/// canonicalization patterns per dialect.
+static void
+populateLinalgCanonicalizationPatterns(RewritePatternSet &patterns) {
auto *ctx = patterns.getContext();
- affine::AffineApplyOp::getCanonicalizationPatterns(patterns, ctx);
- affine::AffineForOp::getCanonicalizationPatterns(patterns, ctx);
- affine::AffineMinOp::getCanonicalizationPatterns(patterns, ctx);
- affine::AffineMaxOp::getCanonicalizationPatterns(patterns, ctx);
- arith::ConstantIndexOp::getCanonicalizationPatterns(patterns, ctx);
-
- memref::SubViewOp::getCanonicalizationPatterns(patterns, ctx);
- memref::ViewOp::getCanonicalizationPatterns(patterns, ctx);
-
- scf::ForOp::getCanonicalizationPatterns(patterns, ctx);
- scf::ParallelOp::getCanonicalizationPatterns(patterns, ctx);
-
- tensor::CastOp::getCanonicalizationPatterns(patterns, ctx);
- tensor::EmptyOp::getCanonicalizationPatterns(patterns, ctx);
- tensor::ExtractSliceOp::getCanonicalizationPatterns(patterns, ctx);
- tensor::InsertSliceOp::getCanonicalizationPatterns(patterns, ctx);
- tensor::PadOp::getCanonicalizationPatterns(patterns, ctx);
ctx->getLoadedDialect<LinalgDialect>()->getCanonicalizationPatterns(patterns);
CanonicalizationPatternList<
@@ -880,3 +861,19 @@ void mlir::linalg::populateLinalgTilingCanonicalizationPatterns(
#include "mlir/Dialect/Linalg/IR/LinalgStructuredOps.cpp.inc"
>::insert(patterns);
}
+} // namespace
+
+void mlir::linalg::populateLinalgTilingCanonicalizationPatterns(
+ RewritePatternSet &patterns) {
+ // Extra patterns from other dialects that we want to register for tiling
+ // Linalg operations.
+ CanonicalizationPatternList<
+ affine::AffineApplyOp, affine::AffineForOp, affine::AffineMinOp,
+ affine::AffineMaxOp, arith::ConstantIndexOp, memref::SubViewOp,
+ memref::ViewOp, scf::ForOp, scf::ParallelOp, tensor::CastOp,
+ tensor::EmptyOp, tensor::ExtractSliceOp, tensor::InsertSliceOp,
+ tensor::PadOp>::insert(patterns);
+
+ // Linalg's own patterns
+ populateLinalgCanonicalizationPatterns(patterns);
+}
diff --git a/mlir/test/lib/Dialect/Linalg/TestLinalgFusionTransforms.cpp b/mlir/test/lib/Dialect/Linalg/TestLinalgFusionTransforms.cpp
index aab7f30127d96..ddb278c9d0052 100644
--- a/mlir/test/lib/Dialect/Linalg/TestLinalgFusionTransforms.cpp
+++ b/mlir/test/lib/Dialect/Linalg/TestLinalgFusionTransforms.cpp
@@ -73,8 +73,8 @@ struct TestLinalgGreedyFusion
}
void runOnOperation() override {
MLIRContext *context = &getContext();
- RewritePatternSet patterns =
- linalg::getLinalgTilingCanonicalizationPatterns(context);
+ RewritePatternSet patterns(context);
+ linalg::populateLinalgTilingCanonicalizationPatterns(patterns);
patterns.add<ExtractSliceOfPadTensorSwapPattern>(context);
scf::populateSCFForLoopCanonicalizationPatterns(patterns);
FrozenRewritePatternSet frozenPatterns(std::move(patterns));
More information about the Mlir-commits
mailing list