[Mlir-commits] [mlir] [mlir][Vector] Fix scalable dim guard in broadcast lowering (PR #225021)
llvmlistbot at llvm.org
llvmlistbot at llvm.org
Mon Sep 21 00:18:29 PDT 2026
llvmorg-github-actions[bot] wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-mlir
Author: Cheng-Chieh Liu (jay87406)
<details>
<summary>Changes</summary>
The scalable outer dim guard in `BroadcastOpLowering` only covered the "stretch not at start" case (`m != 0`). The "stretch at start" case unrolls the same `dstType.getDimSize(0)` trip count and has the same bug: broadcasting e.g. `vector<1x4xf32>` to `vector<[3]x4xf32>` only fills the static minimum lanes via `vector.insert`, leaving the rest as `ub.poison`.
Widen the guard to cover both cases, and add a regression test.
---
Full diff: https://github.com/llvm/llvm-project/pull/225021.diff
2 Files Affected:
- (modified) mlir/lib/Dialect/Vector/Transforms/LowerVectorBroadcast.cpp (+4-5)
- (modified) mlir/test/Dialect/Vector/vector-broadcast-lowering-transforms.mlir (+11)
``````````diff
diff --git a/mlir/lib/Dialect/Vector/Transforms/LowerVectorBroadcast.cpp b/mlir/lib/Dialect/Vector/Transforms/LowerVectorBroadcast.cpp
index ceeb258805c6a..a16b1812a7313 100644
--- a/mlir/lib/Dialect/Vector/Transforms/LowerVectorBroadcast.cpp
+++ b/mlir/lib/Dialect/Vector/Transforms/LowerVectorBroadcast.cpp
@@ -121,11 +121,10 @@ class BroadcastOpLowering : public OpRewritePattern<vector::BroadcastOp> {
VectorType::get(dstType.getShape().drop_front(), eltType,
dstType.getScalableDims().drop_front());
- // For "stretch not at start" with a scalable outer dimension we would need
- // to emit an scf.for loop, which is not yet supported. Check before
- // creating any IR so that returning failure() does not violate the pattern
- // API contract.
- if (m != 0 && dstType.getScalableDims()[0]) {
+ // For a scalable outer dimension we would need to emit an scf.for loop,
+ // which is not yet supported. Check before creating any IR so that
+ // returning failure() does not violate the pattern API contract.
+ if (dstType.getScalableDims()[0]) {
// TODO: For scalable vectors we should emit an scf.for loop.
return failure();
}
diff --git a/mlir/test/Dialect/Vector/vector-broadcast-lowering-transforms.mlir b/mlir/test/Dialect/Vector/vector-broadcast-lowering-transforms.mlir
index c2922cdbe55aa..0b7e6e33e06e7 100644
--- a/mlir/test/Dialect/Vector/vector-broadcast-lowering-transforms.mlir
+++ b/mlir/test/Dialect/Vector/vector-broadcast-lowering-transforms.mlir
@@ -236,6 +236,17 @@ func.func @broadcast_vec2d_from_vec1d_scalable_inner(%arg0: vector<2xf32>) -> ve
return %0 : vector<3x[4]x2xf32>
}
+// TODO: Add support for scalable vectors
+
+// CHECK-LABEL: @broadcast_stretch_at_start_scalable
+// CHECK-SAME: %[[A:.*]]: vector<1x4xf32>)
+// CHECK: vector.broadcast %[[A]] : vector<1x4xf32> to vector<[3]x4xf32>
+
+func.func @broadcast_stretch_at_start_scalable(%arg0: vector<1x4xf32>) -> vector<[3]x4xf32> {
+ %0 = vector.broadcast %arg0 : vector<1x4xf32> to vector<[3]x4xf32>
+ return %0 : vector<[3]x4xf32>
+}
+
module attributes {transform.with_named_sequence} {
transform.named_sequence @__transform_main(%module_op: !transform.any_op {transform.readonly}) {
%f = transform.structured.match ops{["func.func"]} in %module_op
``````````
</details>
https://github.com/llvm/llvm-project/pull/225021
More information about the Mlir-commits
mailing list