[Mlir-commits] [mlir] [mlir][linalg] Guard pack tensor semantics (PR #206011)
llvmlistbot at llvm.org
llvmlistbot at llvm.org
Fri Jun 26 02:57:50 PDT 2026
https://github.com/mygitljf updated https://github.com/llvm/llvm-project/pull/206011
>From 47f4f594bff25219d217576f0a3b1cc14b91db37 Mon Sep 17 00:00:00 2001
From: mygitljf <2410316423 at qq.com>
Date: Fri, 26 Jun 2026 17:15:51 +0000
Subject: [PATCH 1/2] [mlir][linalg] Guard pack tensor semantics
---
.../Dialect/Linalg/Transforms/Transforms.cpp | 4 ++++
.../Linalg/transform-op-pack-bufferized.mlir | 17 +++++++++++++++++
2 files changed, 21 insertions(+)
create mode 100644 mlir/test/Dialect/Linalg/transform-op-pack-bufferized.mlir
diff --git a/mlir/lib/Dialect/Linalg/Transforms/Transforms.cpp b/mlir/lib/Dialect/Linalg/Transforms/Transforms.cpp
index f2d491ac442e6..0b6d067d13a16 100644
--- a/mlir/lib/Dialect/Linalg/Transforms/Transforms.cpp
+++ b/mlir/lib/Dialect/Linalg/Transforms/Transforms.cpp
@@ -484,6 +484,10 @@ FailureOr<PackResult> linalg::pack(RewriterBase &rewriter,
return rewriter.notifyMatchFailure(linalgOp,
"incorrect number of pack sizes");
}
+ if (!linalgOp.hasPureTensorSemantics()) {
+ return rewriter.notifyMatchFailure(
+ linalgOp, "expects LinalgOp with pure tensor semantics");
+ }
Location loc = linalgOp->getLoc();
SmallVector<AffineMap> indexingMaps = linalgOp.getIndexingMapsArray();
diff --git a/mlir/test/Dialect/Linalg/transform-op-pack-bufferized.mlir b/mlir/test/Dialect/Linalg/transform-op-pack-bufferized.mlir
new file mode 100644
index 0000000000000..071ae8f35f97f
--- /dev/null
+++ b/mlir/test/Dialect/Linalg/transform-op-pack-bufferized.mlir
@@ -0,0 +1,17 @@
+// RUN: mlir-opt -sparsification-and-bufferization -transform-interpreter -split-input-file -verify-diagnostics -allow-unregistered-dialect %s
+
+module attributes {gpu.data_layout = "chunked", impl.libfunc.name = "test.matmul"} {
+ func.func @matmul(%arg0: tensor<?x?xf32>, %arg1: tensor<?x?xf32>, %arg2: tensor<?x?xf32>) -> tensor<?x?xf32> {
+ %0 = linalg.matmul ins(%arg0, %arg1 : tensor<?x?xf32>, tensor<?x?xf32>) outs(%arg2 : tensor<?x?xf32>) -> tensor<?x?xf32>
+ return %0 : tensor<?x?xf32>
+ }
+
+ module attributes {transform.with_named_sequence} {
+ transform.named_sequence @__transform_main(%arg0: !transform.any_op {transform.readonly}) {
+ %0 = transform.structured.match ops{["linalg.matmul"]} in %arg0 : (!transform.any_op) -> !transform.any_op
+ // expected-error @below {{data tiling failed}}
+ %1 = transform.structured.pack %0 packed_sizes = [2, 3, 4] : (!transform.any_op) -> !transform.op<"linalg.generic">
+ transform.yield
+ }
+ }
+}
>From 7d67ccfe11e3b824295bdfa76b303d06c4d2ba77 Mon Sep 17 00:00:00 2001
From: mygitljf <2410316423 at qq.com>
Date: Fri, 26 Jun 2026 18:00:12 +0000
Subject: [PATCH 2/2] [mlir][linalg] Move pack regression
---
.../Linalg/transform-op-pack-bufferized.mlir | 17 -----------------
.../Dialect/Linalg/transform-op-pack.mlir | 19 +++++++++++++++++++
2 files changed, 19 insertions(+), 17 deletions(-)
delete mode 100644 mlir/test/Dialect/Linalg/transform-op-pack-bufferized.mlir
diff --git a/mlir/test/Dialect/Linalg/transform-op-pack-bufferized.mlir b/mlir/test/Dialect/Linalg/transform-op-pack-bufferized.mlir
deleted file mode 100644
index 071ae8f35f97f..0000000000000
--- a/mlir/test/Dialect/Linalg/transform-op-pack-bufferized.mlir
+++ /dev/null
@@ -1,17 +0,0 @@
-// RUN: mlir-opt -sparsification-and-bufferization -transform-interpreter -split-input-file -verify-diagnostics -allow-unregistered-dialect %s
-
-module attributes {gpu.data_layout = "chunked", impl.libfunc.name = "test.matmul"} {
- func.func @matmul(%arg0: tensor<?x?xf32>, %arg1: tensor<?x?xf32>, %arg2: tensor<?x?xf32>) -> tensor<?x?xf32> {
- %0 = linalg.matmul ins(%arg0, %arg1 : tensor<?x?xf32>, tensor<?x?xf32>) outs(%arg2 : tensor<?x?xf32>) -> tensor<?x?xf32>
- return %0 : tensor<?x?xf32>
- }
-
- module attributes {transform.with_named_sequence} {
- transform.named_sequence @__transform_main(%arg0: !transform.any_op {transform.readonly}) {
- %0 = transform.structured.match ops{["linalg.matmul"]} in %arg0 : (!transform.any_op) -> !transform.any_op
- // expected-error @below {{data tiling failed}}
- %1 = transform.structured.pack %0 packed_sizes = [2, 3, 4] : (!transform.any_op) -> !transform.op<"linalg.generic">
- transform.yield
- }
- }
-}
diff --git a/mlir/test/Dialect/Linalg/transform-op-pack.mlir b/mlir/test/Dialect/Linalg/transform-op-pack.mlir
index 620a21896b0c1..9b981720ba758 100644
--- a/mlir/test/Dialect/Linalg/transform-op-pack.mlir
+++ b/mlir/test/Dialect/Linalg/transform-op-pack.mlir
@@ -444,6 +444,25 @@ module attributes {transform.with_named_sequence} {
// -----
+func.func @memref_matmul(%A: memref<?x?xf32>, %B: memref<?x?xf32>,
+ %C: memref<?x?xf32>) {
+ linalg.matmul ins(%A, %B : memref<?x?xf32>, memref<?x?xf32>)
+ outs(%C : memref<?x?xf32>)
+ return
+}
+
+module attributes {transform.with_named_sequence} {
+ transform.named_sequence @__transform_main(%arg1: !transform.any_op {transform.readonly}) {
+ %0 = transform.structured.match ops{["linalg.matmul"]} in %arg1 : (!transform.any_op) -> !transform.any_op
+ // expected-error @below {{data tiling failed}}
+ %1 = transform.structured.pack %0 packed_sizes = [2, 3, 4]
+ : (!transform.any_op) -> (!transform.op<"linalg.generic">)
+ transform.yield
+ }
+}
+
+// -----
+
func.func @no_single_packing_op(%source: tensor<128x256xf32>, %dest: tensor<4x16x32x16xf32>) {
%0 = linalg.pack %source inner_dims_pos = [0, 1] inner_tiles = [32, 16] into %dest : tensor<128x256xf32> -> tensor<4x16x32x16xf32>
%1 = linalg.unpack %0 inner_dims_pos = [0, 1] inner_tiles = [32, 16] into %source : tensor<4x16x32x16xf32> -> tensor<128x256xf32>
More information about the Mlir-commits
mailing list