$OpenBSD: patch-lib_Transforms_Scalar_SCCP_cpp,v 1.1 2021/05/13 23:54:25 jca Exp $

[SCCP] Avoid modifying AdditionalUsers while iterating over it
https://reviews.llvm.org/rG6abb92f2103a58d097620b4410054c5bb18c48ec

Index: lib/Transforms/Scalar/SCCP.cpp
--- lib/Transforms/Scalar/SCCP.cpp.orig
+++ lib/Transforms/Scalar/SCCP.cpp
@@ -541,9 +541,14 @@ class SCCPSolver : public InstVisitor<SCCPSolver> { (p
 
     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);
