[llvm-branch-commits] [flang] [flang][CodeGen] Fix use-after-free in BoxedProcedurePass (PR #84376)

via llvm-branch-commits llvm-branch-commits at lists.llvm.org
Fri Mar 8 01:08:26 PST 2024


================
@@ -208,7 +208,12 @@ class BoxedProcedurePass
       mlir::IRRewriter rewriter(context);
       BoxprocTypeRewriter typeConverter(mlir::UnknownLoc::get(context));
       mlir::Dialect *firDialect = context->getLoadedDialect("fir");
-      getModule().walk([&](mlir::Operation *op) {
+      llvm::SmallVector<mlir::Operation *> operations;
+
+      getModule().walk([&](mlir::Operation *op) { operations.push_back(op); });
----------------
jeanPerier wrote:

Are you sure it is invalid to erase IR in the walk? I understand why `opIsValid` is needed and that it was bad to go through the region of erased ops, but I think a walk in post order is supposed to allow erasing operations:  https://github.com/llvm/llvm-project/blob/881df557501d339c7a14b16d68e43da5c732b424/mlir/include/mlir/IR/Operation.h#L767

Is there still a sanitizer issue when introducing `opIsValid` without creating the `operations` vector?

I am a bit concerned with copying the pointer of all the module operations into a SmallVector. On big Fortran applications with hundred of thousands of line in one file, the module will contain millions of operations (I doubt this go above the ~500 millions element capacity of the SmallVector), but it may be overkill for a pass that is not expected to modify a lot of IR (procedure pointers and dummy procedures are usually not all over the place).

https://github.com/llvm/llvm-project/pull/84376


More information about the llvm-branch-commits mailing list