Fix iterator invalidation problem
authorChris Lattner <sabre@nondot.org>
Thu, 24 Apr 2003 17:52:20 +0000 (17:52 +0000)
committerChris Lattner <sabre@nondot.org>
Thu, 24 Apr 2003 17:52:20 +0000 (17:52 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@5895 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/Utils/PromoteMemoryToRegister.cpp

index 8406910e6b943e50f4141f5789ea8caf63ad1dc6..3378369f7aaaf7f7974fff01ff0ff612e365ae89 100644 (file)
@@ -201,8 +201,13 @@ bool PromoteMem2Reg::QueuePhiNode(BasicBlock *BB, unsigned AllocaNo) {
   // because it is an unreachable predecessor), that all PHI nodes will have the
   // correct number of entries for their predecessors.
   Value *NullVal = Constant::getNullValue(PN->getType());
-  for (pred_iterator PI = pred_begin(BB), PE = pred_end(BB); PI != PE; ++PI)
-    PN->addIncoming(NullVal, *PI);
+
+  // This is neccesary because adding incoming values to the PHI node adds uses
+  // to the basic blocks being used, which can invalidate the predecessor
+  // iterator!
+  std::vector<BasicBlock*> Preds(pred_begin(BB), pred_end(BB));
+  for (unsigned i = 0, e = Preds.size(); i != e; ++i)
+    PN->addIncoming(NullVal, Preds[i]);
 
   BBPNs[AllocaNo] = PN;
   PhiNodes[AllocaNo].push_back(BB);