From: Owen Anderson Date: Fri, 3 Aug 2007 11:03:26 +0000 (+0000) Subject: Fix a subtle iterator invalidation bug in a recursive algorithm. X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=4b55c3b0f17cdf548e45899ba069e454c6342bf1;p=oota-llvm.git Fix a subtle iterator invalidation bug in a recursive algorithm. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@40776 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Transforms/Scalar/GVN.cpp b/lib/Transforms/Scalar/GVN.cpp index 2384e59ca0e..1f3ecfa2b19 100644 --- a/lib/Transforms/Scalar/GVN.cpp +++ b/lib/Transforms/Scalar/GVN.cpp @@ -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;