[Mlir-commits] [mlir] Fix llvm-mlir-use-after-erase findings (PR #210733)

llvmlistbot at llvm.org llvmlistbot at llvm.org
Mon Jul 20 07:34:38 PDT 2026


https://github.com/Harald-R created https://github.com/llvm/llvm-project/pull/210733

Fix the following warnings identified by the `llvm-mlir-use-after-erase` check from https://github.com/llvm/llvm-project/pull/210727:

```cpp
mlir/lib/Transforms/Utils/DialectConversion.cpp:2700:33: warning: operation 'op' is used after it was erased [llvm-mlir-use-after-erase]
 2700 |           curState, std::string(op->getName().getStringRef()) + " folder");
      |                                 ^
mlir/lib/Transforms/Utils/DialectConversion.cpp:2685:12: note: operation erased here
 2685 |   rewriter.replaceOp(op, replacementValues);
      |            ^
mlir/lib/Bytecode/Reader/BytecodeReader.cpp:1654:32: warning: operation 'op' is used after it was erased [llvm-mlir-use-after-erase]
 1654 |       lazyLoadableOpsMap.erase(op);
      |                                ^
mlir/lib/Bytecode/Reader/BytecodeReader.cpp:1652:11: note: operation erased here
 1652 |       op->erase();
      |           ^
mlir/lib/Dialect/MemRef/Transforms/NormalizeMemRefs.cpp:313:32: warning: operation 'newCallOp' is used after it was erased [llvm-mlir-use-after-erase]
  313 |     userOp->replaceAllUsesWith(newCallOp);
      |                                ^
mlir/lib/Dialect/MemRef/Transforms/NormalizeMemRefs.cpp:304:20: note: operation erased here 
  304 |         newCallOp->erase();
      |                    ^
mlir/lib/Dialect/MemRef/Transforms/NormalizeMemRefs.cpp:313:32: note: the use happens in a later loop iteration than the erase
  313 |     userOp->replaceAllUsesWith(newCallOp);
      |                                ^
mlir/lib/Dialect/MemRef/Transforms/NormalizeMemRefs.cpp:440:29: warning: operation 'newOp' is used after it was erased [llvm-mlir-use-after-erase]
  440 |           Value newMemRef = newOp->getResult(resIndex);
      |                             ^
mlir/lib/Dialect/MemRef/Transforms/NormalizeMemRefs.cpp:459:20: note: operation erased here 
  459 |             newOp->erase();
      |                    ^
mlir/lib/Dialect/MemRef/Transforms/NormalizeMemRefs.cpp:440:29: note: the use happens in a later loop iteration than the erase
  440 |           Value newMemRef = newOp->getResult(resIndex);
      |                             ^
```

The warning reported at `NormalizeMemRefs.cpp:313` is technically a false-positive, as the `replacingMemRefUsesFailed` flag is aligned with the lifetime of `newCallOp`. The other similar warning in the file, at `NormalizeMemRefs.cpp:440`, is however a true-positive, as the iteration continues to the next element in the loop after erasure instead of breaking the loop's execution; the erased operation could be accessed in this case. To avoid this potential issue, the operation is erased after the loop ends for both cases, if the flag is active.

>From e8b885a450c566cd9df23cd2e50b26ab50b7ce8f Mon Sep 17 00:00:00 2001
From: Harald-R <rotuna.razvan at gmail.com>
Date: Mon, 20 Jul 2026 12:52:09 +0300
Subject: [PATCH] Fix llvm-mlir-use-after-erase findings

---
 mlir/lib/Bytecode/Reader/BytecodeReader.cpp   |  4 ++--
 .../MemRef/Transforms/NormalizeMemRefs.cpp    | 20 ++++++++++---------
 .../Transforms/Utils/DialectConversion.cpp    |  3 +--
 3 files changed, 14 insertions(+), 13 deletions(-)

diff --git a/mlir/lib/Bytecode/Reader/BytecodeReader.cpp b/mlir/lib/Bytecode/Reader/BytecodeReader.cpp
index 96ead28d0aa40..5c54738dbed96 100644
--- a/mlir/lib/Bytecode/Reader/BytecodeReader.cpp
+++ b/mlir/lib/Bytecode/Reader/BytecodeReader.cpp
@@ -1648,10 +1648,10 @@ class mlir::BytecodeReader::Impl {
           return failure();
         continue;
       }
-      op->dropAllReferences();
-      op->erase();
       lazyLoadableOps.pop_front();
       lazyLoadableOpsMap.erase(op);
+      op->dropAllReferences();
+      op->erase();
     }
     return success();
   }
diff --git a/mlir/lib/Dialect/MemRef/Transforms/NormalizeMemRefs.cpp b/mlir/lib/Dialect/MemRef/Transforms/NormalizeMemRefs.cpp
index fa7991e6c6a80..23591dd045f78 100644
--- a/mlir/lib/Dialect/MemRef/Transforms/NormalizeMemRefs.cpp
+++ b/mlir/lib/Dialect/MemRef/Transforms/NormalizeMemRefs.cpp
@@ -301,14 +301,15 @@ void NormalizeMemRefs::updateFunctionSignature(func::FuncOp funcOp,
         // If it failed (due to escapes for example), bail out.
         // It should never hit this part of the code because it is called by
         // only those functions which are normalizable.
-        newCallOp->erase();
         replacingMemRefUsesFailed = true;
         break;
       }
       returnTypeChanged = true;
     }
-    if (replacingMemRefUsesFailed)
+    if (replacingMemRefUsesFailed) {
+      newCallOp->erase();
       continue;
+    }
     // Replace all uses for other non-memref result types.
     userOp->replaceAllUsesWith(newCallOp);
     userOp->erase();
@@ -456,17 +457,18 @@ void NormalizeMemRefs::normalizeFuncOpMemRefs(func::FuncOp funcOp,
                                               /*userFilterFn=*/nullptr,
                                               /*allowNonDereferencingOps=*/true,
                                               /*replaceInDeallocOp=*/true))) {
-            newOp->erase();
             replacingMemRefUsesFailed = true;
-            continue;
+            break;
           }
         }
-        if (!replacingMemRefUsesFailed) {
-          // Replace other ops with new op and delete the old op when the
-          // replacement succeeded.
-          op->replaceAllUsesWith(newOp);
-          op->erase();
+        if (replacingMemRefUsesFailed) {
+          newOp->erase();
+          return;
         }
+        // Replace other ops with new op and delete the old op when the
+        // replacement succeeded.
+        op->replaceAllUsesWith(newOp);
+        op->erase();
       }
     }
   });
diff --git a/mlir/lib/Transforms/Utils/DialectConversion.cpp b/mlir/lib/Transforms/Utils/DialectConversion.cpp
index c76e3808d3b37..c8db49c226e43 100644
--- a/mlir/lib/Transforms/Utils/DialectConversion.cpp
+++ b/mlir/lib/Transforms/Utils/DialectConversion.cpp
@@ -2696,8 +2696,7 @@ LogicalResult OperationLegalizer::legalizeWithFold(Operation *op) {
             "op '" + opName +
             "' folder rollback of IR modifications requested");
       }
-      rewriterImpl.resetState(
-          curState, std::string(op->getName().getStringRef()) + " folder");
+      rewriterImpl.resetState(curState, std::string(opName) + " folder");
       return failure();
     }
   }



More information about the Mlir-commits mailing list