[Mlir-commits] [mlir] [mlir][linalg] Fix crash in tileToForallOpImpl when tileUsingSCF returns empty loops (PR #187075)

llvmlistbot at llvm.org llvmlistbot at llvm.org
Tue Mar 17 10:53:48 PDT 2026


https://github.com/edg-l updated https://github.com/llvm/llvm-project/pull/187075

>From 353239c650344df403f6fde0d2eff6d156d39b62 Mon Sep 17 00:00:00 2001
From: Edgar Luque <git at edgl.dev>
Date: Tue, 17 Mar 2026 18:37:36 +0100
Subject: [PATCH] [mlir][linalg] Fix crash in tileToForallOpImpl when
 tileUsingSCF returns empty loops

Return a silenceable error instead of proceeding with an empty loops
vector. Both tileToForallOpImpl (normalizeForallLoopOp) and its caller
TileUsingForallOp::apply access tilingResult.loops.front() without
checking emptiness, causing undefined behavior when tileUsingSCF
produces no loops (e.g. for a rank-0 op with an empty iteration domain).

The garbage pointer propagates into the transform state's reverse
mapping, corrupting it and causing a second crash in
checkAndRecordHandleInvalidation on subsequent transform applications.

Fixes https://github.com/llvm/llvm-project/issues/187073
---
 mlir/lib/Dialect/Linalg/TransformOps/LinalgTransformOps.cpp | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/mlir/lib/Dialect/Linalg/TransformOps/LinalgTransformOps.cpp b/mlir/lib/Dialect/Linalg/TransformOps/LinalgTransformOps.cpp
index d751488d186ad..1670fd163bd77 100644
--- a/mlir/lib/Dialect/Linalg/TransformOps/LinalgTransformOps.cpp
+++ b/mlir/lib/Dialect/Linalg/TransformOps/LinalgTransformOps.cpp
@@ -3888,6 +3888,11 @@ DiagnosedSilenceableFailure transform::tileToForallOpImpl(
 
   tilingResult = *maybeTilingResult;
 
+  if (tilingResult.loops.empty()) {
+    return transformOp.emitSilenceableError()
+           << "tiling did not generate any loops";
+  }
+
   if (mixedNumThreads.empty()) {
     auto generatedForallOp = cast<scf::ForallOp>(tilingResult.loops.front());
     OpBuilder::InsertionGuard g(rewriter);



More information about the Mlir-commits mailing list