diff options
author | Owen Anderson <resistor@mac.com> | 2007-08-03 11:03:26 +0000 |
---|---|---|
committer | Owen Anderson <resistor@mac.com> | 2007-08-03 11:03:26 +0000 |
commit | 774761c503b0185f5c91cf81736fab8567a4b1b8 (patch) | |
tree | 518047fcc5ead4382c10aec2b91cdf869629110e /llvm | |
parent | d8a382f66dfecab3170a7ff26a251033df5d37e4 (diff) | |
download | bcm5719-llvm-774761c503b0185f5c91cf81736fab8567a4b1b8.tar.gz bcm5719-llvm-774761c503b0185f5c91cf81736fab8567a4b1b8.zip |
Fix a subtle iterator invalidation bug in a recursive algorithm.
llvm-svn: 40776
Diffstat (limited to 'llvm')
-rw-r--r-- | llvm/lib/Transforms/Scalar/GVN.cpp | 12 |
1 files changed, 7 insertions, 5 deletions
diff --git a/llvm/lib/Transforms/Scalar/GVN.cpp b/llvm/lib/Transforms/Scalar/GVN.cpp index 2384e59ca0e..1f3ecfa2b19 100644 --- a/llvm/lib/Transforms/Scalar/GVN.cpp +++ b/llvm/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; |