diff options
author | Owen Anderson <resistor@mac.com> | 2008-05-30 17:31:01 +0000 |
---|---|---|
committer | Owen Anderson <resistor@mac.com> | 2008-05-30 17:31:01 +0000 |
commit | 427de86ada3b59d6bf8f4957db04b3f3b58fc277 (patch) | |
tree | ecb385a8ca548e3a04bdff3135bb7453ffe0d98a /lib/Transforms/Utils/LCSSA.cpp | |
parent | babf11f249c7c6399c66f2567d4e7efa9c37a9c3 (diff) |
Since LCSSA switched over to DenseMap, we have to be more careful to avoid iterator invalidation. Fixes PR2385.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@51777 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Transforms/Utils/LCSSA.cpp')
-rw-r--r-- | lib/Transforms/Utils/LCSSA.cpp | 9 |
1 files changed, 5 insertions, 4 deletions
diff --git a/lib/Transforms/Utils/LCSSA.cpp b/lib/Transforms/Utils/LCSSA.cpp index 6277265a36..c3de7979df 100644 --- a/lib/Transforms/Utils/LCSSA.cpp +++ b/lib/Transforms/Utils/LCSSA.cpp @@ -253,8 +253,7 @@ Value *LCSSA::GetValueForBlock(DomTreeNode *BB, Instruction *OrigInst, return UndefValue::get(OrigInst->getType()); // If we have already computed this value, return the previously computed val. - Value *&V = Phis[BB]; - if (V) return V; + if (Phis.count(BB)) return Phis[BB]; DomTreeNode *IDom = BB->getIDom(); @@ -272,7 +271,9 @@ Value *LCSSA::GetValueForBlock(DomTreeNode *BB, Instruction *OrigInst, if (!inLoop(IDom->getBlock())) { // Idom is not in the loop, we must still be "below" the exit block and must // be fully dominated by the value live in the idom. - return V = GetValueForBlock(IDom, OrigInst, Phis); + Value* val = GetValueForBlock(IDom, OrigInst, Phis); + Phis.insert(std::make_pair(BB, val)); + return val; } BasicBlock *BBN = BB->getBlock(); @@ -282,7 +283,7 @@ Value *LCSSA::GetValueForBlock(DomTreeNode *BB, Instruction *OrigInst, PHINode *PN = PHINode::Create(OrigInst->getType(), OrigInst->getName() + ".lcssa", BBN->begin()); PN->reserveOperandSpace(std::distance(pred_begin(BBN), pred_end(BBN))); - V = PN; + Phis.insert(std::make_pair(BB, PN)); // Fill in the incoming values for the block. for (pred_iterator PI = pred_begin(BBN), E = pred_end(BBN); PI != E; ++PI) |