Revert my indvars changes because they were breaking things. Unfortunately this
authorOwen Anderson <resistor@mac.com>
Tue, 11 Jul 2006 07:25:33 +0000 (07:25 +0000)
committerOwen Anderson <resistor@mac.com>
Tue, 11 Jul 2006 07:25:33 +0000 (07:25 +0000)
didn't start showing up until after the recent instcombine fixes.

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

lib/Transforms/Scalar/IndVarSimplify.cpp

index f238a94fa6868aeeda64ba583ffe490120206c24..a46916077ae887e7e9711e9ad837826d96c02b7f 100644 (file)
@@ -325,8 +325,20 @@ void IndVarSimplify::RewriteLoopExitValues(Loop *L) {
             for (Value::use_iterator UI = I->use_begin(), E = I->use_end();
                  UI != E; ++UI) {
               Instruction *User = cast<Instruction>(*UI);
-              if (!L->contains(User->getParent()))
+              if (!L->contains(User->getParent())) {
+                // If this is a PHI node in the exit block and we're inserting,
+                // into the exit block, it must have a single entry.  In this
+                // case, we can't insert the code after the PHI and have the PHI
+                // still use it.  Instead, don't insert the the PHI.
+                if (PHINode *PN = dyn_cast<PHINode>(User)) {
+                  // FIXME: This is a case where LCSSA pessimizes code, this
+                  // should be fixed better.
+                  if (PN->getNumOperands() == 2 && 
+                      PN->getParent() == BlockToInsertInto)
+                    continue;
+                }
                 ExtraLoopUsers.push_back(User);
+              }
             }
             
             if (!ExtraLoopUsers.empty()) {
@@ -346,34 +358,8 @@ void IndVarSimplify::RewriteLoopExitValues(Loop *L) {
 
                 // Rewrite any users of the computed value outside of the loop
                 // with the newly computed value.
-                for (unsigned i = 0, e = ExtraLoopUsers.size(); i != e; ++i) {
-                  PHINode* PN = dyn_cast<PHINode>(ExtraLoopUsers[i]);
-                  if (PN && PN->getParent() == BlockToInsertInto) {
-                     // We're dealing with an LCSSA Phi.  Handle it specially.
-                    Instruction* LCSSAInsertPt = BlockToInsertInto->begin();
-                    
-                    Instruction* NewInstr = dyn_cast<Instruction>(NewVal);
-                    if (Instruction* NewInstr = dyn_cast<Instruction>(NewVal))
-                      for (unsigned j = 0; j < NewInstr->getNumOperands(); ++j){
-                        Instruction* PredI = 
-                                 dyn_cast<Instruction>(NewInstr->getOperand(j));
-                        if (PredI && L->contains(PredI->getParent())) {
-                          PHINode* NewLCSSA = new PHINode(PredI->getType(),
-                                                    PredI->getName() + ".lcssa",
-                                                    LCSSAInsertPt);
-                          NewLCSSA->addIncoming(PredI, 
-                                     BlockToInsertInto->getSinglePredecessor());
-                        
-                          NewInstr->replaceUsesOfWith(PredI, NewLCSSA);
-                        }
-                      }
-                    
-                    PN->replaceAllUsesWith(NewVal);
-                    PN->eraseFromParent();
-                  } else {
-                    ExtraLoopUsers[i]->replaceUsesOfWith(I, NewVal);
-                  }
-                }
+                for (unsigned i = 0, e = ExtraLoopUsers.size(); i != e; ++i)
+                  ExtraLoopUsers[i]->replaceUsesOfWith(I, NewVal);
 
                 // If this instruction is dead now, schedule it to be removed.
                 if (I->use_empty())