[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 &registry) 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 &registry) 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