[Mlir-commits] [mlir] [mlir][vector] handle empty permutation in transpose (PR #231940)

llvmlistbot at llvm.org llvmlistbot at llvm.org
Wed Oct 14 17:48:58 PDT 2026


https://github.com/StarOne01 updated https://github.com/llvm/llvm-project/pull/231940

>From 783bd28db715a6c44806a6eb9478efa6256eba20 Mon Sep 17 00:00:00 2001
From: Prashanth <ping at starone01.me>
Date: Wed, 14 Oct 2026 19:24:12 +0530
Subject: [PATCH 1/4] [mlir][vector] Handle empty permutation in
 ExtractFromInsertTransposeChainState

---
 mlir/lib/Dialect/Vector/IR/VectorOps.cpp | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/mlir/lib/Dialect/Vector/IR/VectorOps.cpp b/mlir/lib/Dialect/Vector/IR/VectorOps.cpp
index 72bab1a37c5008..f917cd211a0ee2 100644
--- a/mlir/lib/Dialect/Vector/IR/VectorOps.cpp
+++ b/mlir/lib/Dialect/Vector/IR/VectorOps.cpp
@@ -1651,6 +1651,10 @@ LogicalResult ExtractFromInsertTransposeChainState::handleTransposeOp() {
 
   if (!nextTransposeOp)
     return failure();
+
+  if (nextTransposeOp.getPermutation().empty())
+    return success();
+  
   AffineMap m = inversePermutation(AffineMap::getPermutationMap(
       nextTransposeOp.getPermutation(), extractOp.getContext()));
   extractPosition = applyPermutationMap(m, ArrayRef(extractPosition));

>From 1b15be8aa19b1ae9084d799032e0f55f74296c0c Mon Sep 17 00:00:00 2001
From: Prashanth <ping at starone01.me>
Date: Wed, 14 Oct 2026 19:49:08 +0530
Subject: [PATCH 2/4] [mlir][vector] format the c++ change and add test for
 extracting from 0D transpose

---
 mlir/lib/Dialect/Vector/IR/VectorOps.cpp      |  2 +-
 .../Vector/vector-transpose-lowering.mlir     | 22 +++++++++++++++++++
 2 files changed, 23 insertions(+), 1 deletion(-)

diff --git a/mlir/lib/Dialect/Vector/IR/VectorOps.cpp b/mlir/lib/Dialect/Vector/IR/VectorOps.cpp
index f917cd211a0ee2..3aafeb0a570ce7 100644
--- a/mlir/lib/Dialect/Vector/IR/VectorOps.cpp
+++ b/mlir/lib/Dialect/Vector/IR/VectorOps.cpp
@@ -1654,7 +1654,7 @@ LogicalResult ExtractFromInsertTransposeChainState::handleTransposeOp() {
 
   if (nextTransposeOp.getPermutation().empty())
     return success();
-  
+
   AffineMap m = inversePermutation(AffineMap::getPermutationMap(
       nextTransposeOp.getPermutation(), extractOp.getContext()));
   extractPosition = applyPermutationMap(m, ArrayRef(extractPosition));
diff --git a/mlir/test/Dialect/Vector/vector-transpose-lowering.mlir b/mlir/test/Dialect/Vector/vector-transpose-lowering.mlir
index 7838aad1825bc2..cb6a187ecef8b0 100644
--- a/mlir/test/Dialect/Vector/vector-transpose-lowering.mlir
+++ b/mlir/test/Dialect/Vector/vector-transpose-lowering.mlir
@@ -365,3 +365,25 @@ module attributes {transform.with_named_sequence} {
     transform.yield
   }
 }
+
+// -----
+
+// CHECK-LABEL: func.func @extract_transpose_0d
+// CHECK-SAME: (%[[ARG:.*]]: vector<f32>) -> f32
+func.func @extract_transpose_0d(%arg: vector<f32>) -> f32 {
+  %t = vector.transpose %arg, [] : vector<f32> to vector<f32>
+  %x = vector.extract %t[] : f32 from vector<f32>
+  // CHECK: %[[RES:.*]] = vector.extract %[[ARG]]
+  // CHECK: return %[[RES]] : f32
+  return %x : f32
+}
+
+module attributes {transform.with_named_sequence} {
+  transform.named_sequence @__transform_main(%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_transpose lowering_strategy = "eltwise"
+    } : !transform.op<"func.func">
+    transform.yield
+  }
+}

>From 0ea364ae1e65a1915b91e9f0fd978fa14e4e68bd Mon Sep 17 00:00:00 2001
From: Prashanth <ping at starone01.me>
Date: Wed, 14 Oct 2026 20:18:30 +0530
Subject: [PATCH 3/4] [mlir][vector] move the new test and remove unused
 transform named sequence for transpose lowering

---
 .../Dialect/Vector/vector-transpose-lowering.mlir  | 14 +-------------
 1 file changed, 1 insertion(+), 13 deletions(-)

diff --git a/mlir/test/Dialect/Vector/vector-transpose-lowering.mlir b/mlir/test/Dialect/Vector/vector-transpose-lowering.mlir
index cb6a187ecef8b0..2d91bb0c8ab928 100644
--- a/mlir/test/Dialect/Vector/vector-transpose-lowering.mlir
+++ b/mlir/test/Dialect/Vector/vector-transpose-lowering.mlir
@@ -356,18 +356,6 @@ func.func @transpose10_4x1xf32_scalable(%arg0: vector<4x[1]xf32>) -> vector<[1]x
   return %0 : vector<[1]x4xf32>
 }
 
-module attributes {transform.with_named_sequence} {
-  transform.named_sequence @__transform_main(%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_transpose
-    } : !transform.op<"func.func">
-    transform.yield
-  }
-}
-
-// -----
-
 // CHECK-LABEL: func.func @extract_transpose_0d
 // CHECK-SAME: (%[[ARG:.*]]: vector<f32>) -> f32
 func.func @extract_transpose_0d(%arg: vector<f32>) -> f32 {
@@ -382,7 +370,7 @@ module attributes {transform.with_named_sequence} {
   transform.named_sequence @__transform_main(%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_transpose lowering_strategy = "eltwise"
+      transform.apply_patterns.vector.lower_transpose
     } : !transform.op<"func.func">
     transform.yield
   }

>From 99a752390d90dc7e2fd33d342e79f77c305c244b Mon Sep 17 00:00:00 2001
From: Prashanth <ping at starone01.me>
Date: Thu, 15 Oct 2026 06:18:31 +0530
Subject: [PATCH 4/4] [mlir][vector] update CHECK for extract in 0D transpose
 to ensure no transpose is performed and the same type

---
 mlir/test/Dialect/Vector/vector-transpose-lowering.mlir | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/mlir/test/Dialect/Vector/vector-transpose-lowering.mlir b/mlir/test/Dialect/Vector/vector-transpose-lowering.mlir
index 2d91bb0c8ab928..43096b565f2c7b 100644
--- a/mlir/test/Dialect/Vector/vector-transpose-lowering.mlir
+++ b/mlir/test/Dialect/Vector/vector-transpose-lowering.mlir
@@ -361,7 +361,8 @@ func.func @transpose10_4x1xf32_scalable(%arg0: vector<4x[1]xf32>) -> vector<[1]x
 func.func @extract_transpose_0d(%arg: vector<f32>) -> f32 {
   %t = vector.transpose %arg, [] : vector<f32> to vector<f32>
   %x = vector.extract %t[] : f32 from vector<f32>
-  // CHECK: %[[RES:.*]] = vector.extract %[[ARG]]
+  // CHECK: %[[RES:.*]] = vector.extract %[[ARG]][] : f32 from vector<f32>
+  // CHECK-NOT: vector.transpose
   // CHECK: return %[[RES]] : f32
   return %x : f32
 }



More information about the Mlir-commits mailing list