Calculate exit and start value of true loop and false loop respectively.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@40978 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Transforms/Scalar/LoopIndexSplit.cpp b/lib/Transforms/Scalar/LoopIndexSplit.cpp
index 887a730..8234317 100644
--- a/lib/Transforms/Scalar/LoopIndexSplit.cpp
+++ b/lib/Transforms/Scalar/LoopIndexSplit.cpp
@@ -587,11 +587,37 @@
 }
 
 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.