[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