Calculate exit and start value of true loop and false loop respectively.
authorDevang Patel <dpatel@apple.com>
Fri, 10 Aug 2007 00:53:35 +0000 (00:53 +0000)
committerDevang Patel <dpatel@apple.com>
Fri, 10 Aug 2007 00:53:35 +0000 (00:53 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@40978 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/Scalar/LoopIndexSplit.cpp

index 887a730e62334661771326c73a7b9f7b2d4a13f0..8234317444a110986fa05e9ed6a3b87d527c0557 100644 (file)
@@ -587,11 +587,37 @@ unsigned LoopIndexSplit::findSplitCost(Loop *L, SplitInfo &SD) {
 }
 
 bool LoopIndexSplit::splitLoop(SplitInfo &SD) {
+
+  BasicBlock *Preheader = L->getLoopPreheader();
+
   // True loop is original loop. False loop is cloned loop.
+
+  bool SignedPredicate = ExitCondition->isSignedPredicate();  
   //[*] Calculate True loop's new Exit Value in loop preheader.
-  //      NewExitValue = min(SplitValue, ExitValue)
+  //      TLExitValue = min(SplitValue, ExitValue)
   //[*] Calculate False loop's new Start Value in loop preheader.
-  //      NewStartValue = min(SplitValue, TrueLoop.StartValue)
+  //      FLStartValue = min(SplitValue, TrueLoop.StartValue)
+  Value *TLExitValue = NULL;
+  Value *FLStartValue = NULL;
+  if (isa<ConstantInt>(SD.SplitValue)) {
+    TLExitValue = SD.SplitValue;
+    FLStartValue = SD.SplitValue;
+  }
+  else {
+    Value *C1 = new ICmpInst(SignedPredicate ? 
+                            ICmpInst::ICMP_SLT : ICmpInst::ICMP_ULT,
+                            SD.SplitValue, ExitValue, "lsplit.ev",
+                            Preheader->getTerminator());
+    TLExitValue = new SelectInst(C1, SD.SplitValue, ExitValue, 
+                                 "lsplit.ev", Preheader->getTerminator());
+
+    Value *C2 = new ICmpInst(SignedPredicate ? 
+                             ICmpInst::ICMP_SLT : ICmpInst::ICMP_ULT,
+                             SD.SplitValue, StartValue, "lsplit.sv",
+                             Preheader->getTerminator());
+    FLStartValue = new SelectInst(C2, SD.SplitValue, StartValue,
+                                  "lsplit.sv", Preheader->getTerminator());
+  }
   //[*] Split Exit Edge.
   //[*] Clone loop. Avoid true destination of split condition and 
   //    the blocks dominated by true destination.