diff options
author | Owen Anderson <resistor@mac.com> | 2006-06-04 00:55:19 +0000 |
---|---|---|
committer | Owen Anderson <resistor@mac.com> | 2006-06-04 00:55:19 +0000 |
commit | c14c1d472a0bc2a184e4ea1221bd01b1f86e7f26 (patch) | |
tree | c1c349548deedd5664da5997ea3c16ac1ef2ead5 | |
parent | a5cc38bcbda5977d130837bff04f60c61ddee29f (diff) | |
download | external_llvm-c14c1d472a0bc2a184e4ea1221bd01b1f86e7f26.zip external_llvm-c14c1d472a0bc2a184e4ea1221bd01b1f86e7f26.tar.gz external_llvm-c14c1d472a0bc2a184e4ea1221bd01b1f86e7f26.tar.bz2 |
Some more clean-up, and squash an IDF-Phi related bug.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@28680 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/Transforms/Utils/LCSSA.cpp | 29 |
1 files changed, 13 insertions, 16 deletions
diff --git a/lib/Transforms/Utils/LCSSA.cpp b/lib/Transforms/Utils/LCSSA.cpp index 6829921..a5411d4 100644 --- a/lib/Transforms/Utils/LCSSA.cpp +++ b/lib/Transforms/Utils/LCSSA.cpp @@ -50,7 +50,7 @@ namespace { LoopInfo *LI; // Loop information - DominatorTree *DT; // Dominator Tree for the current Loop... + DominatorTree *DT; // Dominator Tree for the current Function... DominanceFrontier *DF; // Current Dominance Frontier std::vector<BasicBlock*> *LoopBlocks; @@ -149,7 +149,8 @@ void LCSSA::processInstruction(Instruction* Instr, for (std::vector<BasicBlock*>::const_iterator BBI = exitBlocks.begin(), BBE = exitBlocks.end(); BBI != BBE; ++BBI) if (DT->getNode(Instr->getParent())->dominates(DT->getNode(*BBI))) { - PHINode *phi = new PHINode(Instr->getType(), "lcssa", (*BBI)->begin()); + PHINode *phi = new PHINode(Instr->getType(), Instr->getName()+".lcssa", + (*BBI)->begin()); workList.push_back(phi); Phis[*BBI] = phi; } @@ -174,12 +175,15 @@ void LCSSA::processInstruction(Instruction* Instr, const DominanceFrontier::DomSetType &S = it->second; for (DominanceFrontier::DomSetType::const_iterator P = S.begin(), PE = S.end(); P != PE; ++P) { - Instruction *&Phi = Phis[*P]; - if (Phi == 0) { - // Still doesn't have operands... - Phi = new PHINode(Instr->getType(), "lcssa", (*P)->begin()); + if (DT->getNode(Instr->getParent())->dominates(DT->getNode(*P))) { + Instruction *&Phi = Phis[*P]; + if (Phi == 0) { + // Still doesn't have operands... + Phi = new PHINode(Instr->getType(), Instr->getName()+".lcssa", + (*P)->begin()); - workList.push_back(cast<PHINode>(Phi)); + workList.push_back(cast<PHINode>(Phi)); + } } } } @@ -200,18 +204,11 @@ void LCSSA::processInstruction(Instruction* Instr, for (Instruction::use_iterator UI = Instr->use_begin(), UE = Instr->use_end(); UI != UE; ++UI) { Instruction* use = cast<Instruction>(*UI); - // Don't need to update uses within the loop body, and we don't want to - // overwrite the Phi nodes that we inserted into the exit blocks either. - if (!inLoopBlocks(use->getParent()) && - !(std::binary_search(exitBlocks.begin(), exitBlocks.end(), - use->getParent()) && isa<PHINode>(use))) + // Don't need to update uses within the loop body. + if (!inLoopBlocks(use->getParent())) Uses.push_back(use); } - // Deliberately remove the initial instruction from Phis set. It would mess - // up use-replacement. - Phis.erase(Instr->getParent()); - for (std::vector<Instruction*>::iterator II = Uses.begin(), IE = Uses.end(); II != IE; ++II) { if (PHINode* phi = dyn_cast<PHINode>(*II)) { |