[Mlir-commits] [mlir] [mlir][vector] Do not flatten or scalarize region-masked transfers (PR #231799)
llvmlistbot at llvm.org
llvmlistbot at llvm.org
Wed Oct 14 01:12:56 PDT 2026
llvmorg-github-actions[bot] wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-mlir-vector
Author: Vaisman
<details>
<summary>Changes</summary>
The transfer flattening patterns and RewriteScalarWrite already bail out on transfers with a mask operand, but do not detect an enclosing vector.mask.
Rewriting such a transfer creates multiple operations inside the mask region, causing verification to fail.
Also bail out on region-masked transfers, consistent with the existing mask-operand behavior.
Regression tests cover region-masked reads and writes in the flattening patterns and a region-masked scalar write.
---
Full diff: https://github.com/llvm/llvm-project/pull/231799.diff
3 Files Affected:
- (modified) mlir/lib/Dialect/Vector/Transforms/VectorTransferOpTransforms.cpp (+3-3)
- (modified) mlir/test/Dialect/Vector/scalar-vector-transfer-to-memref.mlir (+23)
- (modified) mlir/test/Dialect/Vector/vector-transfer-flatten.mlir (+43)
``````````diff
diff --git a/mlir/lib/Dialect/Vector/Transforms/VectorTransferOpTransforms.cpp b/mlir/lib/Dialect/Vector/Transforms/VectorTransferOpTransforms.cpp
index 74b1ec98afcca..b8c2f9ab45e42 100644
--- a/mlir/lib/Dialect/Vector/Transforms/VectorTransferOpTransforms.cpp
+++ b/mlir/lib/Dialect/Vector/Transforms/VectorTransferOpTransforms.cpp
@@ -848,7 +848,7 @@ class FlattenContiguousRowMajorTransferReadPattern
LDBG() << " -> Not minor identity permutation map, skipping";
return failure();
}
- if (transferReadOp.getMask()) {
+ if (transferReadOp.getMask() || transferReadOp.isMasked()) {
LDBG() << " -> Has mask, skipping";
return failure();
}
@@ -962,7 +962,7 @@ class FlattenContiguousRowMajorTransferWritePattern
return failure();
if (!transferWriteOp.getPermutationMap().isMinorIdentity())
return failure();
- if (transferWriteOp.getMask())
+ if (transferWriteOp.getMask() || transferWriteOp.isMasked())
return failure();
// Determine vector dimensions to collapse.
@@ -1124,7 +1124,7 @@ class RewriteScalarWrite : public OpRewritePattern<vector::TransferWriteOp> {
if (!llvm::all_of(vecType.getShape(), [](int64_t sz) { return sz == 1; }))
return failure();
// Mask not supported.
- if (xferOp.getMask())
+ if (xferOp.getMask() || xferOp.isMasked())
return failure();
// Map not supported.
if (!xferOp.getPermutationMap().isMinorIdentity())
diff --git a/mlir/test/Dialect/Vector/scalar-vector-transfer-to-memref.mlir b/mlir/test/Dialect/Vector/scalar-vector-transfer-to-memref.mlir
index 7fec1c6ba5642..7b451131664b9 100644
--- a/mlir/test/Dialect/Vector/scalar-vector-transfer-to-memref.mlir
+++ b/mlir/test/Dialect/Vector/scalar-vector-transfer-to-memref.mlir
@@ -178,3 +178,26 @@ func.func @transfer_read_2d_extract_dynamic(%m: memref<?x?xf32>, %row_idx: index
%elem = vector.extract %vec[%row_offset, %col_offset] : f32 from vector<10x5xf32>
return %elem : f32
}
+
+// -----
+
+// A region-masked transfer cannot be scalarized because the rewrite would
+// create multiple operations inside the vector.mask region.
+
+// CHECK-LABEL: func.func @region_masked_transfer_write
+// CHECK: vector.mask %{{.+}} { vector.transfer_write
+// CHECK: return
+
+// MULTIUSE-LABEL: func.func @region_masked_transfer_write
+// MULTIUSE: vector.mask %{{.+}} { vector.transfer_write
+// MULTIUSE: return
+func.func @region_masked_transfer_write(
+ %mem: memref<1x1xf32>, %value: vector<1x1xf32>,
+ %mask: vector<1x1xi1>) {
+ %c0 = arith.constant 0 : index
+ vector.mask %mask {
+ vector.transfer_write %value, %mem[%c0, %c0] {in_bounds = [true, true]} :
+ vector<1x1xf32>, memref<1x1xf32>
+ } : vector<1x1xi1>
+ return
+}
diff --git a/mlir/test/Dialect/Vector/vector-transfer-flatten.mlir b/mlir/test/Dialect/Vector/vector-transfer-flatten.mlir
index b048af24acfcd..554493f220fb9 100644
--- a/mlir/test/Dialect/Vector/vector-transfer-flatten.mlir
+++ b/mlir/test/Dialect/Vector/vector-transfer-flatten.mlir
@@ -826,3 +826,46 @@ func.func @transfer_write_multi_dim_unit_vector(
// CHECK-128B-LABEL: func @transfer_write_multi_dim_unit_vector
// CHECK-128B: vector.shape_cast {{.*}}: vector<1x1x1xi8> to vector<1xi8>
// CHECK-128B: vector.transfer_write {{.*}}: vector<1xi8>, memref<5x4x3x2xi8>
+
+// -----
+
+// Region-masked transfers cannot be flattened because the rewrite would
+// create multiple operations inside the vector.mask region.
+
+// CHECK-LABEL: func.func @region_masked_transfer_read
+// CHECK: %[[READ:.+]] = vector.mask %{{.+}} { vector.transfer_read
+// CHECK: return %[[READ]]
+
+// CHECK-128B-LABEL: func.func @region_masked_transfer_read
+// CHECK-128B: %[[READ:.+]] = vector.mask %{{.+}} { vector.transfer_read
+// CHECK-128B: return %[[READ]]
+func.func @region_masked_transfer_read(
+ %mem: memref<2x2xf32>, %mask: vector<2x2xi1>) -> vector<2x2xf32> {
+ %c0 = arith.constant 0 : index
+ %cst = arith.constant 0.0 : f32
+ %read = vector.mask %mask {
+ vector.transfer_read %mem[%c0, %c0], %cst {in_bounds = [true, true]} :
+ memref<2x2xf32>, vector<2x2xf32>
+ } : vector<2x2xi1> -> vector<2x2xf32>
+ return %read : vector<2x2xf32>
+}
+
+// -----
+
+// CHECK-LABEL: func.func @region_masked_transfer_write
+// CHECK: vector.mask %{{.+}} { vector.transfer_write
+// CHECK: return
+
+// CHECK-128B-LABEL: func.func @region_masked_transfer_write
+// CHECK-128B: vector.mask %{{.+}} { vector.transfer_write
+// CHECK-128B: return
+func.func @region_masked_transfer_write(
+ %mem: memref<2x2xf32>, %value: vector<2x2xf32>,
+ %mask: vector<2x2xi1>) {
+ %c0 = arith.constant 0 : index
+ vector.mask %mask {
+ vector.transfer_write %value, %mem[%c0, %c0] {in_bounds = [true, true]} :
+ vector<2x2xf32>, memref<2x2xf32>
+ } : vector<2x2xi1>
+ return
+}
``````````
</details>
https://github.com/llvm/llvm-project/pull/231799
More information about the Mlir-commits
mailing list