[Mlir-commits] [mlir] [MLIR] Fix use-after-scope when interchanging ploops (PR #196076)

Benjamin Kramer llvmlistbot at llvm.org
Wed May 6 06:49:41 PDT 2026


https://github.com/d0k created https://github.com/llvm/llvm-project/pull/196076

getInductionVars returns a SmallVector, so going through zip+reverse gets us a dangling reference. Quite a footgun.

Found by asan.

>From b6671731a7c1b729570661cf89d61f2d5301c47b Mon Sep 17 00:00:00 2001
From: Benjamin Kramer <benny.kra at googlemail.com>
Date: Wed, 6 May 2026 15:47:07 +0200
Subject: [PATCH] [MLIR] Fix use-after-scope when interchanging ploops

getInductionVars returns a SmallVector, so going through zip+reverse
gets us a dangling reference. Quite a footgun.

Found by asan.
---
 mlir/lib/Dialect/SCF/Transforms/ParallelLoopFusion.cpp | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/mlir/lib/Dialect/SCF/Transforms/ParallelLoopFusion.cpp b/mlir/lib/Dialect/SCF/Transforms/ParallelLoopFusion.cpp
index cbbe45a00163f..bdaade59e99df 100644
--- a/mlir/lib/Dialect/SCF/Transforms/ParallelLoopFusion.cpp
+++ b/mlir/lib/Dialect/SCF/Transforms/ParallelLoopFusion.cpp
@@ -748,8 +748,9 @@ static std::optional<ParallelOp> interchangeLoops(OpBuilder &builder,
                                   loop.getUpperBound(), loop.getStep(),
                                   loop.getInitVals(), nullptr);
   IRMapping mapping;
-  for (auto [iv, riv] : llvm::zip(loop.getInductionVars(),
-                                  llvm::reverse(newOp.getInductionVars()))) {
+  auto ivs = loop.getInductionVars();
+  auto newIvs = newOp.getInductionVars();
+  for (auto [iv, riv] : llvm::zip(ivs, llvm::reverse(newIvs))) {
     mapping.map(iv, riv);
   }
   // Copy parallel loop body



More information about the Mlir-commits mailing list