Changes in directory llvm/lib/Transforms/Utils:
LCSSA.cpp updated: 1.19 -> 1.20 --- Log message: Fix for 2006-06-26-MultipleExitsSingleBlock. If a single exit block has multiple predecessors within the loop, it will appear in the exit blocks list more than once. LCSSA needs to take that into account so that it doesn't double process that exit block. --- Diffs of the changes: (+7 -4) LCSSA.cpp | 11 +++++++---- 1 files changed, 7 insertions(+), 4 deletions(-) Index: llvm/lib/Transforms/Utils/LCSSA.cpp diff -u llvm/lib/Transforms/Utils/LCSSA.cpp:1.19 llvm/lib/Transforms/Utils/LCSSA.cpp:1.20 --- llvm/lib/Transforms/Utils/LCSSA.cpp:1.19 Sun Jun 11 14:22:28 2006 +++ llvm/lib/Transforms/Utils/LCSSA.cpp Mon Jun 12 02:10:16 2006 @@ -155,13 +155,16 @@ std::vector<PHINode*> workList; 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(), Instr->getName()+".lcssa", + BBE = exitBlocks.end(); BBI != BBE; ++BBI) { + Instruction*& phi = Phis[*BBI]; + if (phi == 0 && + DT->getNode(Instr->getParent())->dominates(DT->getNode(*BBI))) { + phi = new PHINode(Instr->getType(), Instr->getName()+".lcssa", (*BBI)->begin()); - workList.push_back(phi); + workList.push_back(cast<PHINode>(phi)); Phis[*BBI] = phi; } + } // Phi nodes that need to have their incoming values filled. std::vector<PHINode*> needIncomingValues; _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits