diff options
Diffstat (limited to 'contrib/llvm-project/llvm/lib/Transforms/Scalar/SCCP.cpp')
| -rw-r--r-- | contrib/llvm-project/llvm/lib/Transforms/Scalar/SCCP.cpp | 7 |
1 files changed, 6 insertions, 1 deletions
diff --git a/contrib/llvm-project/llvm/lib/Transforms/Scalar/SCCP.cpp b/contrib/llvm-project/llvm/lib/Transforms/Scalar/SCCP.cpp index de6be52adf21..8feed9e9ebfe 100644 --- a/contrib/llvm-project/llvm/lib/Transforms/Scalar/SCCP.cpp +++ b/contrib/llvm-project/llvm/lib/Transforms/Scalar/SCCP.cpp @@ -542,9 +542,14 @@ private: auto Iter = AdditionalUsers.find(I); if (Iter != AdditionalUsers.end()) { + // Copy additional users before notifying them of changes, because new + // users may be added, potentially invalidating the iterator. + SmallVector<Instruction *, 2> ToNotify; for (User *U : Iter->second) if (auto *UI = dyn_cast<Instruction>(U)) - OperandChangedState(UI); + ToNotify.push_back(UI); + for (Instruction *UI : ToNotify) + OperandChangedState(UI); } } void handleCallOverdefined(CallBase &CB); |
