Do not insert one entry PHI nodes in split exit blocks!
authorChris Lattner <sabre@nondot.org>
Tue, 9 Dec 2003 23:12:55 +0000 (23:12 +0000)
committerChris Lattner <sabre@nondot.org>
Tue, 9 Dec 2003 23:12:55 +0000 (23:12 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@10348 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/Utils/LoopSimplify.cpp

index 60e35d5ca927e92cb3a2bfa89f5eb705e1908e3a..2618b73409dfc5f381f7a8f588523988f3fffc2c 100644 (file)
@@ -162,21 +162,31 @@ BasicBlock *LoopSimplify::SplitBlockPredecessors(BasicBlock *BB,
   // incoming edges in BB into new PHI nodes in NewBB.
   //
   if (!Preds.empty()) {  // Is the loop not obviously dead?
-    for (BasicBlock::iterator I = BB->begin();
-         PHINode *PN = dyn_cast<PHINode>(I); ++I) {
-      
-      // Create the new PHI node, insert it into NewBB at the end of the block
-      PHINode *NewPHI = new PHINode(PN->getType(), PN->getName()+".ph", BI);
+    if (Preds.size() == 1) {
+      // No need to insert one operand PHI nodes!  Instead, just update the
+      // incoming block ID's.
+      for (BasicBlock::iterator I = BB->begin();
+           PHINode *PN = dyn_cast<PHINode>(I); ++I) {
+        unsigned i = PN->getBasicBlockIndex(Preds[0]);
+        PN->setIncomingBlock(i, NewBB);
+      }
+    } else {
+      for (BasicBlock::iterator I = BB->begin();
+           PHINode *PN = dyn_cast<PHINode>(I); ++I) {
         
-      // Move all of the edges from blocks outside the loop to the new PHI
-      for (unsigned i = 0, e = Preds.size(); i != e; ++i) {
-        Value *V = PN->removeIncomingValue(Preds[i]);
-        NewPHI->addIncoming(V, Preds[i]);
+        // Create the new PHI node, insert it into NewBB at the end of the block
+        PHINode *NewPHI = new PHINode(PN->getType(), PN->getName()+".ph", BI);
+        
+        // Move all of the edges from blocks outside the loop to the new PHI
+        for (unsigned i = 0, e = Preds.size(); i != e; ++i) {
+          Value *V = PN->removeIncomingValue(Preds[i]);
+          NewPHI->addIncoming(V, Preds[i]);
+        }
+        
+        // Add an incoming value to the PHI node in the loop for the preheader
+        // edge.
+        PN->addIncoming(NewPHI, NewBB);
       }
-      
-      // Add an incoming value to the PHI node in the loop for the preheader
-      // edge
-      PN->addIncoming(NewPHI, NewBB);
     }
     
     // Now that the PHI nodes are updated, actually move the edges from