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
This commit is contained in:
Devang Patel 2007-08-10 00:53:35 +00:00
parent bacf5193cf
commit 23a19f82a7

View 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.