[Mlir-commits] [mlir] [mlir][TOSA] Do not access erased op in `MaxPool2dOp` lowering (PR #148374)
Matthias Springer
llvmlistbot at llvm.org
Sat Jul 12 07:01:39 PDT 2025
https://github.com/matthias-springer updated https://github.com/llvm/llvm-project/pull/148374
>From aceb40712a331acb68fe2949e272d41204708a59 Mon Sep 17 00:00:00 2001
From: Matthias Springer <me at m-sp.org>
Date: Sat, 12 Jul 2025 13:59:36 +0000
Subject: [PATCH] [mlir][TOSA] Do not access erased op in `MaxPool2dOp`
lowering
---
.../Conversion/TosaToLinalg/TosaToLinalgNamed.cpp | 12 ++++++------
mlir/lib/Conversion/TosaToTensor/TosaToTensor.cpp | 3 +--
2 files changed, 7 insertions(+), 8 deletions(-)
diff --git a/mlir/lib/Conversion/TosaToLinalg/TosaToLinalgNamed.cpp b/mlir/lib/Conversion/TosaToLinalg/TosaToLinalgNamed.cpp
index c1f40dcbd5ca0..4f62dc13e33b9 100644
--- a/mlir/lib/Conversion/TosaToLinalg/TosaToLinalgNamed.cpp
+++ b/mlir/lib/Conversion/TosaToLinalg/TosaToLinalgNamed.cpp
@@ -808,6 +808,7 @@ class MaxPool2dConverter : public OpConversionPattern<tosa::MaxPool2dOp> {
dilationAttr);
rewriter.setInsertionPointAfter(op);
+ auto nanMode = op.getNanMode();
rewriter.replaceOp(op, resultOp);
// NaN propagation has no meaning for non floating point types.
@@ -821,11 +822,10 @@ class MaxPool2dConverter : public OpConversionPattern<tosa::MaxPool2dOp> {
// we've already produced a named op we will just take its body and modify
// it to include the appropriate checks. If the current value is NaN the
// old value of pool will be taken otherwise we use the result.
- if (const auto nanMode = op.getNanMode(); nanMode == "IGNORE") {
+ if (nanMode == "IGNORE") {
auto genericOp = rewriter.create<linalg::GenericOp>(
- op->getLoc(), resultOp.getType(0), resultOp.getInputs(),
- resultOp.getOutputs(), resultOp.getIndexingMapsArray(),
- resultOp.getIteratorTypesArray(),
+ loc, resultOp.getType(0), resultOp.getInputs(), resultOp.getOutputs(),
+ resultOp.getIndexingMapsArray(), resultOp.getIteratorTypesArray(),
[&](OpBuilder &opBuilder, Location loc, ValueRange blockArgs) {
IRMapping map;
auto oldBlock = resultOp.getRegion().begin();
@@ -834,10 +834,10 @@ class MaxPool2dConverter : public OpConversionPattern<tosa::MaxPool2dOp> {
map.map(oldArgs, blockArgs);
auto *newOp = opBuilder.clone(oldMaxOp, map);
Value isNaN = opBuilder.create<arith::CmpFOp>(
- op->getLoc(), arith::CmpFPredicate::UNO, blockArgs.front(),
+ loc, arith::CmpFPredicate::UNO, blockArgs.front(),
blockArgs.front());
auto selectOp = opBuilder.create<arith::SelectOp>(
- op->getLoc(), isNaN, blockArgs.back(), newOp->getResult(0));
+ loc, isNaN, blockArgs.back(), newOp->getResult(0));
opBuilder.create<linalg::YieldOp>(loc, selectOp.getResult());
});
rewriter.replaceOp(resultOp, genericOp);
diff --git a/mlir/lib/Conversion/TosaToTensor/TosaToTensor.cpp b/mlir/lib/Conversion/TosaToTensor/TosaToTensor.cpp
index 9ceb5c0c7f2fe..c6cbcb0f8ab2b 100644
--- a/mlir/lib/Conversion/TosaToTensor/TosaToTensor.cpp
+++ b/mlir/lib/Conversion/TosaToTensor/TosaToTensor.cpp
@@ -320,8 +320,6 @@ class SliceConverter : public OpConversionPattern<tosa::SliceOp> {
rewriter.getDenseI64ArrayAttr(sizes),
rewriter.getDenseI64ArrayAttr(strides));
- rewriter.replaceOp(sliceOp, newSliceOp.getResult());
-
// Remove const_shape ops when it no longer has use point.
Operation *startConstShape = sliceOp.getStart().getDefiningOp();
if (startConstShape->getResult(0).hasOneUse())
@@ -331,6 +329,7 @@ class SliceConverter : public OpConversionPattern<tosa::SliceOp> {
if (sizeConstShape->getResult(0).hasOneUse())
rewriter.eraseOp(sizeConstShape);
+ rewriter.replaceOp(sliceOp, newSliceOp.getResult());
return success();
}
};
More information about the Mlir-commits
mailing list