mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-07-29 10:25:12 +00:00
Reapply r132245 with a fix for the bug that broke the darwin9/i386 build.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@132309 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -145,7 +145,7 @@ void SplitAnalysis::analyzeUses() {
|
||||
/// where CurLI is live.
|
||||
bool SplitAnalysis::calcLiveBlockInfo() {
|
||||
ThroughBlocks.resize(MF.getNumBlockIDs());
|
||||
NumThroughBlocks = 0;
|
||||
NumThroughBlocks = NumGapBlocks = 0;
|
||||
if (CurLI->empty())
|
||||
return true;
|
||||
|
||||
@@ -164,55 +164,63 @@ bool SplitAnalysis::calcLiveBlockInfo() {
|
||||
SlotIndex Start, Stop;
|
||||
tie(Start, Stop) = LIS.getSlotIndexes()->getMBBRange(BI.MBB);
|
||||
|
||||
// LVI is the first live segment overlapping MBB.
|
||||
BI.LiveIn = LVI->start <= Start;
|
||||
if (!BI.LiveIn)
|
||||
BI.Def = LVI->start;
|
||||
|
||||
// Find the first and last uses in the block.
|
||||
bool Uses = UseI != UseE && *UseI < Stop;
|
||||
if (Uses) {
|
||||
// If the block contains no uses, the range must be live through. At one
|
||||
// point, SimpleRegisterCoalescing could create dangling ranges that ended
|
||||
// mid-block.
|
||||
if (UseI == UseE || *UseI >= Stop) {
|
||||
++NumThroughBlocks;
|
||||
ThroughBlocks.set(BI.MBB->getNumber());
|
||||
// The range shouldn't end mid-block if there are no uses. This shouldn't
|
||||
// happen.
|
||||
if (LVI->end < Stop)
|
||||
return false;
|
||||
} else {
|
||||
// This block has uses. Find the first and last uses in the block.
|
||||
BI.FirstUse = *UseI;
|
||||
assert(BI.FirstUse >= Start);
|
||||
do ++UseI;
|
||||
while (UseI != UseE && *UseI < Stop);
|
||||
BI.LastUse = UseI[-1];
|
||||
assert(BI.LastUse < Stop);
|
||||
}
|
||||
|
||||
// Look for gaps in the live range.
|
||||
bool hasGap = false;
|
||||
BI.LiveOut = true;
|
||||
while (LVI->end < Stop) {
|
||||
SlotIndex LastStop = LVI->end;
|
||||
if (++LVI == LVE || LVI->start >= Stop) {
|
||||
BI.Kill = LastStop;
|
||||
BI.LiveOut = false;
|
||||
break;
|
||||
}
|
||||
if (LastStop < LVI->start) {
|
||||
hasGap = true;
|
||||
BI.Kill = LastStop;
|
||||
BI.Def = LVI->start;
|
||||
}
|
||||
}
|
||||
// LVI is the first live segment overlapping MBB.
|
||||
BI.LiveIn = LVI->start <= Start;
|
||||
|
||||
// Don't set LiveThrough when the block has a gap.
|
||||
BI.LiveThrough = !hasGap && BI.LiveIn && BI.LiveOut;
|
||||
if (Uses)
|
||||
// Look for gaps in the live range.
|
||||
BI.LiveOut = true;
|
||||
while (LVI->end < Stop) {
|
||||
SlotIndex LastStop = LVI->end;
|
||||
if (++LVI == LVE || LVI->start >= Stop) {
|
||||
BI.LiveOut = false;
|
||||
BI.LastUse = LastStop;
|
||||
break;
|
||||
}
|
||||
if (LastStop < LVI->start) {
|
||||
// There is a gap in the live range. Create duplicate entries for the
|
||||
// live-in snippet and the live-out snippet.
|
||||
++NumGapBlocks;
|
||||
|
||||
// Push the Live-in part.
|
||||
BI.LiveThrough = false;
|
||||
BI.LiveOut = false;
|
||||
UseBlocks.push_back(BI);
|
||||
UseBlocks.back().LastUse = LastStop;
|
||||
|
||||
// Set up BI for the live-out part.
|
||||
BI.LiveIn = false;
|
||||
BI.LiveOut = true;
|
||||
BI.FirstUse = LVI->start;
|
||||
}
|
||||
}
|
||||
|
||||
// Don't set LiveThrough when the block has a gap.
|
||||
BI.LiveThrough = BI.LiveIn && BI.LiveOut;
|
||||
UseBlocks.push_back(BI);
|
||||
else {
|
||||
++NumThroughBlocks;
|
||||
ThroughBlocks.set(BI.MBB->getNumber());
|
||||
}
|
||||
// FIXME: This should never happen. The live range stops or starts without a
|
||||
// corresponding use. An earlier pass did something wrong.
|
||||
if (!BI.LiveThrough && !Uses)
|
||||
return false;
|
||||
|
||||
// LVI is now at LVE or LVI->end >= Stop.
|
||||
if (LVI == LVE)
|
||||
break;
|
||||
// LVI is now at LVE or LVI->end >= Stop.
|
||||
if (LVI == LVE)
|
||||
break;
|
||||
}
|
||||
|
||||
// Live segment ends exactly at Stop. Move to the next segment.
|
||||
if (LVI->end == Stop && ++LVI == LVE)
|
||||
|
Reference in New Issue
Block a user