Fix a subtle iterator invalidation bug in a recursive algorithm.
authorOwen Anderson <resistor@mac.com>
Fri, 3 Aug 2007 11:03:26 +0000 (11:03 +0000)
committerOwen Anderson <resistor@mac.com>
Fri, 3 Aug 2007 11:03:26 +0000 (11:03 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@40776 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/Scalar/GVN.cpp

index 2384e59ca0ea8c3e859485dc9b71b178cfbe8713..1f3ecfa2b195152bdabe57bbaed930ae905a626e 100644 (file)
@@ -726,19 +726,21 @@ Value *GVN::GetValueForBlock(BasicBlock *BB, LoadInst* orig,
                                bool top_level) { 
                                  
   // If we have already computed this value, return the previously computed val.
-  Value *&V = Phis[BB];
+  Value *V = Phis[BB];
   if (V && ! top_level) return V;
   
   BasicBlock* singlePred = BB->getSinglePredecessor();
-  if (singlePred)
-    return V = GetValueForBlock(singlePred, orig, Phis);
-  
+  if (singlePred) {
+    V = GetValueForBlock(singlePred, orig, Phis);
+    Phis[BB] = V;
+    return V;
+  }
   // Otherwise, the idom is the loop, so we need to insert a PHI node.  Do so
   // now, then get values to fill in the incoming values for the PHI.
   PHINode *PN = new PHINode(orig->getType(), orig->getName()+".rle",
                             BB->begin());
   PN->reserveOperandSpace(std::distance(pred_begin(BB), pred_end(BB)));
-  V = PN;
+  Phis[BB] = PN;
   
   bool all_same = true;
   Value* first = 0;