[llvm-commits] [llvm] r41063 - /llvm/trunk/lib/Transforms/Scalar/LoopIndexSplit.cpp

Devang Patel dpatel at apple.com
Mon Aug 13 18:30:58 PDT 2007


Author: dpatel
Date: Mon Aug 13 20:30:57 2007
New Revision: 41063

URL: http://llvm.org/viewvc/llvm-project?rev=41063&view=rev
Log:
Handle last value assignments.

Modified:
    llvm/trunk/lib/Transforms/Scalar/LoopIndexSplit.cpp

Modified: llvm/trunk/lib/Transforms/Scalar/LoopIndexSplit.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/LoopIndexSplit.cpp?rev=41063&r1=41062&r2=41063&view=diff

==============================================================================
--- llvm/trunk/lib/Transforms/Scalar/LoopIndexSplit.cpp (original)
+++ llvm/trunk/lib/Transforms/Scalar/LoopIndexSplit.cpp Mon Aug 13 20:30:57 2007
@@ -419,8 +419,8 @@
   }
   BR->setUnconditionalDest(LatchSucc);
 
-  BasicBlock *Preheader = L->getLoopPreheader();
   Instruction *Terminator = Header->getTerminator();
+  Value *ExitValue = ExitCondition->getOperand(ExitValueNum);
 
   // Replace split condition in header.
   // Transform 
@@ -436,8 +436,7 @@
                                  Terminator);
   Instruction *C2 = new ICmpInst(SignedPredicate ? 
                                  ICmpInst::ICMP_SLT : ICmpInst::ICMP_ULT,
-                                 SD.SplitValue, 
-                                 ExitCondition->getOperand(ExitValueNum), "lisplit", 
+                                 SD.SplitValue, ExitValue, "lisplit", 
                                  Terminator);
   Instruction *NSplitCond = BinaryOperator::createAnd(C1, C2, "lisplit", 
                                                       Terminator);
@@ -454,7 +453,10 @@
     if (isa<PHINode>(I) || I == LTerminator)
       continue;
 
-    I->replaceAllUsesWith(UndefValue::get(I->getType()));
+    if (I == IndVarIncrement) 
+      I->replaceAllUsesWith(ExitValue);
+    else
+      I->replaceAllUsesWith(UndefValue::get(I->getType()));
     I->eraseFromParent();
   }
 
@@ -485,7 +487,7 @@
       BI != BE; ++BI) {
     Instruction *I = BI;
 
-    // PHI Nodes are OK. FIXME : Handle last value assignments.
+    // PHI Nodes are OK.
     if (isa<PHINode>(I))
       continue;
 
@@ -520,7 +522,7 @@
        BI != BE; ++BI) {
     Instruction *I = BI;
 
-    // PHI Nodes are OK. FIXME : Handle last value assignments.
+    // PHI Nodes are OK.
     if (isa<PHINode>(I))
       continue;
 
@@ -686,23 +688,49 @@
   assert (ExitInsn && "Unable to find suitable loop exit branch");
   BasicBlock *ExitDest = ExitInsn->getSuccessor(1);
 
+  if (L->contains(ExitDest)) {
+    ExitDest = ExitInsn->getSuccessor(0);
+    ExitInsn->setSuccessor(0, FalseHeader);
+  } else
+    ExitInsn->setSuccessor(1, FalseHeader);
+
+  // Collect inverse map of Header PHINodes.
+  DenseMap<Value *, Value *> InverseMap;
+  for (BasicBlock::iterator BI = L->getHeader()->begin(), 
+         BE = L->getHeader()->end(); BI != BE; ++BI) {
+    if (PHINode *PN = dyn_cast<PHINode>(BI)) {
+      PHINode *PNClone = cast<PHINode>(ValueMap[PN]);
+      InverseMap[PNClone] = PN;
+    } else
+      break;
+  }
+
+  // Update False loop's header
   for (BasicBlock::iterator BI = FalseHeader->begin(), BE = FalseHeader->end();
        BI != BE; ++BI) {
     if (PHINode *PN = dyn_cast<PHINode>(BI)) {
       PN->removeIncomingValue(Preheader);
       if (PN == IndVarClone)
         PN->addIncoming(FLStartValue, ExitBlock);
-      // else { FIXME : Handl last value assignments.}
-    }
-    else
+      else { 
+        PHINode *OrigPN = cast<PHINode>(InverseMap[PN]);
+        Value *V2 = OrigPN->getIncomingValueForBlock(ExitBlock);
+        PN->addIncoming(V2, ExitBlock);
+      }
+    } else
       break;
   }
 
-  if (L->contains(ExitDest)) {
-    ExitDest = ExitInsn->getSuccessor(0);
-    ExitInsn->setSuccessor(0, FalseHeader);
-  } else
-    ExitInsn->setSuccessor(1, FalseHeader);
+  // Update ExitDest. Now it's predecessor is False loop's exit block.
+  BasicBlock *ExitBlockClone = cast<BasicBlock>(ValueMap[ExitBlock]);
+  for (BasicBlock::iterator BI = ExitDest->begin(), BE = ExitDest->end();
+       BI != BE; ++BI) {
+    if (PHINode *PN = dyn_cast<PHINode>(BI)) {
+      PN->addIncoming(ValueMap[PN->getIncomingValueForBlock(ExitBlock)], ExitBlockClone);
+      PN->removeIncomingValue(ExitBlock);
+    } else
+      break;
+  }
 
   if (DT) {
     DT->changeImmediateDominator(FalseHeader, ExitBlock);





More information about the llvm-commits mailing list