[mlir] Don't iterate mutable user list
authorVitaly Buka <vitalybuka@google.com>
Wed, 27 Apr 2022 23:16:39 +0000 (16:16 -0700)
committerVitaly Buka <vitalybuka@google.com>
Thu, 28 Apr 2022 15:59:55 +0000 (08:59 -0700)
executeOp.operandsMutable().append(asyncTokens) in
addAsyncDependencyAfter can resize and invalidate iterators.

Fixes reports like https://reviews.llvm.org/P8286

Reviewed By: herhut

Differential Revision: https://reviews.llvm.org/D124577

mlir/lib/Dialect/GPU/Transforms/AsyncRegionRewriter.cpp

index 5e60696..0832fcb 100644 (file)
@@ -208,7 +208,9 @@ struct GpuAsyncRegionPass::DeferWaitCallback {
 
       // Add the async dependency to each user of the `async.execute` token.
       auto asyncTokens = executeOp.getResults().take_back(dependencies.size());
-      for (Operation *user : executeOp.token().getUsers())
+      SmallVector<Operation *, 4> users(executeOp.token().user_begin(),
+                                        executeOp.token().user_end());
+      for (Operation *user : users)
         addAsyncDependencyAfter(asyncTokens, user);
     }
   }