[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