[Mlir-commits] [mlir] [mlir][linalg] Fix idx comparison in the vectorizer (PR #112900)
Andrzej WarzyĆski
llvmlistbot at llvm.org
Fri Oct 18 06:01:51 PDT 2024
https://github.com/banach-space updated https://github.com/llvm/llvm-project/pull/112900
>From f6794f5fa1ee3fba019dab799d0a57a6b1d1bb0e Mon Sep 17 00:00:00 2001
From: Andrzej Warzynski <andrzej.warzynski at arm.com>
Date: Fri, 18 Oct 2024 13:52:40 +0100
Subject: [PATCH] [mlir][linalg] Fix idx comparison in the vectorizer
Fixes loop comparison condition in the vectorizer.
As that logic is used specifically for vectorising `tensor.extract`, I
also added a test that violates the assumptions made inside
`getTrailingNonUnitLoopDimIdx`, namely that Linalg loops are non-empty.
Vectorizer pre-conditions will capture that much earlier making sure
that `getTrailingNonUnitLoopDimIdx` is only run when all the assumptions
are actually met.
Thank you for pointing this out, @pfusik !
---
.../Linalg/Transforms/Vectorization.cpp | 3 ++-
.../Linalg/vectorize-tensor-extract.mlir | 27 +++++++++++++++++++
2 files changed, 29 insertions(+), 1 deletion(-)
diff --git a/mlir/lib/Dialect/Linalg/Transforms/Vectorization.cpp b/mlir/lib/Dialect/Linalg/Transforms/Vectorization.cpp
index d39c5fcdbc4286..e1b97fbf985df8 100644
--- a/mlir/lib/Dialect/Linalg/Transforms/Vectorization.cpp
+++ b/mlir/lib/Dialect/Linalg/Transforms/Vectorization.cpp
@@ -863,9 +863,10 @@ static uint64_t getTrailingNonUnitLoopDimIdx(LinalgOp linalgOp) {
llvm::count_if(loopRanges, [](int64_t dim) { return dim != 1; }) == 1) &&
"For statically shaped Linalg Ops, only one "
"non-unit loop dim is expected");
+ assert(loopRanges.size() != 0 && "Empty loops, nothing to analyse.");
size_t idx = loopRanges.size() - 1;
- for (; idx >= 0; idx--)
+ for (; idx != 0; idx--)
if (loopRanges[idx] != 1)
break;
diff --git a/mlir/test/Dialect/Linalg/vectorize-tensor-extract.mlir b/mlir/test/Dialect/Linalg/vectorize-tensor-extract.mlir
index 2c56b7139fec49..3560ab2312a2e9 100644
--- a/mlir/test/Dialect/Linalg/vectorize-tensor-extract.mlir
+++ b/mlir/test/Dialect/Linalg/vectorize-tensor-extract.mlir
@@ -36,6 +36,33 @@ module attributes {transform.with_named_sequence} {
}
}
+// -----
+
+#map = affine_map<() -> ()>
+func.func @negative_no_loops(%arg0: tensor<f32>, %arg1: tensor<f32>) -> tensor<f32> {
+ %1 = linalg.generic {
+ indexing_maps = [#map],
+ iterator_types = []
+ } outs(%arg1 : tensor<f32>) {
+ ^bb0(%arg4: f32):
+ %2 = tensor.extract %arg0[] : tensor<f32>
+ linalg.yield %2 : f32
+ } -> tensor<f32>
+ return %1 : tensor<f32>
+}
+// CHECK-LABEL: func.func @negative_no_loops
+// CHECK: tensor.extract
+
+module attributes {transform.with_named_sequence} {
+ transform.named_sequence @__transform_main(%arg1: !transform.any_op {transform.readonly}) {
+ %0 = transform.structured.match ops{["linalg.generic"]} in %arg1 : (!transform.any_op) -> !transform.any_op
+ %1 = transform.get_parent_op %0 {isolated_from_above} : (!transform.any_op) -> !transform.any_op
+ %2 = transform.structured.vectorize_children_and_apply_patterns %1 : (!transform.any_op) -> !transform.any_op
+ transform.yield
+ }
+}
+
+
// -----
#map = affine_map<(d0, d1, d2) -> (d0, d1, d2)>
More information about the Mlir-commits
mailing list