mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-03-22 10:36:10 +00:00
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:
parent
bacf5193cf
commit
23a19f82a7
@ -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.
|
||||
|
Loading…
x
Reference in New Issue
Block a user