[Mlir-commits] [mlir] [mlir][vector] Tidy-up testing for to/from_elements unrolling (PR #158309)
llvmlistbot at llvm.org
llvmlistbot at llvm.org
Fri Sep 12 08:00:17 PDT 2025
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-mlir-vector
Author: Andrzej WarzyĆski (banach-space)
<details>
<summary>Changes</summary>
1. Remove `TestUnrollVectorToElements` and
`TestUnrollVectorFromElements` test passes - these are not required.
2. Make "vector-from-elements-lowering.mlir" use TD Op for testing (for
consistency "vector-to-elements-lowering.mlir" and to make sure that
the TD Op, `transform.apply_patterns.vector.unroll_from_elements`, is
tested).
3. Unify `CHECK` prefixes (`CHECK-UNROLL` -> `CHECK`).
4. Rename `@<!-- -->to_elements_1d` as `@<!-- -->negative_unroll_to_elements_1d`, for
consistency with it's counterpart for `vector.from_elements` and to
align with our testing guide (*).
(*) https://mlir.llvm.org/getting_started/TestingGuide/#after-step-3-add-the-newly-identified-missing-case
---
Full diff: https://github.com/llvm/llvm-project/pull/158309.diff
5 Files Affected:
- (modified) mlir/test/Dialect/Vector/td/unroll-elements.mlir (+6-3)
- (modified) mlir/test/Dialect/Vector/td/xfer-drop-unit-dims.mlir (+1)
- (modified) mlir/test/Dialect/Vector/vector-from-elements-lowering.mlir (+25-24)
- (modified) mlir/test/Dialect/Vector/vector-to-elements-lowering.mlir (+10-5)
- (modified) mlir/test/lib/Dialect/Vector/TestVectorTransforms.cpp (-48)
``````````diff
diff --git a/mlir/test/Dialect/Vector/td/unroll-elements.mlir b/mlir/test/Dialect/Vector/td/unroll-elements.mlir
index 40a90a33b0ac4..f7c69b503a561 100644
--- a/mlir/test/Dialect/Vector/td/unroll-elements.mlir
+++ b/mlir/test/Dialect/Vector/td/unroll-elements.mlir
@@ -1,11 +1,14 @@
module attributes {transform.with_named_sequence} {
transform.named_sequence @unroll_to_elements(%module_op: !transform.any_op {transform.readonly}) {
- %f = transform.structured.match ops{["func.func"]} in %module_op
+
+ %func_op = transform.structured.match ops{["func.func"]} in %module_op
: (!transform.any_op) -> !transform.any_op
- transform.apply_patterns to %f {
- transform.apply_patterns.vector.transfer_permutation_patterns
+ transform.apply_patterns to %func_op {
+ // Test patterns
transform.apply_patterns.vector.unroll_to_elements
+ transform.apply_patterns.vector.unroll_from_elements
} : !transform.any_op
+
transform.yield
}
}
diff --git a/mlir/test/Dialect/Vector/td/xfer-drop-unit-dims.mlir b/mlir/test/Dialect/Vector/td/xfer-drop-unit-dims.mlir
index 5bffa20842b0c..44a823801d1cd 100644
--- a/mlir/test/Dialect/Vector/td/xfer-drop-unit-dims.mlir
+++ b/mlir/test/Dialect/Vector/td/xfer-drop-unit-dims.mlir
@@ -3,6 +3,7 @@ module @transforms attributes { transform.with_named_sequence } {
%func_op = transform.structured.match ops{["func.func"]} in %module : (!transform.any_op) -> !transform.op<"func.func">
transform.apply_patterns to %func_op {
+ // Test patterns
transform.apply_patterns.vector.drop_inner_most_unit_dims_from_xfer_ops
} : !transform.op<"func.func">
diff --git a/mlir/test/Dialect/Vector/vector-from-elements-lowering.mlir b/mlir/test/Dialect/Vector/vector-from-elements-lowering.mlir
index 8fac608ed5692..0d1bc662d09a0 100644
--- a/mlir/test/Dialect/Vector/vector-from-elements-lowering.mlir
+++ b/mlir/test/Dialect/Vector/vector-from-elements-lowering.mlir
@@ -1,33 +1,34 @@
-// RUN: mlir-opt %s -test-unroll-vector-from-elements | FileCheck %s --check-prefix=CHECK-UNROLL
+// RUN: mlir-opt %s -transform-preload-library='transform-library-paths=%p/td/unroll-elements.mlir' \
+// RUN: -transform-interpreter=entry-point=unroll_to_elements | FileCheck %s
//===----------------------------------------------------------------------===//
// Test UnrollFromElements.
//===----------------------------------------------------------------------===//
-// CHECK-UNROLL-LABEL: @unroll_from_elements_2d
-// CHECK-UNROLL-SAME: (%[[ARG0:.*]]: f32, %[[ARG1:.*]]: f32, %[[ARG2:.*]]: f32, %[[ARG3:.*]]: f32)
-// CHECK-UNROLL-NEXT: %[[UNDEF_RES:.*]] = ub.poison : vector<2x2xf32>
-// CHECK-UNROLL-NEXT: %[[VEC_0:.*]] = vector.from_elements %[[ARG0]], %[[ARG1]] : vector<2xf32>
-// CHECK-UNROLL-NEXT: %[[RES_0:.*]] = vector.insert %[[VEC_0]], %[[UNDEF_RES]] [0] : vector<2xf32> into vector<2x2xf32>
-// CHECK-UNROLL-NEXT: %[[VEC_1:.*]] = vector.from_elements %[[ARG2]], %[[ARG3]] : vector<2xf32>
-// CHECK-UNROLL-NEXT: %[[RES_1:.*]] = vector.insert %[[VEC_1]], %[[RES_0]] [1] : vector<2xf32> into vector<2x2xf32>
-// CHECK-UNROLL-NEXT: return %[[RES_1]] : vector<2x2xf32>
+// CHECK-LABEL: @unroll_from_elements_2d
+// CHECK-SAME: (%[[ARG0:.*]]: f32, %[[ARG1:.*]]: f32, %[[ARG2:.*]]: f32, %[[ARG3:.*]]: f32)
+// CHECK-NEXT: %[[UNDEF_RES:.*]] = ub.poison : vector<2x2xf32>
+// CHECK-NEXT: %[[VEC_0:.*]] = vector.from_elements %[[ARG0]], %[[ARG1]] : vector<2xf32>
+// CHECK-NEXT: %[[RES_0:.*]] = vector.insert %[[VEC_0]], %[[UNDEF_RES]] [0] : vector<2xf32> into vector<2x2xf32>
+// CHECK-NEXT: %[[VEC_1:.*]] = vector.from_elements %[[ARG2]], %[[ARG3]] : vector<2xf32>
+// CHECK-NEXT: %[[RES_1:.*]] = vector.insert %[[VEC_1]], %[[RES_0]] [1] : vector<2xf32> into vector<2x2xf32>
+// CHECK-NEXT: return %[[RES_1]] : vector<2x2xf32>
func.func @unroll_from_elements_2d(%arg0: f32, %arg1: f32, %arg2: f32, %arg3: f32) -> vector<2x2xf32> {
%0 = vector.from_elements %arg0, %arg1, %arg2, %arg3 : vector<2x2xf32>
return %0 : vector<2x2xf32>
}
-// CHECK-UNROLL-LABEL: @unroll_from_elements_3d
-// CHECK-UNROLL-SAME: (%[[ARG0:.*]]: f32, %[[ARG1:.*]]: f32, %[[ARG2:.*]]: f32, %[[ARG3:.*]]: f32)
-// CHECK-UNROLL-NEXT: %[[UNDEF_RES:.*]] = ub.poison : vector<2x1x2xf32>
-// CHECK-UNROLL-NEXT: %[[UNDEF_RANK_2:.*]] = ub.poison : vector<1x2xf32>
-// CHECK-UNROLL-NEXT: %[[VEC_0:.*]] = vector.from_elements %[[ARG0]], %[[ARG1]] : vector<2xf32>
-// CHECK-UNROLL-NEXT: %[[RANK_2_0:.*]] = vector.insert %[[VEC_0]], %[[UNDEF_RANK_2]] [0] : vector<2xf32> into vector<1x2xf32>
-// CHECK-UNROLL-NEXT: %[[RES_0:.*]] = vector.insert %[[RANK_2_0]], %[[UNDEF_RES]] [0] : vector<1x2xf32> into vector<2x1x2xf32>
-// CHECK-UNROLL-NEXT: %[[VEC_1:.*]] = vector.from_elements %[[ARG2]], %[[ARG3]] : vector<2xf32>
-// CHECK-UNROLL-NEXT: %[[RANK_2_1:.*]] = vector.insert %[[VEC_1]], %[[UNDEF_RANK_2]] [0] : vector<2xf32> into vector<1x2xf32>
-// CHECK-UNROLL-NEXT: %[[RES_1:.*]] = vector.insert %[[RANK_2_1]], %[[RES_0]] [1] : vector<1x2xf32> into vector<2x1x2xf32>
-// CHECK-UNROLL-NEXT: return %[[RES_1]] : vector<2x1x2xf32>
+// CHECK-LABEL: @unroll_from_elements_3d
+// CHECK-SAME: (%[[ARG0:.*]]: f32, %[[ARG1:.*]]: f32, %[[ARG2:.*]]: f32, %[[ARG3:.*]]: f32)
+// CHECK-NEXT: %[[UNDEF_RES:.*]] = ub.poison : vector<2x1x2xf32>
+// CHECK-NEXT: %[[UNDEF_RANK_2:.*]] = ub.poison : vector<1x2xf32>
+// CHECK-NEXT: %[[VEC_0:.*]] = vector.from_elements %[[ARG0]], %[[ARG1]] : vector<2xf32>
+// CHECK-NEXT: %[[RANK_2_0:.*]] = vector.insert %[[VEC_0]], %[[UNDEF_RANK_2]] [0] : vector<2xf32> into vector<1x2xf32>
+// CHECK-NEXT: %[[RES_0:.*]] = vector.insert %[[RANK_2_0]], %[[UNDEF_RES]] [0] : vector<1x2xf32> into vector<2x1x2xf32>
+// CHECK-NEXT: %[[VEC_1:.*]] = vector.from_elements %[[ARG2]], %[[ARG3]] : vector<2xf32>
+// CHECK-NEXT: %[[RANK_2_1:.*]] = vector.insert %[[VEC_1]], %[[UNDEF_RANK_2]] [0] : vector<2xf32> into vector<1x2xf32>
+// CHECK-NEXT: %[[RES_1:.*]] = vector.insert %[[RANK_2_1]], %[[RES_0]] [1] : vector<1x2xf32> into vector<2x1x2xf32>
+// CHECK-NEXT: return %[[RES_1]] : vector<2x1x2xf32>
func.func @unroll_from_elements_3d(%arg0: f32, %arg1: f32, %arg2: f32, %arg3: f32) -> vector<2x1x2xf32> {
%0 = vector.from_elements %arg0, %arg1, %arg2, %arg3 : vector<2x1x2xf32>
return %0 : vector<2x1x2xf32>
@@ -35,10 +36,10 @@ func.func @unroll_from_elements_3d(%arg0: f32, %arg1: f32, %arg2: f32, %arg3: f3
// 1-D vector.from_elements should not be unrolled.
-// CHECK-UNROLL-LABEL: @negative_unroll_from_elements_1d
-// CHECK-UNROLL-SAME: (%[[ARG0:.*]]: f32, %[[ARG1:.*]]: f32)
-// CHECK-UNROLL-NEXT: %[[RES:.*]] = vector.from_elements %[[ARG0]], %[[ARG1]] : vector<2xf32>
-// CHECK-UNROLL-NEXT: return %[[RES]] : vector<2xf32>
+// CHECK-LABEL: @negative_unroll_from_elements_1d
+// CHECK-SAME: (%[[ARG0:.*]]: f32, %[[ARG1:.*]]: f32)
+// CHECK-NEXT: %[[RES:.*]] = vector.from_elements %[[ARG0]], %[[ARG1]] : vector<2xf32>
+// CHECK-NEXT: return %[[RES]] : vector<2xf32>
func.func @negative_unroll_from_elements_1d(%arg0: f32, %arg1: f32) -> vector<2xf32> {
%0 = vector.from_elements %arg0, %arg1 : vector<2xf32>
return %0 : vector<2xf32>
diff --git a/mlir/test/Dialect/Vector/vector-to-elements-lowering.mlir b/mlir/test/Dialect/Vector/vector-to-elements-lowering.mlir
index 9ec0d76599c41..c521bf0138f98 100644
--- a/mlir/test/Dialect/Vector/vector-to-elements-lowering.mlir
+++ b/mlir/test/Dialect/Vector/vector-to-elements-lowering.mlir
@@ -1,26 +1,31 @@
-// RUN: mlir-opt %s -test-unroll-vector-to-elements -split-input-file | FileCheck %s
// RUN: mlir-opt %s -transform-preload-library='transform-library-paths=%p/td/unroll-elements.mlir' \
// RUN: -transform-interpreter=entry-point=unroll_to_elements | FileCheck %s
-// CHECK-LABEL: func.func @to_elements_1d(
+//===----------------------------------------------------------------------===//
+// Test UnrollToElements.
+//===----------------------------------------------------------------------===//
+
+// 1-D vector.from_elements should not be unrolled.
+
+// CHECK-LABEL: func.func @negative_unroll_to_elements_1d(
// CHECK-SAME: %[[ARG0:.+]]: vector<2xf32>
// CHECK: %[[RES:.+]]:2 = vector.to_elements %[[ARG0]] : vector<2xf32>
// CHECK: return %[[RES]]#0, %[[RES]]#1
-func.func @to_elements_1d(%arg0: vector<2xf32>) -> (f32, f32) {
+func.func @negative_unroll_to_elements_1d(%arg0: vector<2xf32>) -> (f32, f32) {
%0:2 = vector.to_elements %arg0 : vector<2xf32>
return %0#0, %0#1 : f32, f32
}
// -----
-// CHECK-LABEL: func.func @to_elements_2d(
+// CHECK-LABEL: func.func @unroll_to_elements_2d(
// CHECK-SAME: %[[ARG0:.+]]: vector<2x2xf32>
// CHECK: %[[VEC0:.+]] = vector.extract %[[ARG0]][0] : vector<2xf32> from vector<2x2xf32>
// CHECK: %[[VEC1:.+]] = vector.extract %[[ARG0]][1] : vector<2xf32> from vector<2x2xf32>
// CHECK: %[[RES0:.+]]:2 = vector.to_elements %[[VEC0]] : vector<2xf32>
// CHECK: %[[RES1:.+]]:2 = vector.to_elements %[[VEC1]] : vector<2xf32>
// CHECK: return %[[RES0]]#0, %[[RES0]]#1, %[[RES1]]#0, %[[RES1]]#1
-func.func @to_elements_2d(%arg0: vector<2x2xf32>) -> (f32, f32, f32, f32) {
+func.func @unroll_to_elements_2d(%arg0: vector<2x2xf32>) -> (f32, f32, f32, f32) {
%0:4 = vector.to_elements %arg0 : vector<2x2xf32>
return %0#0, %0#1, %0#2, %0#3 : f32, f32, f32, f32
}
diff --git a/mlir/test/lib/Dialect/Vector/TestVectorTransforms.cpp b/mlir/test/lib/Dialect/Vector/TestVectorTransforms.cpp
index c2d184626818f..3360f3b70a817 100644
--- a/mlir/test/lib/Dialect/Vector/TestVectorTransforms.cpp
+++ b/mlir/test/lib/Dialect/Vector/TestVectorTransforms.cpp
@@ -756,50 +756,6 @@ struct TestVectorGatherLowering
}
};
-struct TestUnrollVectorFromElements
- : public PassWrapper<TestUnrollVectorFromElements,
- OperationPass<func::FuncOp>> {
- MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(TestUnrollVectorFromElements)
-
- StringRef getArgument() const final {
- return "test-unroll-vector-from-elements";
- }
- StringRef getDescription() const final {
- return "Test unrolling patterns for from_elements ops";
- }
- void getDependentDialects(DialectRegistry ®istry) const override {
- registry.insert<func::FuncDialect, vector::VectorDialect, ub::UBDialect>();
- }
-
- void runOnOperation() override {
- RewritePatternSet patterns(&getContext());
- populateVectorFromElementsLoweringPatterns(patterns);
- (void)applyPatternsGreedily(getOperation(), std::move(patterns));
- }
-};
-
-struct TestUnrollVectorToElements
- : public PassWrapper<TestUnrollVectorToElements,
- OperationPass<func::FuncOp>> {
- MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(TestUnrollVectorToElements)
-
- StringRef getArgument() const final {
- return "test-unroll-vector-to-elements";
- }
- StringRef getDescription() const final {
- return "Test unrolling patterns for to_elements ops";
- }
- void getDependentDialects(DialectRegistry ®istry) const override {
- registry.insert<func::FuncDialect, vector::VectorDialect>();
- }
-
- void runOnOperation() override {
- RewritePatternSet patterns(&getContext());
- populateVectorToElementsLoweringPatterns(patterns);
- (void)applyPatternsGreedily(getOperation(), std::move(patterns));
- }
-};
-
struct TestFoldArithExtensionIntoVectorContractPatterns
: public PassWrapper<TestFoldArithExtensionIntoVectorContractPatterns,
OperationPass<func::FuncOp>> {
@@ -1071,10 +1027,6 @@ void registerTestVectorLowerings() {
PassRegistration<TestVectorGatherLowering>();
- PassRegistration<TestUnrollVectorFromElements>();
-
- PassRegistration<TestUnrollVectorToElements>();
-
PassRegistration<TestFoldArithExtensionIntoVectorContractPatterns>();
PassRegistration<TestVectorEmulateMaskedLoadStore>();
``````````
</details>
https://github.com/llvm/llvm-project/pull/158309
More information about the Mlir-commits
mailing list