Fix for 2006-06-26-MultipleExitsSingleBlock.
authorOwen Anderson <resistor@mac.com>
Mon, 12 Jun 2006 07:10:16 +0000 (07:10 +0000)
committerOwen Anderson <resistor@mac.com>
Mon, 12 Jun 2006 07:10:16 +0000 (07:10 +0000)
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.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@28750 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/Utils/LCSSA.cpp

index ed02c977430647c11b74d09ed0e01310a49635a3..ac540c9aaac2c78e711ad8e764aef96a23adb360 100644 (file)
@@ -155,13 +155,16 @@ void LCSSA::processInstruction(Instruction* Instr,
   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;