[Mlir-commits] [mlir] [mlir][vector] add ApplyReorderMultiReductionDimsPatternsOp tests (PR #180977)
Erick Ochoa Lopez
llvmlistbot at llvm.org
Tue Feb 17 12:38:09 PST 2026
https://github.com/amd-eochoalo updated https://github.com/llvm/llvm-project/pull/180977
>From 67ec909e00f17a2e641ff3588c66edeb3abc038a Mon Sep 17 00:00:00 2001
From: Erick Ochoa <erick.ochoalopez at amd.com>
Date: Wed, 11 Feb 2026 10:30:50 -0500
Subject: [PATCH 01/16] [mlir][vector] Add
apply_patterns.vector.lower_multi_reduction_transformation
Creates transform op for testing finer grained patterns.
---
.../Vector/TransformOps/VectorTransformOps.td | 23 +++++++++++++++++++
.../TransformOps/VectorTransformOps.cpp | 8 +++++++
2 files changed, 31 insertions(+)
diff --git a/mlir/include/mlir/Dialect/Vector/TransformOps/VectorTransformOps.td b/mlir/include/mlir/Dialect/Vector/TransformOps/VectorTransformOps.td
index c9668fe30e6482..dfe54835ac89f1 100644
--- a/mlir/include/mlir/Dialect/Vector/TransformOps/VectorTransformOps.td
+++ b/mlir/include/mlir/Dialect/Vector/TransformOps/VectorTransformOps.td
@@ -243,6 +243,29 @@ def ApplyLowerMultiReductionPatternsOp : Op<Transform_Dialect,
}];
}
+def ApplyLowerMultiReductionTransformationPatternsOp : Op<Transform_Dialect,
+ "apply_patterns.vector.lower_multi_reduction_transformation",
+ [DeclareOpInterfaceMethods<PatternDescriptorOpInterface>]> {
+ let description = [{
+ Indicates that vector multi_reduction-like operations should be
+ transformed such that all reduction dimensions become innermost or
+ outermost, and 1-D reductions are lifted to 2-D.
+
+ This populates the patterns from
+ `populateVectorMultiReductionTransformationPatterns`, i.e.:
+ * `InnerOuterDimReductionConversion`
+ * `OneDimMultiReductionToTwoDim`
+ }];
+
+ let arguments = (ins DefaultValuedAttr<VectorMultiReductionLoweringAttr,
+ "vector::VectorMultiReductionLowering::InnerParallel">:$lowering_strategy
+ );
+
+ let assemblyFormat = [{
+ (`lowering_strategy` `=` $lowering_strategy^)? attr-dict
+ }];
+}
+
def ApplyLowerOuterProductPatternsOp : Op<Transform_Dialect,
"apply_patterns.vector.lower_outerproduct",
[DeclareOpInterfaceMethods<PatternDescriptorOpInterface>]> {
diff --git a/mlir/lib/Dialect/Vector/TransformOps/VectorTransformOps.cpp b/mlir/lib/Dialect/Vector/TransformOps/VectorTransformOps.cpp
index 5495f8abdb3359..3e9af181195c33 100644
--- a/mlir/lib/Dialect/Vector/TransformOps/VectorTransformOps.cpp
+++ b/mlir/lib/Dialect/Vector/TransformOps/VectorTransformOps.cpp
@@ -138,6 +138,14 @@ void transform::ApplyLowerMultiReductionPatternsOp::populatePatterns(
patterns, vectorTransformOptions.vectorMultiReductionLowering);
}
+void transform::ApplyLowerMultiReductionTransformationPatternsOp::
+ populatePatterns(RewritePatternSet &patterns) {
+ vector::VectorTransformsOptions vectorTransformOptions;
+ vectorTransformOptions.setVectorMultiReductionLowering(getLoweringStrategy());
+ vector::populateVectorMultiReductionTransformationPatterns(
+ patterns, vectorTransformOptions.vectorMultiReductionLowering);
+}
+
void transform::ApplyLowerOuterProductPatternsOp::populatePatterns(
RewritePatternSet &patterns) {
populateVectorOuterProductLoweringPatterns(patterns);
>From 93d41427c799013ca63cff74bbf1cd485ff8e28b Mon Sep 17 00:00:00 2001
From: Erick Ochoa <erick.ochoalopez at amd.com>
Date: Wed, 11 Feb 2026 10:51:05 -0500
Subject: [PATCH 02/16] [mlir][vector] Add test NFC
---
...vector-multi-reduction-transformation.mlir | 124 ++++++++++++++++++
1 file changed, 124 insertions(+)
create mode 100644 mlir/test/Dialect/Vector/vector-multi-reduction-transformation.mlir
diff --git a/mlir/test/Dialect/Vector/vector-multi-reduction-transformation.mlir b/mlir/test/Dialect/Vector/vector-multi-reduction-transformation.mlir
new file mode 100644
index 00000000000000..24009821a38b12
--- /dev/null
+++ b/mlir/test/Dialect/Vector/vector-multi-reduction-transformation.mlir
@@ -0,0 +1,124 @@
+// RUN: mlir-opt %s --transform-interpreter='entry-point=innerreduction' | FileCheck %s --check-prefix=INNERREDUCTION
+// RUN: mlir-opt %s --transform-interpreter='entry-point=innerparallel' | FileCheck %s --check-prefix=INNERPARALLEL
+
+// INNERREDUCTION-LABEL: func @transpose_reduction_dims_innerreduction
+// INNERREDUCTION-SAME: %[[INPUT:.+]]: vector<3x2x4xf32>
+// INNERREDUCTION-SAME: %[[ACC:.+]]: vector<2x4xf32>
+func.func @transpose_reduction_dims_innerreduction(%arg0: vector<3x2x4xf32>, %acc: vector<2x4xf32>) -> vector<2x4xf32> {
+ // INNERREDUCTION: %[[TRANSPOSED:.+]] = vector.transpose %[[INPUT]], [1, 2, 0]
+ // INNERREDUCTION: %[[RESULT:.+]] = vector.multi_reduction <mul>, %[[TRANSPOSED]], %[[ACC]] [2]
+ %0 = vector.multi_reduction <mul>, %arg0, %acc [0] : vector<3x2x4xf32> to vector<2x4xf32>
+ // INNERREDUCTION: return %[[RESULT]]
+ return %0 : vector<2x4xf32>
+}
+
+// INNERPARALLEL-LABEL: func @transpose_reduction_dims_innerparallel
+// INNERPARALLEL-SAME: %[[INPUT:.+]]: vector<3x2x4xf32>
+// INNERPARALLEL-SAME: %[[ACC:.+]]: vector<3x2xf32>
+func.func @transpose_reduction_dims_innerparallel(%arg0: vector<3x2x4xf32>, %acc: vector<3x2xf32>) -> vector<3x2xf32> {
+ // INNERPARALLEL: %[[TRANSPOSED:.+]] = vector.transpose %[[INPUT]], [2, 0, 1]
+ // INNERPARALLEL: vector.multi_reduction <mul>, %[[TRANSPOSED]], %[[ACC]] [0]
+ %0 = vector.multi_reduction <mul>, %arg0, %acc [2] : vector<3x2x4xf32> to vector<3x2xf32>
+ return %0 : vector<3x2xf32>
+}
+
+// INNERREDUCTION-LABEL: func @transpose_multi_reduction_dims
+// INNERREDUCTION-SAME: %[[INPUT:.+]]: vector<2x3x4x5xf32>
+// INNERREDUCTION-SAME: %[[ACC:.+]]: vector<2x5xf32>
+func.func @transpose_multi_reduction_dims(%arg0: vector<2x3x4x5xf32>, %acc: vector<2x5xf32>) -> vector<2x5xf32> {
+ // INNERREDUCTION: %[[TRANSPOSED:.+]] = vector.transpose %[[INPUT]], [0, 3, 1, 2]
+ // INNERREDUCTION: %[[RESULT:.+]] = vector.multi_reduction <add>, %[[TRANSPOSED]], %[[ACC]] [2, 3]
+ %0 = vector.multi_reduction <add>, %arg0, %acc [1, 2] : vector<2x3x4x5xf32> to vector<2x5xf32>
+ // INNERREDUCTION: return %[[RESULT]]
+ return %0 : vector<2x5xf32>
+}
+
+// INNERREDUCTION-LABEL: func @transpose_parallel_middle
+// INNERREDUCTION-SAME: %[[INPUT:.+]]: vector<3x4x5xf32>
+// INNERREDUCTION-SAME: %[[ACC:.+]]: vector<4xf32>
+// INNERPARALLEL-LABEL: func @transpose_parallel_middle
+// INNERPARALLEL-SAME: %[[INPUT:.+]]: vector<3x4x5xf32>
+// INNERPARALLEL-SAME: %[[ACC:.+]]: vector<4xf32>
+func.func @transpose_parallel_middle(%arg0: vector<3x4x5xf32>, %acc: vector<4xf32>) -> vector<4xf32> {
+ // INNERREDUCTION: %[[TRANSPOSED:.+]] = vector.transpose %[[INPUT]], [1, 0, 2]
+ // INNERREDUCTION: %[[RESULT:.+]] = vector.multi_reduction <add>, %[[TRANSPOSED]], %[[ACC]] [1, 2]
+ // INNERPARALLEL: %[[TRANSPOSED:.+]] = vector.transpose %[[INPUT]], [0, 2, 1]
+ // INNERPARALLEL: vector.multi_reduction <add>, %[[TRANSPOSED]], %[[ACC]] [0, 1]
+ %0 = vector.multi_reduction <add>, %arg0, %acc [0, 2] : vector<3x4x5xf32> to vector<4xf32>
+ // INNERREDUCTION: return %[[RESULT]]
+ return %0 : vector<4xf32>
+}
+
+// INNERREDUCTION-LABEL: func @one_dim_to_two_dim_innerreduction
+// INNERREDUCTION-SAME: %[[INPUT:.+]]: vector<8xf32>
+// INNERREDUCTION-SAME: %[[ACC:.+]]: f32
+func.func @one_dim_to_two_dim_innerreduction(%arg0: vector<8xf32>, %acc: f32) -> f32 {
+ // INNERREDUCTION: %[[CAST:.+]] = vector.shape_cast %[[INPUT]] : vector<8xf32> to vector<1x8xf32>
+ // INNERREDUCTION: %[[BROADCAST:.+]] = vector.broadcast %[[ACC]] : f32 to vector<1xf32>
+ // INNERREDUCTION: %[[RESULT:.+]] = vector.multi_reduction <add>, %[[CAST]], %[[BROADCAST]] [1]
+ %0 = vector.multi_reduction <add>, %arg0, %acc [0] : vector<8xf32> to f32
+ // INNERREDUCTION: %[[EXTRACT:.+]] = vector.extract %[[RESULT]][0]
+ // INNERREDUCTION: return %[[EXTRACT]]
+ return %0 : f32
+}
+
+// INNERPARALLEL-LABEL: func @one_dim_to_two_dim_innerparallel
+// INNERPARALLEL-SAME: %[[INPUT:.+]]: vector<2xf32>
+// INNERPARALLEL-SAME: %[[ACC:.+]]: f32
+func.func @one_dim_to_two_dim_innerparallel(%arg0: vector<2xf32>, %acc: f32) -> f32 {
+ // INNERPARALLEL: %[[CAST:.+]] = vector.shape_cast %[[INPUT]] : vector<2xf32> to vector<1x2xf32>
+ // INNERPARALLEL: %[[BROADCAST:.+]] = vector.broadcast %[[ACC]] : f32 to vector<1xf32>
+ // INNERPARALLEL: %[[TRANSPOSED:.+]] = vector.transpose %[[CAST]], [1, 0]
+ // INNERPARALLEL: vector.multi_reduction <maxnumf>, %[[TRANSPOSED]], %[[BROADCAST]] [0]
+ %0 = vector.multi_reduction <maxnumf>, %arg0, %acc [0] : vector<2xf32> to f32
+ return %0 : f32
+}
+
+// INNERREDUCTION-LABEL: func @one_dim_to_two_dim_scalable
+// INNERREDUCTION-SAME: %[[INPUT:.+]]: vector<[4]xf32>
+// INNERREDUCTION-SAME: %[[ACC:.+]]: f32
+func.func @one_dim_to_two_dim_scalable(%arg0: vector<[4]xf32>, %acc: f32) -> f32 {
+ // INNERREDUCTION: %[[CAST:.+]] = vector.shape_cast %[[INPUT]] : vector<[4]xf32> to vector<1x[4]xf32>
+ // INNERREDUCTION: %[[BROADCAST:.+]] = vector.broadcast %[[ACC]] : f32 to vector<1xf32>
+ // INNERREDUCTION: %[[RESULT:.+]] = vector.multi_reduction <add>, %[[CAST]], %[[BROADCAST]] [1]
+ %0 = vector.multi_reduction <add>, %arg0, %acc [0] : vector<[4]xf32> to f32
+ // INNERREDUCTION: %[[EXTRACT:.+]] = vector.extract %[[RESULT]][0]
+ // INNERREDUCTION: return %[[EXTRACT]]
+ return %0 : f32
+}
+
+// INNERREDUCTION-LABEL: func @one_dim_to_two_dim_masked
+// INNERREDUCTION-SAME: %[[INPUT:.+]]: vector<8xf32>
+// INNERREDUCTION-SAME: %[[ACC:.+]]: f32
+// INNERREDUCTION-SAME: %[[MASK:.+]]: vector<8xi1>
+func.func @one_dim_to_two_dim_masked(%arg0: vector<8xf32>, %acc: f32, %mask: vector<8xi1>) -> f32 {
+ // INNERREDUCTION: %[[CAST:.+]] = vector.shape_cast %[[INPUT]] : vector<8xf32> to vector<1x8xf32>
+ // INNERREDUCTION: %[[BROADCAST_ACC:.+]] = vector.broadcast %[[ACC]] : f32 to vector<1xf32>
+ // INNERREDUCTION: %[[BROADCAST_MASK:.+]] = vector.broadcast %[[MASK]] : vector<8xi1> to vector<1x8xi1>
+ // INNERREDUCTION: %[[RESULT:.+]] = vector.mask %[[BROADCAST_MASK]] {
+ // INNERREDUCTION: vector.multi_reduction <add>, %[[CAST]], %[[BROADCAST_ACC]] [1]
+ %0 = vector.mask %mask {
+ vector.multi_reduction <add>, %arg0, %acc [0] : vector<8xf32> to f32
+ } : vector<8xi1> -> f32
+ // INNERREDUCTION: %[[EXTRACT:.+]] = vector.extract %[[RESULT]][0]
+ // INNERREDUCTION: return %[[EXTRACT]]
+ return %0 : f32
+}
+
+module attributes {transform.with_named_sequence} {
+ transform.named_sequence @innerreduction(%root : !transform.any_op {transform.readonly}) {
+ %func_op = transform.structured.match ops{["func.func"]} in %root : (!transform.any_op) -> !transform.op<"func.func">
+ transform.apply_patterns to %func_op {
+ transform.apply_patterns.vector.lower_multi_reduction_transformation lowering_strategy = "innerreduction"
+ } : !transform.op<"func.func">
+ transform.yield
+ }
+
+ transform.named_sequence @innerparallel(%root : !transform.any_op {transform.readonly}) {
+ %func_op = transform.structured.match ops{["func.func"]} in %root : (!transform.any_op) -> !transform.op<"func.func">
+ transform.apply_patterns to %func_op {
+ transform.apply_patterns.vector.lower_multi_reduction_transformation lowering_strategy = "innerparallel"
+ } : !transform.op<"func.func">
+ transform.yield
+ }
+}
>From f3e3a3c927d1370023170ca85841c9ddbe084cf6 Mon Sep 17 00:00:00 2001
From: Erick Ochoa <erick.ochoalopez at amd.com>
Date: Wed, 11 Feb 2026 10:58:53 -0500
Subject: [PATCH 03/16] [mlir][vector] Add test for python bindings.
Adds tests for ApplyLowerMultiReductionTransformationPatternsOp's python
bindings.
---
mlir/test/python/dialects/transform_vector_ext.py | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/mlir/test/python/dialects/transform_vector_ext.py b/mlir/test/python/dialects/transform_vector_ext.py
index 2bcb2a2ac58123..6166007673c2e7 100644
--- a/mlir/test/python/dialects/transform_vector_ext.py
+++ b/mlir/test/python/dialects/transform_vector_ext.py
@@ -100,6 +100,14 @@ def enum_configurable_patterns():
lowering_strategy=vector.VectorMultiReductionLowering.InnerReduction
)
+ # CHECK: transform.apply_patterns.vector.lower_multi_reduction_transformation
+ vector.ApplyLowerMultiReductionTransformationPatternsOp()
+ # CHECK: transform.apply_patterns.vector.lower_multi_reduction_transformation
+ # CHECK-SAME: lowering_strategy = innerreduction
+ vector.ApplyLowerMultiReductionTransformationPatternsOp(
+ lowering_strategy=vector.VectorMultiReductionLowering.InnerReduction
+ )
+
# CHECK: transform.apply_patterns.vector.lower_transpose
vector.ApplyLowerTransposePatternsOp()
# CHECK: transform.apply_patterns.vector.lower_transpose
>From 2e954ee260370058e7c562218f63fe5d6b8f5249 Mon Sep 17 00:00:00 2001
From: Erick Ochoa <erick.ochoalopez at amd.com>
Date: Wed, 11 Feb 2026 14:48:39 -0500
Subject: [PATCH 04/16] Rename
---
.../Dialect/Vector/TransformOps/VectorTransformOps.td | 4 ++--
.../Dialect/Vector/TransformOps/VectorTransformOps.cpp | 2 +-
.../Vector/vector-multi-reduction-transformation.mlir | 4 ++--
mlir/test/python/dialects/transform_vector_ext.py | 8 ++++----
4 files changed, 9 insertions(+), 9 deletions(-)
diff --git a/mlir/include/mlir/Dialect/Vector/TransformOps/VectorTransformOps.td b/mlir/include/mlir/Dialect/Vector/TransformOps/VectorTransformOps.td
index dfe54835ac89f1..0cc8058d99b996 100644
--- a/mlir/include/mlir/Dialect/Vector/TransformOps/VectorTransformOps.td
+++ b/mlir/include/mlir/Dialect/Vector/TransformOps/VectorTransformOps.td
@@ -243,8 +243,8 @@ def ApplyLowerMultiReductionPatternsOp : Op<Transform_Dialect,
}];
}
-def ApplyLowerMultiReductionTransformationPatternsOp : Op<Transform_Dialect,
- "apply_patterns.vector.lower_multi_reduction_transformation",
+def ApplyReorderMultiReductionDimsPatternsOp : Op<Transform_Dialect,
+ "apply_patterns.vector.reorder_multi_reduction_dims",
[DeclareOpInterfaceMethods<PatternDescriptorOpInterface>]> {
let description = [{
Indicates that vector multi_reduction-like operations should be
diff --git a/mlir/lib/Dialect/Vector/TransformOps/VectorTransformOps.cpp b/mlir/lib/Dialect/Vector/TransformOps/VectorTransformOps.cpp
index 3e9af181195c33..8b63a1c60c56b8 100644
--- a/mlir/lib/Dialect/Vector/TransformOps/VectorTransformOps.cpp
+++ b/mlir/lib/Dialect/Vector/TransformOps/VectorTransformOps.cpp
@@ -138,7 +138,7 @@ void transform::ApplyLowerMultiReductionPatternsOp::populatePatterns(
patterns, vectorTransformOptions.vectorMultiReductionLowering);
}
-void transform::ApplyLowerMultiReductionTransformationPatternsOp::
+void transform::ApplyReorderMultiReductionDimsPatternsOp::
populatePatterns(RewritePatternSet &patterns) {
vector::VectorTransformsOptions vectorTransformOptions;
vectorTransformOptions.setVectorMultiReductionLowering(getLoweringStrategy());
diff --git a/mlir/test/Dialect/Vector/vector-multi-reduction-transformation.mlir b/mlir/test/Dialect/Vector/vector-multi-reduction-transformation.mlir
index 24009821a38b12..f849f2b88a1666 100644
--- a/mlir/test/Dialect/Vector/vector-multi-reduction-transformation.mlir
+++ b/mlir/test/Dialect/Vector/vector-multi-reduction-transformation.mlir
@@ -109,7 +109,7 @@ module attributes {transform.with_named_sequence} {
transform.named_sequence @innerreduction(%root : !transform.any_op {transform.readonly}) {
%func_op = transform.structured.match ops{["func.func"]} in %root : (!transform.any_op) -> !transform.op<"func.func">
transform.apply_patterns to %func_op {
- transform.apply_patterns.vector.lower_multi_reduction_transformation lowering_strategy = "innerreduction"
+ transform.apply_patterns.vector.reorder_multi_reduction_dims lowering_strategy = "innerreduction"
} : !transform.op<"func.func">
transform.yield
}
@@ -117,7 +117,7 @@ module attributes {transform.with_named_sequence} {
transform.named_sequence @innerparallel(%root : !transform.any_op {transform.readonly}) {
%func_op = transform.structured.match ops{["func.func"]} in %root : (!transform.any_op) -> !transform.op<"func.func">
transform.apply_patterns to %func_op {
- transform.apply_patterns.vector.lower_multi_reduction_transformation lowering_strategy = "innerparallel"
+ transform.apply_patterns.vector.reorder_multi_reduction_dims lowering_strategy = "innerparallel"
} : !transform.op<"func.func">
transform.yield
}
diff --git a/mlir/test/python/dialects/transform_vector_ext.py b/mlir/test/python/dialects/transform_vector_ext.py
index 6166007673c2e7..04ff316e76ec71 100644
--- a/mlir/test/python/dialects/transform_vector_ext.py
+++ b/mlir/test/python/dialects/transform_vector_ext.py
@@ -100,11 +100,11 @@ def enum_configurable_patterns():
lowering_strategy=vector.VectorMultiReductionLowering.InnerReduction
)
- # CHECK: transform.apply_patterns.vector.lower_multi_reduction_transformation
- vector.ApplyLowerMultiReductionTransformationPatternsOp()
- # CHECK: transform.apply_patterns.vector.lower_multi_reduction_transformation
+ # CHECK: transform.apply_patterns.vector.reorder_multi_reduction_dims
+ vector.ApplyReorderMultiReductionDimsPatternsOp()
+ # CHECK: transform.apply_patterns.vector.reorder_multi_reduction_dims
# CHECK-SAME: lowering_strategy = innerreduction
- vector.ApplyLowerMultiReductionTransformationPatternsOp(
+ vector.ApplyReorderMultiReductionDimsPatternsOp(
lowering_strategy=vector.VectorMultiReductionLowering.InnerReduction
)
>From 0e279994d08790324578100749edab02dc827ef5 Mon Sep 17 00:00:00 2001
From: Erick Ochoa <erick.ochoalopez at amd.com>
Date: Wed, 11 Feb 2026 14:53:13 -0500
Subject: [PATCH 05/16] Style
---
mlir/lib/Dialect/Vector/TransformOps/VectorTransformOps.cpp | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/mlir/lib/Dialect/Vector/TransformOps/VectorTransformOps.cpp b/mlir/lib/Dialect/Vector/TransformOps/VectorTransformOps.cpp
index 8b63a1c60c56b8..de21a5b86388dd 100644
--- a/mlir/lib/Dialect/Vector/TransformOps/VectorTransformOps.cpp
+++ b/mlir/lib/Dialect/Vector/TransformOps/VectorTransformOps.cpp
@@ -138,8 +138,8 @@ void transform::ApplyLowerMultiReductionPatternsOp::populatePatterns(
patterns, vectorTransformOptions.vectorMultiReductionLowering);
}
-void transform::ApplyReorderMultiReductionDimsPatternsOp::
- populatePatterns(RewritePatternSet &patterns) {
+void transform::ApplyReorderMultiReductionDimsPatternsOp::populatePatterns(
+ RewritePatternSet &patterns) {
vector::VectorTransformsOptions vectorTransformOptions;
vectorTransformOptions.setVectorMultiReductionLowering(getLoweringStrategy());
vector::populateVectorMultiReductionTransformationPatterns(
>From c8a035a6d293a7010fabfbf70669b42c5f5285bc Mon Sep 17 00:00:00 2001
From: Erick Ochoa <erick.ochoalopez at amd.com>
Date: Thu, 12 Feb 2026 14:28:20 -0500
Subject: [PATCH 06/16] Rename CHECK commands
---
...vector-multi-reduction-transformation.mlir | 128 +++++++++---------
1 file changed, 64 insertions(+), 64 deletions(-)
diff --git a/mlir/test/Dialect/Vector/vector-multi-reduction-transformation.mlir b/mlir/test/Dialect/Vector/vector-multi-reduction-transformation.mlir
index f849f2b88a1666..9726d809f0410d 100644
--- a/mlir/test/Dialect/Vector/vector-multi-reduction-transformation.mlir
+++ b/mlir/test/Dialect/Vector/vector-multi-reduction-transformation.mlir
@@ -1,107 +1,107 @@
-// RUN: mlir-opt %s --transform-interpreter='entry-point=innerreduction' | FileCheck %s --check-prefix=INNERREDUCTION
-// RUN: mlir-opt %s --transform-interpreter='entry-point=innerparallel' | FileCheck %s --check-prefix=INNERPARALLEL
+// RUN: mlir-opt %s --transform-interpreter='entry-point=innerreduction' | FileCheck %s --check-prefix=INNER_REDUCTION
+// RUN: mlir-opt %s --transform-interpreter='entry-point=innerparallel' | FileCheck %s --check-prefix=INNER_PARALLEL
-// INNERREDUCTION-LABEL: func @transpose_reduction_dims_innerreduction
-// INNERREDUCTION-SAME: %[[INPUT:.+]]: vector<3x2x4xf32>
-// INNERREDUCTION-SAME: %[[ACC:.+]]: vector<2x4xf32>
+// INNER_REDUCTION-LABEL: func @transpose_reduction_dims_innerreduction
+// INNER_REDUCTION-SAME: %[[INPUT:.+]]: vector<3x2x4xf32>
+// INNER_REDUCTION-SAME: %[[ACC:.+]]: vector<2x4xf32>
func.func @transpose_reduction_dims_innerreduction(%arg0: vector<3x2x4xf32>, %acc: vector<2x4xf32>) -> vector<2x4xf32> {
- // INNERREDUCTION: %[[TRANSPOSED:.+]] = vector.transpose %[[INPUT]], [1, 2, 0]
- // INNERREDUCTION: %[[RESULT:.+]] = vector.multi_reduction <mul>, %[[TRANSPOSED]], %[[ACC]] [2]
+ // INNER_REDUCTION: %[[TRANSPOSED:.+]] = vector.transpose %[[INPUT]], [1, 2, 0]
+ // INNER_REDUCTION: %[[RESULT:.+]] = vector.multi_reduction <mul>, %[[TRANSPOSED]], %[[ACC]] [2]
%0 = vector.multi_reduction <mul>, %arg0, %acc [0] : vector<3x2x4xf32> to vector<2x4xf32>
- // INNERREDUCTION: return %[[RESULT]]
+ // INNER_REDUCTION: return %[[RESULT]]
return %0 : vector<2x4xf32>
}
-// INNERPARALLEL-LABEL: func @transpose_reduction_dims_innerparallel
-// INNERPARALLEL-SAME: %[[INPUT:.+]]: vector<3x2x4xf32>
-// INNERPARALLEL-SAME: %[[ACC:.+]]: vector<3x2xf32>
+// INNER_PARALLEL-LABEL: func @transpose_reduction_dims_innerparallel
+// INNER_PARALLEL-SAME: %[[INPUT:.+]]: vector<3x2x4xf32>
+// INNER_PARALLEL-SAME: %[[ACC:.+]]: vector<3x2xf32>
func.func @transpose_reduction_dims_innerparallel(%arg0: vector<3x2x4xf32>, %acc: vector<3x2xf32>) -> vector<3x2xf32> {
- // INNERPARALLEL: %[[TRANSPOSED:.+]] = vector.transpose %[[INPUT]], [2, 0, 1]
- // INNERPARALLEL: vector.multi_reduction <mul>, %[[TRANSPOSED]], %[[ACC]] [0]
+ // INNER_PARALLEL: %[[TRANSPOSED:.+]] = vector.transpose %[[INPUT]], [2, 0, 1]
+ // INNER_PARALLEL: vector.multi_reduction <mul>, %[[TRANSPOSED]], %[[ACC]] [0]
%0 = vector.multi_reduction <mul>, %arg0, %acc [2] : vector<3x2x4xf32> to vector<3x2xf32>
return %0 : vector<3x2xf32>
}
-// INNERREDUCTION-LABEL: func @transpose_multi_reduction_dims
-// INNERREDUCTION-SAME: %[[INPUT:.+]]: vector<2x3x4x5xf32>
-// INNERREDUCTION-SAME: %[[ACC:.+]]: vector<2x5xf32>
+// INNER_REDUCTION-LABEL: func @transpose_multi_reduction_dims
+// INNER_REDUCTION-SAME: %[[INPUT:.+]]: vector<2x3x4x5xf32>
+// INNER_REDUCTION-SAME: %[[ACC:.+]]: vector<2x5xf32>
func.func @transpose_multi_reduction_dims(%arg0: vector<2x3x4x5xf32>, %acc: vector<2x5xf32>) -> vector<2x5xf32> {
- // INNERREDUCTION: %[[TRANSPOSED:.+]] = vector.transpose %[[INPUT]], [0, 3, 1, 2]
- // INNERREDUCTION: %[[RESULT:.+]] = vector.multi_reduction <add>, %[[TRANSPOSED]], %[[ACC]] [2, 3]
+ // INNER_REDUCTION: %[[TRANSPOSED:.+]] = vector.transpose %[[INPUT]], [0, 3, 1, 2]
+ // INNER_REDUCTION: %[[RESULT:.+]] = vector.multi_reduction <add>, %[[TRANSPOSED]], %[[ACC]] [2, 3]
%0 = vector.multi_reduction <add>, %arg0, %acc [1, 2] : vector<2x3x4x5xf32> to vector<2x5xf32>
- // INNERREDUCTION: return %[[RESULT]]
+ // INNER_REDUCTION: return %[[RESULT]]
return %0 : vector<2x5xf32>
}
-// INNERREDUCTION-LABEL: func @transpose_parallel_middle
-// INNERREDUCTION-SAME: %[[INPUT:.+]]: vector<3x4x5xf32>
-// INNERREDUCTION-SAME: %[[ACC:.+]]: vector<4xf32>
-// INNERPARALLEL-LABEL: func @transpose_parallel_middle
-// INNERPARALLEL-SAME: %[[INPUT:.+]]: vector<3x4x5xf32>
-// INNERPARALLEL-SAME: %[[ACC:.+]]: vector<4xf32>
+// INNER_REDUCTION-LABEL: func @transpose_parallel_middle
+// INNER_REDUCTION-SAME: %[[INPUT:.+]]: vector<3x4x5xf32>
+// INNER_REDUCTION-SAME: %[[ACC:.+]]: vector<4xf32>
+// INNER_PARALLEL-LABEL: func @transpose_parallel_middle
+// INNER_PARALLEL-SAME: %[[INPUT:.+]]: vector<3x4x5xf32>
+// INNER_PARALLEL-SAME: %[[ACC:.+]]: vector<4xf32>
func.func @transpose_parallel_middle(%arg0: vector<3x4x5xf32>, %acc: vector<4xf32>) -> vector<4xf32> {
- // INNERREDUCTION: %[[TRANSPOSED:.+]] = vector.transpose %[[INPUT]], [1, 0, 2]
- // INNERREDUCTION: %[[RESULT:.+]] = vector.multi_reduction <add>, %[[TRANSPOSED]], %[[ACC]] [1, 2]
- // INNERPARALLEL: %[[TRANSPOSED:.+]] = vector.transpose %[[INPUT]], [0, 2, 1]
- // INNERPARALLEL: vector.multi_reduction <add>, %[[TRANSPOSED]], %[[ACC]] [0, 1]
+ // INNER_REDUCTION: %[[TRANSPOSED:.+]] = vector.transpose %[[INPUT]], [1, 0, 2]
+ // INNER_REDUCTION: %[[RESULT:.+]] = vector.multi_reduction <add>, %[[TRANSPOSED]], %[[ACC]] [1, 2]
+ // INNER_PARALLEL: %[[TRANSPOSED:.+]] = vector.transpose %[[INPUT]], [0, 2, 1]
+ // INNER_PARALLEL: vector.multi_reduction <add>, %[[TRANSPOSED]], %[[ACC]] [0, 1]
%0 = vector.multi_reduction <add>, %arg0, %acc [0, 2] : vector<3x4x5xf32> to vector<4xf32>
- // INNERREDUCTION: return %[[RESULT]]
+ // INNER_REDUCTION: return %[[RESULT]]
return %0 : vector<4xf32>
}
-// INNERREDUCTION-LABEL: func @one_dim_to_two_dim_innerreduction
-// INNERREDUCTION-SAME: %[[INPUT:.+]]: vector<8xf32>
-// INNERREDUCTION-SAME: %[[ACC:.+]]: f32
+// INNER_REDUCTION-LABEL: func @one_dim_to_two_dim_innerreduction
+// INNER_REDUCTION-SAME: %[[INPUT:.+]]: vector<8xf32>
+// INNER_REDUCTION-SAME: %[[ACC:.+]]: f32
func.func @one_dim_to_two_dim_innerreduction(%arg0: vector<8xf32>, %acc: f32) -> f32 {
- // INNERREDUCTION: %[[CAST:.+]] = vector.shape_cast %[[INPUT]] : vector<8xf32> to vector<1x8xf32>
- // INNERREDUCTION: %[[BROADCAST:.+]] = vector.broadcast %[[ACC]] : f32 to vector<1xf32>
- // INNERREDUCTION: %[[RESULT:.+]] = vector.multi_reduction <add>, %[[CAST]], %[[BROADCAST]] [1]
+ // INNER_REDUCTION: %[[CAST:.+]] = vector.shape_cast %[[INPUT]] : vector<8xf32> to vector<1x8xf32>
+ // INNER_REDUCTION: %[[BROADCAST:.+]] = vector.broadcast %[[ACC]] : f32 to vector<1xf32>
+ // INNER_REDUCTION: %[[RESULT:.+]] = vector.multi_reduction <add>, %[[CAST]], %[[BROADCAST]] [1]
%0 = vector.multi_reduction <add>, %arg0, %acc [0] : vector<8xf32> to f32
- // INNERREDUCTION: %[[EXTRACT:.+]] = vector.extract %[[RESULT]][0]
- // INNERREDUCTION: return %[[EXTRACT]]
+ // INNER_REDUCTION: %[[EXTRACT:.+]] = vector.extract %[[RESULT]][0]
+ // INNER_REDUCTION: return %[[EXTRACT]]
return %0 : f32
}
-// INNERPARALLEL-LABEL: func @one_dim_to_two_dim_innerparallel
-// INNERPARALLEL-SAME: %[[INPUT:.+]]: vector<2xf32>
-// INNERPARALLEL-SAME: %[[ACC:.+]]: f32
+// INNER_PARALLEL-LABEL: func @one_dim_to_two_dim_innerparallel
+// INNER_PARALLEL-SAME: %[[INPUT:.+]]: vector<2xf32>
+// INNER_PARALLEL-SAME: %[[ACC:.+]]: f32
func.func @one_dim_to_two_dim_innerparallel(%arg0: vector<2xf32>, %acc: f32) -> f32 {
- // INNERPARALLEL: %[[CAST:.+]] = vector.shape_cast %[[INPUT]] : vector<2xf32> to vector<1x2xf32>
- // INNERPARALLEL: %[[BROADCAST:.+]] = vector.broadcast %[[ACC]] : f32 to vector<1xf32>
- // INNERPARALLEL: %[[TRANSPOSED:.+]] = vector.transpose %[[CAST]], [1, 0]
- // INNERPARALLEL: vector.multi_reduction <maxnumf>, %[[TRANSPOSED]], %[[BROADCAST]] [0]
+ // INNER_PARALLEL: %[[CAST:.+]] = vector.shape_cast %[[INPUT]] : vector<2xf32> to vector<1x2xf32>
+ // INNER_PARALLEL: %[[BROADCAST:.+]] = vector.broadcast %[[ACC]] : f32 to vector<1xf32>
+ // INNER_PARALLEL: %[[TRANSPOSED:.+]] = vector.transpose %[[CAST]], [1, 0]
+ // INNER_PARALLEL: vector.multi_reduction <maxnumf>, %[[TRANSPOSED]], %[[BROADCAST]] [0]
%0 = vector.multi_reduction <maxnumf>, %arg0, %acc [0] : vector<2xf32> to f32
return %0 : f32
}
-// INNERREDUCTION-LABEL: func @one_dim_to_two_dim_scalable
-// INNERREDUCTION-SAME: %[[INPUT:.+]]: vector<[4]xf32>
-// INNERREDUCTION-SAME: %[[ACC:.+]]: f32
+// INNER_REDUCTION-LABEL: func @one_dim_to_two_dim_scalable
+// INNER_REDUCTION-SAME: %[[INPUT:.+]]: vector<[4]xf32>
+// INNER_REDUCTION-SAME: %[[ACC:.+]]: f32
func.func @one_dim_to_two_dim_scalable(%arg0: vector<[4]xf32>, %acc: f32) -> f32 {
- // INNERREDUCTION: %[[CAST:.+]] = vector.shape_cast %[[INPUT]] : vector<[4]xf32> to vector<1x[4]xf32>
- // INNERREDUCTION: %[[BROADCAST:.+]] = vector.broadcast %[[ACC]] : f32 to vector<1xf32>
- // INNERREDUCTION: %[[RESULT:.+]] = vector.multi_reduction <add>, %[[CAST]], %[[BROADCAST]] [1]
+ // INNER_REDUCTION: %[[CAST:.+]] = vector.shape_cast %[[INPUT]] : vector<[4]xf32> to vector<1x[4]xf32>
+ // INNER_REDUCTION: %[[BROADCAST:.+]] = vector.broadcast %[[ACC]] : f32 to vector<1xf32>
+ // INNER_REDUCTION: %[[RESULT:.+]] = vector.multi_reduction <add>, %[[CAST]], %[[BROADCAST]] [1]
%0 = vector.multi_reduction <add>, %arg0, %acc [0] : vector<[4]xf32> to f32
- // INNERREDUCTION: %[[EXTRACT:.+]] = vector.extract %[[RESULT]][0]
- // INNERREDUCTION: return %[[EXTRACT]]
+ // INNER_REDUCTION: %[[EXTRACT:.+]] = vector.extract %[[RESULT]][0]
+ // INNER_REDUCTION: return %[[EXTRACT]]
return %0 : f32
}
-// INNERREDUCTION-LABEL: func @one_dim_to_two_dim_masked
-// INNERREDUCTION-SAME: %[[INPUT:.+]]: vector<8xf32>
-// INNERREDUCTION-SAME: %[[ACC:.+]]: f32
-// INNERREDUCTION-SAME: %[[MASK:.+]]: vector<8xi1>
+// INNER_REDUCTION-LABEL: func @one_dim_to_two_dim_masked
+// INNER_REDUCTION-SAME: %[[INPUT:.+]]: vector<8xf32>
+// INNER_REDUCTION-SAME: %[[ACC:.+]]: f32
+// INNER_REDUCTION-SAME: %[[MASK:.+]]: vector<8xi1>
func.func @one_dim_to_two_dim_masked(%arg0: vector<8xf32>, %acc: f32, %mask: vector<8xi1>) -> f32 {
- // INNERREDUCTION: %[[CAST:.+]] = vector.shape_cast %[[INPUT]] : vector<8xf32> to vector<1x8xf32>
- // INNERREDUCTION: %[[BROADCAST_ACC:.+]] = vector.broadcast %[[ACC]] : f32 to vector<1xf32>
- // INNERREDUCTION: %[[BROADCAST_MASK:.+]] = vector.broadcast %[[MASK]] : vector<8xi1> to vector<1x8xi1>
- // INNERREDUCTION: %[[RESULT:.+]] = vector.mask %[[BROADCAST_MASK]] {
- // INNERREDUCTION: vector.multi_reduction <add>, %[[CAST]], %[[BROADCAST_ACC]] [1]
+ // INNER_REDUCTION: %[[CAST:.+]] = vector.shape_cast %[[INPUT]] : vector<8xf32> to vector<1x8xf32>
+ // INNER_REDUCTION: %[[BROADCAST_ACC:.+]] = vector.broadcast %[[ACC]] : f32 to vector<1xf32>
+ // INNER_REDUCTION: %[[BROADCAST_MASK:.+]] = vector.broadcast %[[MASK]] : vector<8xi1> to vector<1x8xi1>
+ // INNER_REDUCTION: %[[RESULT:.+]] = vector.mask %[[BROADCAST_MASK]] {
+ // INNER_REDUCTION: vector.multi_reduction <add>, %[[CAST]], %[[BROADCAST_ACC]] [1]
%0 = vector.mask %mask {
vector.multi_reduction <add>, %arg0, %acc [0] : vector<8xf32> to f32
} : vector<8xi1> -> f32
- // INNERREDUCTION: %[[EXTRACT:.+]] = vector.extract %[[RESULT]][0]
- // INNERREDUCTION: return %[[EXTRACT]]
+ // INNER_REDUCTION: %[[EXTRACT:.+]] = vector.extract %[[RESULT]][0]
+ // INNER_REDUCTION: return %[[EXTRACT]]
return %0 : f32
}
>From ce9a1934ee156fc9701b514a40039fcc4c516fef Mon Sep 17 00:00:00 2001
From: Erick Ochoa <erick.ochoalopez at amd.com>
Date: Thu, 12 Feb 2026 14:29:45 -0500
Subject: [PATCH 07/16] rename transpose_reduction_dims_innerreduction to
inner_reduction_to_inner_parallel
---
.../Dialect/Vector/vector-multi-reduction-transformation.mlir | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/mlir/test/Dialect/Vector/vector-multi-reduction-transformation.mlir b/mlir/test/Dialect/Vector/vector-multi-reduction-transformation.mlir
index 9726d809f0410d..0e4e3961ea32fc 100644
--- a/mlir/test/Dialect/Vector/vector-multi-reduction-transformation.mlir
+++ b/mlir/test/Dialect/Vector/vector-multi-reduction-transformation.mlir
@@ -1,10 +1,10 @@
// RUN: mlir-opt %s --transform-interpreter='entry-point=innerreduction' | FileCheck %s --check-prefix=INNER_REDUCTION
// RUN: mlir-opt %s --transform-interpreter='entry-point=innerparallel' | FileCheck %s --check-prefix=INNER_PARALLEL
-// INNER_REDUCTION-LABEL: func @transpose_reduction_dims_innerreduction
+// INNER_REDUCTION-LABEL: func @inner_reduction_to_inner_parallel
// INNER_REDUCTION-SAME: %[[INPUT:.+]]: vector<3x2x4xf32>
// INNER_REDUCTION-SAME: %[[ACC:.+]]: vector<2x4xf32>
-func.func @transpose_reduction_dims_innerreduction(%arg0: vector<3x2x4xf32>, %acc: vector<2x4xf32>) -> vector<2x4xf32> {
+func.func @inner_reduction_to_inner_parallel(%arg0: vector<3x2x4xf32>, %acc: vector<2x4xf32>) -> vector<2x4xf32> {
// INNER_REDUCTION: %[[TRANSPOSED:.+]] = vector.transpose %[[INPUT]], [1, 2, 0]
// INNER_REDUCTION: %[[RESULT:.+]] = vector.multi_reduction <mul>, %[[TRANSPOSED]], %[[ACC]] [2]
%0 = vector.multi_reduction <mul>, %arg0, %acc [0] : vector<3x2x4xf32> to vector<2x4xf32>
>From 9935297401a7d0927410968074816b111c68c1a6 Mon Sep 17 00:00:00 2001
From: Erick Ochoa <erick.ochoalopez at amd.com>
Date: Thu, 12 Feb 2026 14:31:08 -0500
Subject: [PATCH 08/16] Rename transpose_reduction_dims_innerparallel to
inner_parallel_to_inner_reduction
---
.../Dialect/Vector/vector-multi-reduction-transformation.mlir | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/mlir/test/Dialect/Vector/vector-multi-reduction-transformation.mlir b/mlir/test/Dialect/Vector/vector-multi-reduction-transformation.mlir
index 0e4e3961ea32fc..4c5e81680ceb2c 100644
--- a/mlir/test/Dialect/Vector/vector-multi-reduction-transformation.mlir
+++ b/mlir/test/Dialect/Vector/vector-multi-reduction-transformation.mlir
@@ -12,10 +12,10 @@ func.func @inner_reduction_to_inner_parallel(%arg0: vector<3x2x4xf32>, %acc: vec
return %0 : vector<2x4xf32>
}
-// INNER_PARALLEL-LABEL: func @transpose_reduction_dims_innerparallel
+// INNER_PARALLEL-LABEL: func @inner_parallel_to_inner_reduction
// INNER_PARALLEL-SAME: %[[INPUT:.+]]: vector<3x2x4xf32>
// INNER_PARALLEL-SAME: %[[ACC:.+]]: vector<3x2xf32>
-func.func @transpose_reduction_dims_innerparallel(%arg0: vector<3x2x4xf32>, %acc: vector<3x2xf32>) -> vector<3x2xf32> {
+func.func @inner_parallel_to_inner_reduction(%arg0: vector<3x2x4xf32>, %acc: vector<3x2xf32>) -> vector<3x2xf32> {
// INNER_PARALLEL: %[[TRANSPOSED:.+]] = vector.transpose %[[INPUT]], [2, 0, 1]
// INNER_PARALLEL: vector.multi_reduction <mul>, %[[TRANSPOSED]], %[[ACC]] [0]
%0 = vector.multi_reduction <mul>, %arg0, %acc [2] : vector<3x2x4xf32> to vector<3x2xf32>
>From eb7810f21597e878b16aca0867156e4997d2c911 Mon Sep 17 00:00:00 2001
From: Erick Ochoa <erick.ochoalopez at amd.com>
Date: Thu, 12 Feb 2026 14:33:51 -0500
Subject: [PATCH 09/16] Use ALL label
---
.../vector-multi-reduction-transformation.mlir | 13 +++++--------
1 file changed, 5 insertions(+), 8 deletions(-)
diff --git a/mlir/test/Dialect/Vector/vector-multi-reduction-transformation.mlir b/mlir/test/Dialect/Vector/vector-multi-reduction-transformation.mlir
index 4c5e81680ceb2c..db04c182f59bda 100644
--- a/mlir/test/Dialect/Vector/vector-multi-reduction-transformation.mlir
+++ b/mlir/test/Dialect/Vector/vector-multi-reduction-transformation.mlir
@@ -33,19 +33,16 @@ func.func @transpose_multi_reduction_dims(%arg0: vector<2x3x4x5xf32>, %acc: vect
return %0 : vector<2x5xf32>
}
-// INNER_REDUCTION-LABEL: func @transpose_parallel_middle
-// INNER_REDUCTION-SAME: %[[INPUT:.+]]: vector<3x4x5xf32>
-// INNER_REDUCTION-SAME: %[[ACC:.+]]: vector<4xf32>
-// INNER_PARALLEL-LABEL: func @transpose_parallel_middle
-// INNER_PARALLEL-SAME: %[[INPUT:.+]]: vector<3x4x5xf32>
-// INNER_PARALLEL-SAME: %[[ACC:.+]]: vector<4xf32>
+// ALL-LABEL: func @transpose_parallel_middle
+// ALL-SAME: %[[INPUT:.+]]: vector<3x4x5xf32>
+// ALL-SAME: %[[ACC:.+]]: vector<4xf32>
func.func @transpose_parallel_middle(%arg0: vector<3x4x5xf32>, %acc: vector<4xf32>) -> vector<4xf32> {
// INNER_REDUCTION: %[[TRANSPOSED:.+]] = vector.transpose %[[INPUT]], [1, 0, 2]
// INNER_REDUCTION: %[[RESULT:.+]] = vector.multi_reduction <add>, %[[TRANSPOSED]], %[[ACC]] [1, 2]
// INNER_PARALLEL: %[[TRANSPOSED:.+]] = vector.transpose %[[INPUT]], [0, 2, 1]
- // INNER_PARALLEL: vector.multi_reduction <add>, %[[TRANSPOSED]], %[[ACC]] [0, 1]
+ // INNER_PARALLEL: %[[RESULT:.+]] = vector.multi_reduction <add>, %[[TRANSPOSED]], %[[ACC]] [0, 1]
%0 = vector.multi_reduction <add>, %arg0, %acc [0, 2] : vector<3x4x5xf32> to vector<4xf32>
- // INNER_REDUCTION: return %[[RESULT]]
+ // ALL: return %[[RESULT]]
return %0 : vector<4xf32>
}
>From 464057c362ba5d37b4a8132049d25ecdb8a9dd8d Mon Sep 17 00:00:00 2001
From: Erick Ochoa <erick.ochoalopez at amd.com>
Date: Thu, 12 Feb 2026 14:39:24 -0500
Subject: [PATCH 10/16] Rename ApplyReorderMultiReductionDimsPatternsOp to
ApplyReorderAndExpandMultiReductionPatternsOp
---
.../Dialect/Vector/TransformOps/VectorTransformOps.td | 4 ++--
.../Dialect/Vector/TransformOps/VectorTransformOps.cpp | 2 +-
.../Vector/vector-multi-reduction-transformation.mlir | 4 ++--
mlir/test/python/dialects/transform_vector_ext.py | 8 ++++----
4 files changed, 9 insertions(+), 9 deletions(-)
diff --git a/mlir/include/mlir/Dialect/Vector/TransformOps/VectorTransformOps.td b/mlir/include/mlir/Dialect/Vector/TransformOps/VectorTransformOps.td
index 0cc8058d99b996..22770168942cff 100644
--- a/mlir/include/mlir/Dialect/Vector/TransformOps/VectorTransformOps.td
+++ b/mlir/include/mlir/Dialect/Vector/TransformOps/VectorTransformOps.td
@@ -243,8 +243,8 @@ def ApplyLowerMultiReductionPatternsOp : Op<Transform_Dialect,
}];
}
-def ApplyReorderMultiReductionDimsPatternsOp : Op<Transform_Dialect,
- "apply_patterns.vector.reorder_multi_reduction_dims",
+def ApplyReorderAndExpandMultiReductionPatternsOp: Op<Transform_Dialect,
+ "apply_patterns.vector.reorder_and_expand_multi_reduction_dims",
[DeclareOpInterfaceMethods<PatternDescriptorOpInterface>]> {
let description = [{
Indicates that vector multi_reduction-like operations should be
diff --git a/mlir/lib/Dialect/Vector/TransformOps/VectorTransformOps.cpp b/mlir/lib/Dialect/Vector/TransformOps/VectorTransformOps.cpp
index de21a5b86388dd..5c4aa72b6f60b1 100644
--- a/mlir/lib/Dialect/Vector/TransformOps/VectorTransformOps.cpp
+++ b/mlir/lib/Dialect/Vector/TransformOps/VectorTransformOps.cpp
@@ -138,7 +138,7 @@ void transform::ApplyLowerMultiReductionPatternsOp::populatePatterns(
patterns, vectorTransformOptions.vectorMultiReductionLowering);
}
-void transform::ApplyReorderMultiReductionDimsPatternsOp::populatePatterns(
+void transform::ApplyReorderAndExpandMultiReductionPatternsOp::populatePatterns(
RewritePatternSet &patterns) {
vector::VectorTransformsOptions vectorTransformOptions;
vectorTransformOptions.setVectorMultiReductionLowering(getLoweringStrategy());
diff --git a/mlir/test/Dialect/Vector/vector-multi-reduction-transformation.mlir b/mlir/test/Dialect/Vector/vector-multi-reduction-transformation.mlir
index db04c182f59bda..e2ab38406f8fed 100644
--- a/mlir/test/Dialect/Vector/vector-multi-reduction-transformation.mlir
+++ b/mlir/test/Dialect/Vector/vector-multi-reduction-transformation.mlir
@@ -106,7 +106,7 @@ module attributes {transform.with_named_sequence} {
transform.named_sequence @innerreduction(%root : !transform.any_op {transform.readonly}) {
%func_op = transform.structured.match ops{["func.func"]} in %root : (!transform.any_op) -> !transform.op<"func.func">
transform.apply_patterns to %func_op {
- transform.apply_patterns.vector.reorder_multi_reduction_dims lowering_strategy = "innerreduction"
+ transform.apply_patterns.vector.reorder_and_expand_multi_reduction_dims lowering_strategy = "innerreduction"
} : !transform.op<"func.func">
transform.yield
}
@@ -114,7 +114,7 @@ module attributes {transform.with_named_sequence} {
transform.named_sequence @innerparallel(%root : !transform.any_op {transform.readonly}) {
%func_op = transform.structured.match ops{["func.func"]} in %root : (!transform.any_op) -> !transform.op<"func.func">
transform.apply_patterns to %func_op {
- transform.apply_patterns.vector.reorder_multi_reduction_dims lowering_strategy = "innerparallel"
+ transform.apply_patterns.vector.reorder_and_expand_multi_reduction_dims lowering_strategy = "innerparallel"
} : !transform.op<"func.func">
transform.yield
}
diff --git a/mlir/test/python/dialects/transform_vector_ext.py b/mlir/test/python/dialects/transform_vector_ext.py
index 04ff316e76ec71..0f9aab29ca5caf 100644
--- a/mlir/test/python/dialects/transform_vector_ext.py
+++ b/mlir/test/python/dialects/transform_vector_ext.py
@@ -100,11 +100,11 @@ def enum_configurable_patterns():
lowering_strategy=vector.VectorMultiReductionLowering.InnerReduction
)
- # CHECK: transform.apply_patterns.vector.reorder_multi_reduction_dims
- vector.ApplyReorderMultiReductionDimsPatternsOp()
- # CHECK: transform.apply_patterns.vector.reorder_multi_reduction_dims
+ # CHECK: transform.apply_patterns.vector.reorder_and_expand_multi_reduction_dims
+ vector.ApplyReorderAndExpandMultiReductionPatternsOp()
+ # CHECK: transform.apply_patterns.vector.reorder_and_expand_multi_reduction_dims
# CHECK-SAME: lowering_strategy = innerreduction
- vector.ApplyReorderMultiReductionDimsPatternsOp(
+ vector.ApplyReorderAndExpandMultiReductionPatternsOp(
lowering_strategy=vector.VectorMultiReductionLowering.InnerReduction
)
>From 324155e9638fb45d43e4bfcf1583196c0960f369 Mon Sep 17 00:00:00 2001
From: Erick Ochoa <erick.ochoalopez at amd.com>
Date: Thu, 12 Feb 2026 14:58:57 -0500
Subject: [PATCH 11/16] Reuse same input
---
...vector-multi-reduction-transformation.mlir | 35 +++++++------------
1 file changed, 13 insertions(+), 22 deletions(-)
diff --git a/mlir/test/Dialect/Vector/vector-multi-reduction-transformation.mlir b/mlir/test/Dialect/Vector/vector-multi-reduction-transformation.mlir
index e2ab38406f8fed..ae8f10c6abe135 100644
--- a/mlir/test/Dialect/Vector/vector-multi-reduction-transformation.mlir
+++ b/mlir/test/Dialect/Vector/vector-multi-reduction-transformation.mlir
@@ -1,5 +1,5 @@
-// RUN: mlir-opt %s --transform-interpreter='entry-point=innerreduction' | FileCheck %s --check-prefix=INNER_REDUCTION
-// RUN: mlir-opt %s --transform-interpreter='entry-point=innerparallel' | FileCheck %s --check-prefix=INNER_PARALLEL
+// RUN: mlir-opt %s --transform-interpreter='entry-point=innerreduction' | FileCheck %s --check-prefix=INNER_REDUCTION,ALL
+// RUN: mlir-opt %s --transform-interpreter='entry-point=innerparallel' | FileCheck %s --check-prefix=INNER_PARALLEL,ALL
// INNER_REDUCTION-LABEL: func @inner_reduction_to_inner_parallel
// INNER_REDUCTION-SAME: %[[INPUT:.+]]: vector<3x2x4xf32>
@@ -46,28 +46,19 @@ func.func @transpose_parallel_middle(%arg0: vector<3x4x5xf32>, %acc: vector<4xf3
return %0 : vector<4xf32>
}
-// INNER_REDUCTION-LABEL: func @one_dim_to_two_dim_innerreduction
-// INNER_REDUCTION-SAME: %[[INPUT:.+]]: vector<8xf32>
-// INNER_REDUCTION-SAME: %[[ACC:.+]]: f32
-func.func @one_dim_to_two_dim_innerreduction(%arg0: vector<8xf32>, %acc: f32) -> f32 {
- // INNER_REDUCTION: %[[CAST:.+]] = vector.shape_cast %[[INPUT]] : vector<8xf32> to vector<1x8xf32>
- // INNER_REDUCTION: %[[BROADCAST:.+]] = vector.broadcast %[[ACC]] : f32 to vector<1xf32>
+// ALL-LABEL: func @one_dim_to_two_dim
+// ALL-SAME: %[[INPUT:.+]]: vector<8xf32>
+// ALL-SAME: %[[ACC:.+]]: f32
+func.func @one_dim_to_two_dim(%arg0: vector<8xf32>, %acc: f32) -> f32 {
+ // ALL: %[[CAST:.+]] = vector.shape_cast %[[INPUT]] : vector<8xf32> to vector<1x8xf32>
+ // ALL: %[[BROADCAST:.+]] = vector.broadcast %[[ACC]] : f32 to vector<1xf32>
// INNER_REDUCTION: %[[RESULT:.+]] = vector.multi_reduction <add>, %[[CAST]], %[[BROADCAST]] [1]
- %0 = vector.multi_reduction <add>, %arg0, %acc [0] : vector<8xf32> to f32
- // INNER_REDUCTION: %[[EXTRACT:.+]] = vector.extract %[[RESULT]][0]
- // INNER_REDUCTION: return %[[EXTRACT]]
- return %0 : f32
-}
-
-// INNER_PARALLEL-LABEL: func @one_dim_to_two_dim_innerparallel
-// INNER_PARALLEL-SAME: %[[INPUT:.+]]: vector<2xf32>
-// INNER_PARALLEL-SAME: %[[ACC:.+]]: f32
-func.func @one_dim_to_two_dim_innerparallel(%arg0: vector<2xf32>, %acc: f32) -> f32 {
- // INNER_PARALLEL: %[[CAST:.+]] = vector.shape_cast %[[INPUT]] : vector<2xf32> to vector<1x2xf32>
- // INNER_PARALLEL: %[[BROADCAST:.+]] = vector.broadcast %[[ACC]] : f32 to vector<1xf32>
+ // INNER_REDUCTION: %[[SCALAR:.+]] = vector.extract %[[RESULT]][0]
// INNER_PARALLEL: %[[TRANSPOSED:.+]] = vector.transpose %[[CAST]], [1, 0]
- // INNER_PARALLEL: vector.multi_reduction <maxnumf>, %[[TRANSPOSED]], %[[BROADCAST]] [0]
- %0 = vector.multi_reduction <maxnumf>, %arg0, %acc [0] : vector<2xf32> to f32
+ // INNER_PARALLEL: %[[RESULT:.+]] = vector.multi_reduction <add>, %[[TRANSPOSED]], %[[BROADCAST]] [0]
+ // INNER_PARALLEL: %[[SCALAR:.+]] = vector.extract %[[RESULT]][0]
+ %0 = vector.multi_reduction <add>, %arg0, %acc [0] : vector<8xf32> to f32
+ // ALL: return %[[SCALAR]]
return %0 : f32
}
>From c1e3e8f7050ddfdbf77f70a93ea8ce6ea6c42852 Mon Sep 17 00:00:00 2001
From: Erick Ochoa <erick.ochoalopez at amd.com>
Date: Thu, 12 Feb 2026 15:16:22 -0500
Subject: [PATCH 12/16] Rename file
---
...or-multi-reduction-reorder-and-expand.mlir | 112 ++++++++++++++++++
1 file changed, 112 insertions(+)
create mode 100644 mlir/test/Dialect/Vector/vector-multi-reduction-reorder-and-expand.mlir
diff --git a/mlir/test/Dialect/Vector/vector-multi-reduction-reorder-and-expand.mlir b/mlir/test/Dialect/Vector/vector-multi-reduction-reorder-and-expand.mlir
new file mode 100644
index 00000000000000..ae8f10c6abe135
--- /dev/null
+++ b/mlir/test/Dialect/Vector/vector-multi-reduction-reorder-and-expand.mlir
@@ -0,0 +1,112 @@
+// RUN: mlir-opt %s --transform-interpreter='entry-point=innerreduction' | FileCheck %s --check-prefix=INNER_REDUCTION,ALL
+// RUN: mlir-opt %s --transform-interpreter='entry-point=innerparallel' | FileCheck %s --check-prefix=INNER_PARALLEL,ALL
+
+// INNER_REDUCTION-LABEL: func @inner_reduction_to_inner_parallel
+// INNER_REDUCTION-SAME: %[[INPUT:.+]]: vector<3x2x4xf32>
+// INNER_REDUCTION-SAME: %[[ACC:.+]]: vector<2x4xf32>
+func.func @inner_reduction_to_inner_parallel(%arg0: vector<3x2x4xf32>, %acc: vector<2x4xf32>) -> vector<2x4xf32> {
+ // INNER_REDUCTION: %[[TRANSPOSED:.+]] = vector.transpose %[[INPUT]], [1, 2, 0]
+ // INNER_REDUCTION: %[[RESULT:.+]] = vector.multi_reduction <mul>, %[[TRANSPOSED]], %[[ACC]] [2]
+ %0 = vector.multi_reduction <mul>, %arg0, %acc [0] : vector<3x2x4xf32> to vector<2x4xf32>
+ // INNER_REDUCTION: return %[[RESULT]]
+ return %0 : vector<2x4xf32>
+}
+
+// INNER_PARALLEL-LABEL: func @inner_parallel_to_inner_reduction
+// INNER_PARALLEL-SAME: %[[INPUT:.+]]: vector<3x2x4xf32>
+// INNER_PARALLEL-SAME: %[[ACC:.+]]: vector<3x2xf32>
+func.func @inner_parallel_to_inner_reduction(%arg0: vector<3x2x4xf32>, %acc: vector<3x2xf32>) -> vector<3x2xf32> {
+ // INNER_PARALLEL: %[[TRANSPOSED:.+]] = vector.transpose %[[INPUT]], [2, 0, 1]
+ // INNER_PARALLEL: vector.multi_reduction <mul>, %[[TRANSPOSED]], %[[ACC]] [0]
+ %0 = vector.multi_reduction <mul>, %arg0, %acc [2] : vector<3x2x4xf32> to vector<3x2xf32>
+ return %0 : vector<3x2xf32>
+}
+
+// INNER_REDUCTION-LABEL: func @transpose_multi_reduction_dims
+// INNER_REDUCTION-SAME: %[[INPUT:.+]]: vector<2x3x4x5xf32>
+// INNER_REDUCTION-SAME: %[[ACC:.+]]: vector<2x5xf32>
+func.func @transpose_multi_reduction_dims(%arg0: vector<2x3x4x5xf32>, %acc: vector<2x5xf32>) -> vector<2x5xf32> {
+ // INNER_REDUCTION: %[[TRANSPOSED:.+]] = vector.transpose %[[INPUT]], [0, 3, 1, 2]
+ // INNER_REDUCTION: %[[RESULT:.+]] = vector.multi_reduction <add>, %[[TRANSPOSED]], %[[ACC]] [2, 3]
+ %0 = vector.multi_reduction <add>, %arg0, %acc [1, 2] : vector<2x3x4x5xf32> to vector<2x5xf32>
+ // INNER_REDUCTION: return %[[RESULT]]
+ return %0 : vector<2x5xf32>
+}
+
+// ALL-LABEL: func @transpose_parallel_middle
+// ALL-SAME: %[[INPUT:.+]]: vector<3x4x5xf32>
+// ALL-SAME: %[[ACC:.+]]: vector<4xf32>
+func.func @transpose_parallel_middle(%arg0: vector<3x4x5xf32>, %acc: vector<4xf32>) -> vector<4xf32> {
+ // INNER_REDUCTION: %[[TRANSPOSED:.+]] = vector.transpose %[[INPUT]], [1, 0, 2]
+ // INNER_REDUCTION: %[[RESULT:.+]] = vector.multi_reduction <add>, %[[TRANSPOSED]], %[[ACC]] [1, 2]
+ // INNER_PARALLEL: %[[TRANSPOSED:.+]] = vector.transpose %[[INPUT]], [0, 2, 1]
+ // INNER_PARALLEL: %[[RESULT:.+]] = vector.multi_reduction <add>, %[[TRANSPOSED]], %[[ACC]] [0, 1]
+ %0 = vector.multi_reduction <add>, %arg0, %acc [0, 2] : vector<3x4x5xf32> to vector<4xf32>
+ // ALL: return %[[RESULT]]
+ return %0 : vector<4xf32>
+}
+
+// ALL-LABEL: func @one_dim_to_two_dim
+// ALL-SAME: %[[INPUT:.+]]: vector<8xf32>
+// ALL-SAME: %[[ACC:.+]]: f32
+func.func @one_dim_to_two_dim(%arg0: vector<8xf32>, %acc: f32) -> f32 {
+ // ALL: %[[CAST:.+]] = vector.shape_cast %[[INPUT]] : vector<8xf32> to vector<1x8xf32>
+ // ALL: %[[BROADCAST:.+]] = vector.broadcast %[[ACC]] : f32 to vector<1xf32>
+ // INNER_REDUCTION: %[[RESULT:.+]] = vector.multi_reduction <add>, %[[CAST]], %[[BROADCAST]] [1]
+ // INNER_REDUCTION: %[[SCALAR:.+]] = vector.extract %[[RESULT]][0]
+ // INNER_PARALLEL: %[[TRANSPOSED:.+]] = vector.transpose %[[CAST]], [1, 0]
+ // INNER_PARALLEL: %[[RESULT:.+]] = vector.multi_reduction <add>, %[[TRANSPOSED]], %[[BROADCAST]] [0]
+ // INNER_PARALLEL: %[[SCALAR:.+]] = vector.extract %[[RESULT]][0]
+ %0 = vector.multi_reduction <add>, %arg0, %acc [0] : vector<8xf32> to f32
+ // ALL: return %[[SCALAR]]
+ return %0 : f32
+}
+
+// INNER_REDUCTION-LABEL: func @one_dim_to_two_dim_scalable
+// INNER_REDUCTION-SAME: %[[INPUT:.+]]: vector<[4]xf32>
+// INNER_REDUCTION-SAME: %[[ACC:.+]]: f32
+func.func @one_dim_to_two_dim_scalable(%arg0: vector<[4]xf32>, %acc: f32) -> f32 {
+ // INNER_REDUCTION: %[[CAST:.+]] = vector.shape_cast %[[INPUT]] : vector<[4]xf32> to vector<1x[4]xf32>
+ // INNER_REDUCTION: %[[BROADCAST:.+]] = vector.broadcast %[[ACC]] : f32 to vector<1xf32>
+ // INNER_REDUCTION: %[[RESULT:.+]] = vector.multi_reduction <add>, %[[CAST]], %[[BROADCAST]] [1]
+ %0 = vector.multi_reduction <add>, %arg0, %acc [0] : vector<[4]xf32> to f32
+ // INNER_REDUCTION: %[[EXTRACT:.+]] = vector.extract %[[RESULT]][0]
+ // INNER_REDUCTION: return %[[EXTRACT]]
+ return %0 : f32
+}
+
+// INNER_REDUCTION-LABEL: func @one_dim_to_two_dim_masked
+// INNER_REDUCTION-SAME: %[[INPUT:.+]]: vector<8xf32>
+// INNER_REDUCTION-SAME: %[[ACC:.+]]: f32
+// INNER_REDUCTION-SAME: %[[MASK:.+]]: vector<8xi1>
+func.func @one_dim_to_two_dim_masked(%arg0: vector<8xf32>, %acc: f32, %mask: vector<8xi1>) -> f32 {
+ // INNER_REDUCTION: %[[CAST:.+]] = vector.shape_cast %[[INPUT]] : vector<8xf32> to vector<1x8xf32>
+ // INNER_REDUCTION: %[[BROADCAST_ACC:.+]] = vector.broadcast %[[ACC]] : f32 to vector<1xf32>
+ // INNER_REDUCTION: %[[BROADCAST_MASK:.+]] = vector.broadcast %[[MASK]] : vector<8xi1> to vector<1x8xi1>
+ // INNER_REDUCTION: %[[RESULT:.+]] = vector.mask %[[BROADCAST_MASK]] {
+ // INNER_REDUCTION: vector.multi_reduction <add>, %[[CAST]], %[[BROADCAST_ACC]] [1]
+ %0 = vector.mask %mask {
+ vector.multi_reduction <add>, %arg0, %acc [0] : vector<8xf32> to f32
+ } : vector<8xi1> -> f32
+ // INNER_REDUCTION: %[[EXTRACT:.+]] = vector.extract %[[RESULT]][0]
+ // INNER_REDUCTION: return %[[EXTRACT]]
+ return %0 : f32
+}
+
+module attributes {transform.with_named_sequence} {
+ transform.named_sequence @innerreduction(%root : !transform.any_op {transform.readonly}) {
+ %func_op = transform.structured.match ops{["func.func"]} in %root : (!transform.any_op) -> !transform.op<"func.func">
+ transform.apply_patterns to %func_op {
+ transform.apply_patterns.vector.reorder_and_expand_multi_reduction_dims lowering_strategy = "innerreduction"
+ } : !transform.op<"func.func">
+ transform.yield
+ }
+
+ transform.named_sequence @innerparallel(%root : !transform.any_op {transform.readonly}) {
+ %func_op = transform.structured.match ops{["func.func"]} in %root : (!transform.any_op) -> !transform.op<"func.func">
+ transform.apply_patterns to %func_op {
+ transform.apply_patterns.vector.reorder_and_expand_multi_reduction_dims lowering_strategy = "innerparallel"
+ } : !transform.op<"func.func">
+ transform.yield
+ }
+}
>From bea1437351181ab42da62808fd0e3056e5902bd2 Mon Sep 17 00:00:00 2001
From: Erick Ochoa <erick.ochoalopez at amd.com>
Date: Tue, 17 Feb 2026 15:19:21 -0500
Subject: [PATCH 13/16] Test the return
---
.../Vector/vector-multi-reduction-reorder-and-expand.mlir | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/mlir/test/Dialect/Vector/vector-multi-reduction-reorder-and-expand.mlir b/mlir/test/Dialect/Vector/vector-multi-reduction-reorder-and-expand.mlir
index ae8f10c6abe135..5e2bde90d808df 100644
--- a/mlir/test/Dialect/Vector/vector-multi-reduction-reorder-and-expand.mlir
+++ b/mlir/test/Dialect/Vector/vector-multi-reduction-reorder-and-expand.mlir
@@ -17,8 +17,9 @@ func.func @inner_reduction_to_inner_parallel(%arg0: vector<3x2x4xf32>, %acc: vec
// INNER_PARALLEL-SAME: %[[ACC:.+]]: vector<3x2xf32>
func.func @inner_parallel_to_inner_reduction(%arg0: vector<3x2x4xf32>, %acc: vector<3x2xf32>) -> vector<3x2xf32> {
// INNER_PARALLEL: %[[TRANSPOSED:.+]] = vector.transpose %[[INPUT]], [2, 0, 1]
- // INNER_PARALLEL: vector.multi_reduction <mul>, %[[TRANSPOSED]], %[[ACC]] [0]
+ // INNER_PARALLEL: %[[RESULT:.+]] = vector.multi_reduction <mul>, %[[TRANSPOSED]], %[[ACC]] [0]
%0 = vector.multi_reduction <mul>, %arg0, %acc [2] : vector<3x2x4xf32> to vector<3x2xf32>
+ // INNER_PARALLEL: return %[[RESULT]]
return %0 : vector<3x2xf32>
}
>From dd6de094a1c595d545139e348781ac2927a14023 Mon Sep 17 00:00:00 2001
From: Erick Ochoa <erick.ochoalopez at amd.com>
Date: Tue, 17 Feb 2026 15:21:54 -0500
Subject: [PATCH 14/16] Delete unnecessary case
---
.../vector-multi-reduction-reorder-and-expand.mlir | 11 -----------
1 file changed, 11 deletions(-)
diff --git a/mlir/test/Dialect/Vector/vector-multi-reduction-reorder-and-expand.mlir b/mlir/test/Dialect/Vector/vector-multi-reduction-reorder-and-expand.mlir
index 5e2bde90d808df..7f41f7e9e1ddc1 100644
--- a/mlir/test/Dialect/Vector/vector-multi-reduction-reorder-and-expand.mlir
+++ b/mlir/test/Dialect/Vector/vector-multi-reduction-reorder-and-expand.mlir
@@ -23,17 +23,6 @@ func.func @inner_parallel_to_inner_reduction(%arg0: vector<3x2x4xf32>, %acc: vec
return %0 : vector<3x2xf32>
}
-// INNER_REDUCTION-LABEL: func @transpose_multi_reduction_dims
-// INNER_REDUCTION-SAME: %[[INPUT:.+]]: vector<2x3x4x5xf32>
-// INNER_REDUCTION-SAME: %[[ACC:.+]]: vector<2x5xf32>
-func.func @transpose_multi_reduction_dims(%arg0: vector<2x3x4x5xf32>, %acc: vector<2x5xf32>) -> vector<2x5xf32> {
- // INNER_REDUCTION: %[[TRANSPOSED:.+]] = vector.transpose %[[INPUT]], [0, 3, 1, 2]
- // INNER_REDUCTION: %[[RESULT:.+]] = vector.multi_reduction <add>, %[[TRANSPOSED]], %[[ACC]] [2, 3]
- %0 = vector.multi_reduction <add>, %arg0, %acc [1, 2] : vector<2x3x4x5xf32> to vector<2x5xf32>
- // INNER_REDUCTION: return %[[RESULT]]
- return %0 : vector<2x5xf32>
-}
-
// ALL-LABEL: func @transpose_parallel_middle
// ALL-SAME: %[[INPUT:.+]]: vector<3x4x5xf32>
// ALL-SAME: %[[ACC:.+]]: vector<4xf32>
>From 79fca5a1292610736d3c30a5ecd4691f46595a8d Mon Sep 17 00:00:00 2001
From: Erick Ochoa <erick.ochoalopez at amd.com>
Date: Tue, 17 Feb 2026 15:30:55 -0500
Subject: [PATCH 15/16] Update name
---
.../Vector/TransformOps/VectorTransformOps.td | 2 +-
.../Vector/Transforms/LoweringPatterns.h | 4 +-
.../TransformOps/VectorTransformOps.cpp | 4 +-
.../Transforms/LowerVectorMultiReduction.cpp | 8 +-
...vector-multi-reduction-transformation.mlir | 112 ------------------
5 files changed, 9 insertions(+), 121 deletions(-)
delete mode 100644 mlir/test/Dialect/Vector/vector-multi-reduction-transformation.mlir
diff --git a/mlir/include/mlir/Dialect/Vector/TransformOps/VectorTransformOps.td b/mlir/include/mlir/Dialect/Vector/TransformOps/VectorTransformOps.td
index 22770168942cff..462c61df72108e 100644
--- a/mlir/include/mlir/Dialect/Vector/TransformOps/VectorTransformOps.td
+++ b/mlir/include/mlir/Dialect/Vector/TransformOps/VectorTransformOps.td
@@ -252,7 +252,7 @@ def ApplyReorderAndExpandMultiReductionPatternsOp: Op<Transform_Dialect,
outermost, and 1-D reductions are lifted to 2-D.
This populates the patterns from
- `populateVectorMultiReductionTransformationPatterns`, i.e.:
+ `populateVectorMultiReductionReorderAndExpandPatterns`, i.e.:
* `InnerOuterDimReductionConversion`
* `OneDimMultiReductionToTwoDim`
}];
diff --git a/mlir/include/mlir/Dialect/Vector/Transforms/LoweringPatterns.h b/mlir/include/mlir/Dialect/Vector/Transforms/LoweringPatterns.h
index 8126852107afd6..33487a9d8d6e0e 100644
--- a/mlir/include/mlir/Dialect/Vector/Transforms/LoweringPatterns.h
+++ b/mlir/include/mlir/Dialect/Vector/Transforms/LoweringPatterns.h
@@ -72,7 +72,7 @@ void populateVectorOuterProductLoweringPatterns(RewritePatternSet &patterns,
/// either a parallel or a reduction), we lift them back up to 2-D with a simple
/// vector.shape_cast to vector<1xk> so that the other patterns can kick in,
/// thus fully exiting out of the vector.multi_reduction abstraction.
-void populateVectorMultiReductionTransformationPatterns(
+void populateVectorMultiReductionReorderAndExpandPatterns(
RewritePatternSet &patterns, VectorMultiReductionLowering options,
PatternBenefit benefit = 1);
@@ -107,7 +107,7 @@ void populateVectorMultiReductionUnrollingPatterns(
/// a sequence of vector.reduction ops. These patterns are the ones
/// populated by:
///
-/// * populateVectorMultiReductionTransformationPatterns
+/// * populateVectorMultiReductionReorderAndExpandPatterns
/// * populateVectorMultiReductionFlatteningPatterns
/// * populateVectorMultiReductionUnrollingPatterns
///
diff --git a/mlir/lib/Dialect/Vector/TransformOps/VectorTransformOps.cpp b/mlir/lib/Dialect/Vector/TransformOps/VectorTransformOps.cpp
index 5c4aa72b6f60b1..4e2b97aa070842 100644
--- a/mlir/lib/Dialect/Vector/TransformOps/VectorTransformOps.cpp
+++ b/mlir/lib/Dialect/Vector/TransformOps/VectorTransformOps.cpp
@@ -130,7 +130,7 @@ void transform::ApplyLowerMultiReductionPatternsOp::populatePatterns(
RewritePatternSet &patterns) {
vector::VectorTransformsOptions vectorTransformOptions;
vectorTransformOptions.setVectorMultiReductionLowering(getLoweringStrategy());
- vector::populateVectorMultiReductionTransformationPatterns(
+ vector::populateVectorMultiReductionReorderAndExpandPatterns(
patterns, vectorTransformOptions.vectorMultiReductionLowering);
vector::populateVectorMultiReductionFlatteningPatterns(
patterns, vectorTransformOptions.vectorMultiReductionLowering);
@@ -142,7 +142,7 @@ void transform::ApplyReorderAndExpandMultiReductionPatternsOp::populatePatterns(
RewritePatternSet &patterns) {
vector::VectorTransformsOptions vectorTransformOptions;
vectorTransformOptions.setVectorMultiReductionLowering(getLoweringStrategy());
- vector::populateVectorMultiReductionTransformationPatterns(
+ vector::populateVectorMultiReductionReorderAndExpandPatterns(
patterns, vectorTransformOptions.vectorMultiReductionLowering);
}
diff --git a/mlir/lib/Dialect/Vector/Transforms/LowerVectorMultiReduction.cpp b/mlir/lib/Dialect/Vector/Transforms/LowerVectorMultiReduction.cpp
index 640187faeb2eb4..2d6a49bad27bc2 100644
--- a/mlir/lib/Dialect/Vector/Transforms/LowerVectorMultiReduction.cpp
+++ b/mlir/lib/Dialect/Vector/Transforms/LowerVectorMultiReduction.cpp
@@ -497,7 +497,7 @@ struct LowerVectorMultiReductionPass
MLIRContext *context = op->getContext();
RewritePatternSet patterns(context);
- mlir::vector::populateVectorMultiReductionTransformationPatterns(
+ mlir::vector::populateVectorMultiReductionReorderAndExpandPatterns(
patterns, this->loweringStrategy);
if (failed(applyPatternsGreedily(op, std::move(patterns))))
signalPassFailure();
@@ -522,7 +522,7 @@ struct LowerVectorMultiReductionPass
} // namespace
-void mlir::vector::populateVectorMultiReductionTransformationPatterns(
+void mlir::vector::populateVectorMultiReductionReorderAndExpandPatterns(
RewritePatternSet &patterns, VectorMultiReductionLowering options,
PatternBenefit benefit) {
patterns.add<OneDimMultiReductionToTwoDim>(patterns.getContext(), benefit);
@@ -551,8 +551,8 @@ void mlir::vector::populateVectorMultiReductionUnrollingPatterns(
void mlir::vector::populateVectorMultiReductionLoweringPatterns(
RewritePatternSet &patterns, VectorMultiReductionLowering options,
PatternBenefit benefit) {
- populateVectorMultiReductionTransformationPatterns(patterns, options,
- benefit);
+ populateVectorMultiReductionReorderAndExpandPatterns(patterns, options,
+ benefit);
populateVectorMultiReductionFlatteningPatterns(patterns, options, benefit);
populateVectorMultiReductionUnrollingPatterns(patterns, options, benefit);
}
diff --git a/mlir/test/Dialect/Vector/vector-multi-reduction-transformation.mlir b/mlir/test/Dialect/Vector/vector-multi-reduction-transformation.mlir
deleted file mode 100644
index ae8f10c6abe135..00000000000000
--- a/mlir/test/Dialect/Vector/vector-multi-reduction-transformation.mlir
+++ /dev/null
@@ -1,112 +0,0 @@
-// RUN: mlir-opt %s --transform-interpreter='entry-point=innerreduction' | FileCheck %s --check-prefix=INNER_REDUCTION,ALL
-// RUN: mlir-opt %s --transform-interpreter='entry-point=innerparallel' | FileCheck %s --check-prefix=INNER_PARALLEL,ALL
-
-// INNER_REDUCTION-LABEL: func @inner_reduction_to_inner_parallel
-// INNER_REDUCTION-SAME: %[[INPUT:.+]]: vector<3x2x4xf32>
-// INNER_REDUCTION-SAME: %[[ACC:.+]]: vector<2x4xf32>
-func.func @inner_reduction_to_inner_parallel(%arg0: vector<3x2x4xf32>, %acc: vector<2x4xf32>) -> vector<2x4xf32> {
- // INNER_REDUCTION: %[[TRANSPOSED:.+]] = vector.transpose %[[INPUT]], [1, 2, 0]
- // INNER_REDUCTION: %[[RESULT:.+]] = vector.multi_reduction <mul>, %[[TRANSPOSED]], %[[ACC]] [2]
- %0 = vector.multi_reduction <mul>, %arg0, %acc [0] : vector<3x2x4xf32> to vector<2x4xf32>
- // INNER_REDUCTION: return %[[RESULT]]
- return %0 : vector<2x4xf32>
-}
-
-// INNER_PARALLEL-LABEL: func @inner_parallel_to_inner_reduction
-// INNER_PARALLEL-SAME: %[[INPUT:.+]]: vector<3x2x4xf32>
-// INNER_PARALLEL-SAME: %[[ACC:.+]]: vector<3x2xf32>
-func.func @inner_parallel_to_inner_reduction(%arg0: vector<3x2x4xf32>, %acc: vector<3x2xf32>) -> vector<3x2xf32> {
- // INNER_PARALLEL: %[[TRANSPOSED:.+]] = vector.transpose %[[INPUT]], [2, 0, 1]
- // INNER_PARALLEL: vector.multi_reduction <mul>, %[[TRANSPOSED]], %[[ACC]] [0]
- %0 = vector.multi_reduction <mul>, %arg0, %acc [2] : vector<3x2x4xf32> to vector<3x2xf32>
- return %0 : vector<3x2xf32>
-}
-
-// INNER_REDUCTION-LABEL: func @transpose_multi_reduction_dims
-// INNER_REDUCTION-SAME: %[[INPUT:.+]]: vector<2x3x4x5xf32>
-// INNER_REDUCTION-SAME: %[[ACC:.+]]: vector<2x5xf32>
-func.func @transpose_multi_reduction_dims(%arg0: vector<2x3x4x5xf32>, %acc: vector<2x5xf32>) -> vector<2x5xf32> {
- // INNER_REDUCTION: %[[TRANSPOSED:.+]] = vector.transpose %[[INPUT]], [0, 3, 1, 2]
- // INNER_REDUCTION: %[[RESULT:.+]] = vector.multi_reduction <add>, %[[TRANSPOSED]], %[[ACC]] [2, 3]
- %0 = vector.multi_reduction <add>, %arg0, %acc [1, 2] : vector<2x3x4x5xf32> to vector<2x5xf32>
- // INNER_REDUCTION: return %[[RESULT]]
- return %0 : vector<2x5xf32>
-}
-
-// ALL-LABEL: func @transpose_parallel_middle
-// ALL-SAME: %[[INPUT:.+]]: vector<3x4x5xf32>
-// ALL-SAME: %[[ACC:.+]]: vector<4xf32>
-func.func @transpose_parallel_middle(%arg0: vector<3x4x5xf32>, %acc: vector<4xf32>) -> vector<4xf32> {
- // INNER_REDUCTION: %[[TRANSPOSED:.+]] = vector.transpose %[[INPUT]], [1, 0, 2]
- // INNER_REDUCTION: %[[RESULT:.+]] = vector.multi_reduction <add>, %[[TRANSPOSED]], %[[ACC]] [1, 2]
- // INNER_PARALLEL: %[[TRANSPOSED:.+]] = vector.transpose %[[INPUT]], [0, 2, 1]
- // INNER_PARALLEL: %[[RESULT:.+]] = vector.multi_reduction <add>, %[[TRANSPOSED]], %[[ACC]] [0, 1]
- %0 = vector.multi_reduction <add>, %arg0, %acc [0, 2] : vector<3x4x5xf32> to vector<4xf32>
- // ALL: return %[[RESULT]]
- return %0 : vector<4xf32>
-}
-
-// ALL-LABEL: func @one_dim_to_two_dim
-// ALL-SAME: %[[INPUT:.+]]: vector<8xf32>
-// ALL-SAME: %[[ACC:.+]]: f32
-func.func @one_dim_to_two_dim(%arg0: vector<8xf32>, %acc: f32) -> f32 {
- // ALL: %[[CAST:.+]] = vector.shape_cast %[[INPUT]] : vector<8xf32> to vector<1x8xf32>
- // ALL: %[[BROADCAST:.+]] = vector.broadcast %[[ACC]] : f32 to vector<1xf32>
- // INNER_REDUCTION: %[[RESULT:.+]] = vector.multi_reduction <add>, %[[CAST]], %[[BROADCAST]] [1]
- // INNER_REDUCTION: %[[SCALAR:.+]] = vector.extract %[[RESULT]][0]
- // INNER_PARALLEL: %[[TRANSPOSED:.+]] = vector.transpose %[[CAST]], [1, 0]
- // INNER_PARALLEL: %[[RESULT:.+]] = vector.multi_reduction <add>, %[[TRANSPOSED]], %[[BROADCAST]] [0]
- // INNER_PARALLEL: %[[SCALAR:.+]] = vector.extract %[[RESULT]][0]
- %0 = vector.multi_reduction <add>, %arg0, %acc [0] : vector<8xf32> to f32
- // ALL: return %[[SCALAR]]
- return %0 : f32
-}
-
-// INNER_REDUCTION-LABEL: func @one_dim_to_two_dim_scalable
-// INNER_REDUCTION-SAME: %[[INPUT:.+]]: vector<[4]xf32>
-// INNER_REDUCTION-SAME: %[[ACC:.+]]: f32
-func.func @one_dim_to_two_dim_scalable(%arg0: vector<[4]xf32>, %acc: f32) -> f32 {
- // INNER_REDUCTION: %[[CAST:.+]] = vector.shape_cast %[[INPUT]] : vector<[4]xf32> to vector<1x[4]xf32>
- // INNER_REDUCTION: %[[BROADCAST:.+]] = vector.broadcast %[[ACC]] : f32 to vector<1xf32>
- // INNER_REDUCTION: %[[RESULT:.+]] = vector.multi_reduction <add>, %[[CAST]], %[[BROADCAST]] [1]
- %0 = vector.multi_reduction <add>, %arg0, %acc [0] : vector<[4]xf32> to f32
- // INNER_REDUCTION: %[[EXTRACT:.+]] = vector.extract %[[RESULT]][0]
- // INNER_REDUCTION: return %[[EXTRACT]]
- return %0 : f32
-}
-
-// INNER_REDUCTION-LABEL: func @one_dim_to_two_dim_masked
-// INNER_REDUCTION-SAME: %[[INPUT:.+]]: vector<8xf32>
-// INNER_REDUCTION-SAME: %[[ACC:.+]]: f32
-// INNER_REDUCTION-SAME: %[[MASK:.+]]: vector<8xi1>
-func.func @one_dim_to_two_dim_masked(%arg0: vector<8xf32>, %acc: f32, %mask: vector<8xi1>) -> f32 {
- // INNER_REDUCTION: %[[CAST:.+]] = vector.shape_cast %[[INPUT]] : vector<8xf32> to vector<1x8xf32>
- // INNER_REDUCTION: %[[BROADCAST_ACC:.+]] = vector.broadcast %[[ACC]] : f32 to vector<1xf32>
- // INNER_REDUCTION: %[[BROADCAST_MASK:.+]] = vector.broadcast %[[MASK]] : vector<8xi1> to vector<1x8xi1>
- // INNER_REDUCTION: %[[RESULT:.+]] = vector.mask %[[BROADCAST_MASK]] {
- // INNER_REDUCTION: vector.multi_reduction <add>, %[[CAST]], %[[BROADCAST_ACC]] [1]
- %0 = vector.mask %mask {
- vector.multi_reduction <add>, %arg0, %acc [0] : vector<8xf32> to f32
- } : vector<8xi1> -> f32
- // INNER_REDUCTION: %[[EXTRACT:.+]] = vector.extract %[[RESULT]][0]
- // INNER_REDUCTION: return %[[EXTRACT]]
- return %0 : f32
-}
-
-module attributes {transform.with_named_sequence} {
- transform.named_sequence @innerreduction(%root : !transform.any_op {transform.readonly}) {
- %func_op = transform.structured.match ops{["func.func"]} in %root : (!transform.any_op) -> !transform.op<"func.func">
- transform.apply_patterns to %func_op {
- transform.apply_patterns.vector.reorder_and_expand_multi_reduction_dims lowering_strategy = "innerreduction"
- } : !transform.op<"func.func">
- transform.yield
- }
-
- transform.named_sequence @innerparallel(%root : !transform.any_op {transform.readonly}) {
- %func_op = transform.structured.match ops{["func.func"]} in %root : (!transform.any_op) -> !transform.op<"func.func">
- transform.apply_patterns to %func_op {
- transform.apply_patterns.vector.reorder_and_expand_multi_reduction_dims lowering_strategy = "innerparallel"
- } : !transform.op<"func.func">
- transform.yield
- }
-}
>From 1592aba4ddbd6862bcc5a18b466fb558a0dd280a Mon Sep 17 00:00:00 2001
From: Erick Ochoa <erick.ochoalopez at amd.com>
Date: Tue, 17 Feb 2026 15:36:02 -0500
Subject: [PATCH 16/16] remove unnecessary tests
---
.../vector-multi-reduction-lowering.mlir | 76 -------------------
1 file changed, 76 deletions(-)
diff --git a/mlir/test/Dialect/Vector/vector-multi-reduction-lowering.mlir b/mlir/test/Dialect/Vector/vector-multi-reduction-lowering.mlir
index 146080c268aa22..3ce9f57edf9d68 100644
--- a/mlir/test/Dialect/Vector/vector-multi-reduction-lowering.mlir
+++ b/mlir/test/Dialect/Vector/vector-multi-reduction-lowering.mlir
@@ -69,69 +69,6 @@ func.func @vector_reduction_inner(%arg0: vector<2x3x4x5xi32>, %acc: vector<2x3xi
// CHECK: %[[RESULT:.+]] = vector.shape_cast %[[FLAT_RESULT_VEC]] : vector<6xi32> to vector<2x3xi32>
// CHECK: return %[[RESULT]]
-// Patterns applied:
-// * InnerOuterDimReductionConversion from populateVectorMultiReductionTransformationPatterns
-// * ReduceMultiDimReductionRank from populateVectorMultiReductionFlatteningPatterns
-// * TwoDimMultiReductionToReduction from populateVectorMultiReductionUnrollingPatterns
-func.func @vector_multi_reduction_transposed(%arg0: vector<2x3x4x5xf32>, %acc: vector<2x5xf32>) -> vector<2x5xf32> {
- %0 = vector.multi_reduction <add>, %arg0, %acc [1, 2] : vector<2x3x4x5xf32> to vector<2x5xf32>
- return %0 : vector<2x5xf32>
-}
-
-// CHECK-LABEL: func @vector_multi_reduction_transposed
-// CHECK-SAME: %[[INPUT:.+]]: vector<2x3x4x5xf32>
-// CHECK: %[[TRANSPOSED_INPUT:.+]] = vector.transpose %[[INPUT]], [0, 3, 1, 2] : vector<2x3x4x5xf32> to vector<2x5x3x4xf32>
-// CHECK: vector.shape_cast %[[TRANSPOSED_INPUT]] : vector<2x5x3x4xf32> to vector<10x12xf32>
-// CHECK: %[[RESULT:.+]] = vector.shape_cast %{{.*}} : vector<10xf32> to vector<2x5xf32>
-// CHECK: return %[[RESULT]]
-
-// Patterns applied:
-// * InnerOuterDimReductionConversion from populateVectorMultiReductionTransformationPatterns
-// * ReduceMultiDimReductionRank from populateVectorMultiReductionFlatteningPatterns
-// * TwoDimMultiReductionToReduction from populateVectorMultiReductionUnrollingPatterns
-func.func @vector_multi_reduction_ordering(%arg0: vector<3x2x4xf32>, %acc: vector<2x4xf32>) -> vector<2x4xf32> {
- %0 = vector.multi_reduction <mul>, %arg0, %acc [0] : vector<3x2x4xf32> to vector<2x4xf32>
- return %0 : vector<2x4xf32>
-}
-// CHECK-LABEL: func @vector_multi_reduction_ordering
-// CHECK-SAME: %[[INPUT:.+]]: vector<3x2x4xf32>, %[[ACC:.*]]: vector<2x4xf32>)
-// CHECK-DAG: %[[RESULT_VEC_0:.+]] = arith.constant dense<{{.*}}> : vector<8xf32>
-// CHECK: %[[TRANSPOSED_INPUT:.+]] = vector.transpose %[[INPUT]], [1, 2, 0] : vector<3x2x4xf32> to vector<2x4x3xf32>
-// CHECK: %[[V0:.+]] = vector.extract %[[TRANSPOSED_INPUT]][0, 0]
-// CHECK: %[[ACC0:.+]] = vector.extract %[[ACC]][0, 0] : f32 from vector<2x4xf32>
-// CHECK: %[[RV0:.+]] = vector.reduction <mul>, %[[V0]], %[[ACC0]] : vector<3xf32> into f32
-// CHECK: %[[RESULT_VEC_1:.+]] = vector.insert %[[RV0:.+]], %[[RESULT_VEC_0]] [0] : f32 into vector<8xf32>
-// CHECK: %[[V1:.+]] = vector.extract %[[TRANSPOSED_INPUT]][0, 1]
-// CHECK: %[[ACC1:.+]] = vector.extract %[[ACC]][0, 1] : f32 from vector<2x4xf32>
-// CHECK: %[[RV1:.+]] = vector.reduction <mul>, %[[V1]], %[[ACC1]] : vector<3xf32> into f32
-// CHECK: %[[RESULT_VEC_2:.+]] = vector.insert %[[RV1:.+]], %[[RESULT_VEC_1]] [1] : f32 into vector<8xf32>
-// CHECK: %[[V2:.+]] = vector.extract %[[TRANSPOSED_INPUT]][0, 2]
-// CHECK: %[[ACC2:.+]] = vector.extract %[[ACC]][0, 2] : f32 from vector<2x4xf32>
-// CHECK: %[[RV2:.+]] = vector.reduction <mul>, %[[V2]], %[[ACC2]] : vector<3xf32> into f32
-// CHECK: %[[RESULT_VEC_3:.+]] = vector.insert %[[RV2:.+]], %[[RESULT_VEC_2]] [2] : f32 into vector<8xf32>
-// CHECK: %[[V3:.+]] = vector.extract %[[TRANSPOSED_INPUT]][0, 3]
-// CHECK: %[[ACC3:.+]] = vector.extract %[[ACC]][0, 3] : f32 from vector<2x4xf32>
-// CHECK: %[[RV3:.+]] = vector.reduction <mul>, %[[V3]], %[[ACC3]] : vector<3xf32> into f32
-// CHECK: %[[RESULT_VEC_4:.+]] = vector.insert %[[RV3:.+]], %[[RESULT_VEC_3]] [3] : f32 into vector<8xf32>
-// CHECK: %[[V4:.+]] = vector.extract %[[TRANSPOSED_INPUT]][1, 0]
-// CHECK: %[[ACC4:.+]] = vector.extract %[[ACC]][1, 0] : f32 from vector<2x4xf32>
-// CHECK: %[[RV4:.+]] = vector.reduction <mul>, %[[V4]], %[[ACC4]] : vector<3xf32> into f32
-// CHECK: %[[RESULT_VEC_5:.+]] = vector.insert %[[RV4:.+]], %[[RESULT_VEC_4]] [4] : f32 into vector<8xf32>
-// CHECK: %[[V5:.+]] = vector.extract %[[TRANSPOSED_INPUT]][1, 1]
-// CHECK: %[[ACC5:.+]] = vector.extract %[[ACC]][1, 1] : f32 from vector<2x4xf32>
-// CHECK: %[[RV5:.+]] = vector.reduction <mul>, %[[V5]], %[[ACC5]] : vector<3xf32> into f32
-// CHECK: %[[RESULT_VEC_6:.+]] = vector.insert %[[RV5:.+]], %[[RESULT_VEC_5]] [5] : f32 into vector<8xf32>
-// CHECK: %[[V6:.+]] = vector.extract %[[TRANSPOSED_INPUT]][1, 2]
-// CHECK: %[[ACC6:.+]] = vector.extract %[[ACC]][1, 2] : f32 from vector<2x4xf32>
-// CHECK: %[[RV6:.+]] = vector.reduction <mul>, %[[V6]], %[[ACC6]] : vector<3xf32> into f32
-// CHECK: %[[RESULT_VEC_7:.+]] = vector.insert %[[RV6:.+]], %[[RESULT_VEC_6]] [6] : f32 into vector<8xf32>
-// CHECK: %[[V7:.+]] = vector.extract %[[TRANSPOSED_INPUT]][1, 3]
-// CHECK: %[[ACC7:.+]] = vector.extract %[[ACC]][1, 3] : f32 from vector<2x4xf32>
-// CHECK: %[[RV7:.+]] = vector.reduction <mul>, %[[V7]], %[[ACC7]] : vector<3xf32> into f32
-// CHECK: %[[RESULT_VEC:.+]] = vector.insert %[[RV7:.+]], %[[RESULT_VEC_7]] [7] : f32 into vector<8xf32>
-// CHECK: %[[RESHAPED_VEC:.+]] = vector.shape_cast %[[RESULT_VEC]] : vector<8xf32> to vector<2x4xf32>
-// CHECK: return %[[RESHAPED_VEC]]
-
// Patterns applied:
// * TwoDimMultiReductionToReduction from populateVectorMultiReductionUnrollingPatterns
func.func @vectorize_dynamic_reduction(%arg0: tensor<?x?xf32>, %arg1: tensor<?xf32>) -> tensor<?xf32> {
@@ -247,19 +184,6 @@ func.func @vectorize_dynamic_transpose_reduction(%arg0: tensor<?x?x?xf32>, %arg1
// CHECK: %[[VAL_159:.*]] = vector.mask %[[VAL_158]] { vector.reduction <add>
// CHECK: %[[VAL_160:.*]] = vector.insert %[[VAL_159]]
-// Patterns applied:
-// * InnerOuterDimReductionConversion from populateVectorMultiReductionTransformationPatterns
-// * ReduceMultiDimReductionRank from populateVectorMultiReductionFlatteningPatterns
-// * TwoDimMultiReductionToReduction from populateVectorMultiReductionUnrollingPatterns
-func.func @vector_multi_reduction_parallel_middle(%arg0: vector<3x4x5xf32>, %acc: vector<4xf32>) -> vector<4xf32> {
- %0 = vector.multi_reduction <add>, %arg0, %acc [0, 2] : vector<3x4x5xf32> to vector<4xf32>
- return %0 : vector<4xf32>
-}
-
-// CHECK-LABEL: func @vector_multi_reduction_parallel_middle
-// CHECK-SAME: %[[INPUT:.+]]: vector<3x4x5xf32>, %[[ACC:.+]]: vector<4xf32>
-// CHECK: vector.transpose %[[INPUT]], [1, 0, 2] : vector<3x4x5xf32> to vector<4x3x5xf32>
-
// Patterns applied:
// * ReduceMultiDimReductionRank from populateVectorMultiReductionFlatteningPatterns
// * TwoDimMultiReductionToReduction from populateVectorMultiReductionUnrollingPatterns
More information about the Mlir-commits
mailing list