Skip to content

Commit 10b0156

Browse files
authored
[flang][HLFIR] Fix use-after-free when rewriting users in canonicalize (#84371)
Rewriting an op can invalidate the operator range being iterated on. Store the users in a separate list, and iterate over the list instead. This was detected by address sanitizer.
1 parent 912ea6e commit 10b0156

File tree

1 file changed

+6
-2
lines changed

1 file changed

+6
-2
lines changed

flang/lib/Optimizer/HLFIR/IR/HLFIROps.cpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
//===----------------------------------------------------------------------===//
1212

1313
#include "flang/Optimizer/HLFIR/HLFIROps.h"
14+
1415
#include "flang/Optimizer/Dialect/FIROpsSupport.h"
1516
#include "flang/Optimizer/Dialect/FIRType.h"
1617
#include "flang/Optimizer/Dialect/Support/FIRContext.h"
@@ -1152,7 +1153,9 @@ hlfir::MatmulOp::canonicalize(MatmulOp matmulOp,
11521153

11531154
// but we do need to get rid of the hlfir.destroy for the hlfir.transpose
11541155
// result (which is entirely removed)
1155-
for (mlir::Operation *user : transposeOp->getResult(0).getUsers())
1156+
llvm::SmallVector<mlir::Operation *> users(
1157+
transposeOp->getResult(0).getUsers());
1158+
for (mlir::Operation *user : users)
11561159
if (auto destroyOp = mlir::dyn_cast_or_null<hlfir::DestroyOp>(user))
11571160
rewriter.eraseOp(destroyOp);
11581161
rewriter.eraseOp(transposeOp);
@@ -1864,7 +1867,8 @@ hlfir::ForallIndexOp::canonicalize(hlfir::ForallIndexOp indexOp,
18641867
return mlir::failure();
18651868

18661869
auto insertPt = rewriter.saveInsertionPoint();
1867-
for (mlir::Operation *user : indexOp->getResult(0).getUsers())
1870+
llvm::SmallVector<mlir::Operation *> users(indexOp->getResult(0).getUsers());
1871+
for (mlir::Operation *user : users)
18681872
if (auto loadOp = mlir::dyn_cast<fir::LoadOp>(user)) {
18691873
rewriter.setInsertionPoint(loadOp);
18701874
rewriter.replaceOpWithNewOp<fir::ConvertOp>(

0 commit comments

Comments
 (0)