[Mlir-commits] [mlir] [mlir][affine] Fix SuperVectorizer crash on uniforms from multi-result ops (PR #234531)

Mattéo Rizza Murgier llvmlistbot at llvm.org
Thu Oct 22 02:48:03 PDT 2026


https://github.com/matteo-rm updated https://github.com/llvm/llvm-project/pull/234531

>From 7e809b06e9afd1f12bfff345db2952a3173c8f1c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Matt=C3=A9o=20Rizza=20Murgier?=
 <matteo.rizza-murgier at sipearl.com>
Date: Wed, 21 Oct 2026 20:56:10 +0200
Subject: [PATCH 1/2] [mlir][affine] Fix SuperVectorizer crash on uniforms from
 multi-result ops

---
 .../Affine/Transforms/SuperVectorize.cpp        |  8 +++-----
 .../SuperVectorize/uniform_divergent.mlir       | 17 +++++++++++++++++
 2 files changed, 20 insertions(+), 5 deletions(-)

diff --git a/mlir/lib/Dialect/Affine/Transforms/SuperVectorize.cpp b/mlir/lib/Dialect/Affine/Transforms/SuperVectorize.cpp
index 0bb344b0484f06..8fd78fe711fc2d 100644
--- a/mlir/lib/Dialect/Affine/Transforms/SuperVectorize.cpp
+++ b/mlir/lib/Dialect/Affine/Transforms/SuperVectorize.cpp
@@ -808,16 +808,14 @@ void VectorizationState::registerOpVectorReplacement(Operation *replaced,
 /// scalar version still exists after vectorization), like uniforms.
 ///
 /// Example:
-///   * 'replaced': block argument or operation outside of the vectorized loop.
+///   * 'replaced': block argument or operation result defined outside of the
+//       vectorized loop.
 ///   * 'replacement': %0 = vector.broadcast %1 : f32 to vector<128xf32>
 void VectorizationState::registerValueVectorReplacement(
     Value replaced, Operation *replacement) {
   assert(replacement->getNumResults() == 1 &&
          "Expected single-result replacement");
-  if (Operation *defOp = replaced.getDefiningOp())
-    registerOpVectorReplacement(defOp, replacement);
-  else
-    registerValueVectorReplacementImpl(replaced, replacement->getResult(0));
+  registerValueVectorReplacementImpl(replaced, replacement->getResult(0));
 }
 
 /// Registers the vector replacement of a block argument (e.g., iter_args).
diff --git a/mlir/test/Dialect/Affine/SuperVectorize/uniform_divergent.mlir b/mlir/test/Dialect/Affine/SuperVectorize/uniform_divergent.mlir
index 545f2d08134846..d9f7d20372a116 100644
--- a/mlir/test/Dialect/Affine/SuperVectorize/uniform_divergent.mlir
+++ b/mlir/test/Dialect/Affine/SuperVectorize/uniform_divergent.mlir
@@ -58,3 +58,20 @@ func.func @uniform_load(%A : memref<?x?xf32>, %C : memref<?x?xf32>) {
 // CHECK-NEXT:   %[[bcast:.*]] = vector.broadcast %[[uniform_ld]] : f32 to vector<128xf32>
 // CHECK-NEXT:   affine.for
 // CHECK:          arith.addf %[[bcast]], %{{.*}} : vector<128xf32>
+
+// -----
+
+// CHECK-LABEL: @uniform_multi_result
+func.func @uniform_multi_result(%in : memref<512xi32>, %a : i32, %b : i32) {
+  %sum, %overflow = arith.addui_extended %a, %b : i32, i1
+  affine.for %i = 0 to 512 {
+    %ld = affine.load %in[%i] : memref<512xi32>
+    %add = arith.addi %ld, %sum : i32
+  }
+  return
+}
+
+// CHECK:      %[[sum:.*]], %{{.*}} = arith.addui_extended
+// CHECK-NEXT: %[[bcast:.*]] = vector.broadcast %[[sum]] : i32 to vector<128xi32>
+// CHECK-NEXT: affine.for
+// CHECK:        arith.addi %{{.*}}, %[[bcast]] : vector<128xi32>

>From 48bd1cced85267ec6caecafe258a51ce05807ddc Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Matt=C3=A9o=20Rizza=20Murgier?=
 <matteo.rizza-murgier at sipearl.com>
Date: Thu, 22 Oct 2026 11:44:27 +0200
Subject: [PATCH 2/2] Fix doc comment

---
 mlir/lib/Dialect/Affine/Transforms/SuperVectorize.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/mlir/lib/Dialect/Affine/Transforms/SuperVectorize.cpp b/mlir/lib/Dialect/Affine/Transforms/SuperVectorize.cpp
index 8fd78fe711fc2d..e2c0a3c6ab4fa9 100644
--- a/mlir/lib/Dialect/Affine/Transforms/SuperVectorize.cpp
+++ b/mlir/lib/Dialect/Affine/Transforms/SuperVectorize.cpp
@@ -809,7 +809,7 @@ void VectorizationState::registerOpVectorReplacement(Operation *replaced,
 ///
 /// Example:
 ///   * 'replaced': block argument or operation result defined outside of the
-//       vectorized loop.
+///     vectorized loop.
 ///   * 'replacement': %0 = vector.broadcast %1 : f32 to vector<128xf32>
 void VectorizationState::registerValueVectorReplacement(
     Value replaced, Operation *replacement) {



More information about the Mlir-commits mailing list