mirror of
https://github.com/RPCS3/llvm.git
synced 2024-12-14 15:39:06 +00:00
Work around a coalescer bug.
The coalescer can in very rare cases leave too large live intervals around after rematerializing cheap-as-a-move instructions. Linear scan doesn't really care, but live range splitting gets very confused when a live range is killed by a ghost instruction. I will fix this properly in the coalescer after 2.9 branches. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@127096 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
4faa0e1952
commit
2b0f9e73d8
@ -81,7 +81,20 @@ void SplitAnalysis::analyzeUses() {
|
||||
UsingBlocks[MBB]++;
|
||||
}
|
||||
array_pod_sort(UseSlots.begin(), UseSlots.end());
|
||||
calcLiveBlockInfo();
|
||||
|
||||
// Compute per-live block info.
|
||||
if (!calcLiveBlockInfo()) {
|
||||
// FIXME: calcLiveBlockInfo found inconsistencies in the live range.
|
||||
// I am looking at you, SimpleRegisterCoalescing!
|
||||
DEBUG(dbgs() << "*** Fixing inconsistent live interval! ***\n");
|
||||
const_cast<LiveIntervals&>(LIS)
|
||||
.shrinkToUses(const_cast<LiveInterval*>(CurLI));
|
||||
LiveBlocks.clear();
|
||||
bool fixed = calcLiveBlockInfo();
|
||||
(void)fixed;
|
||||
assert(fixed && "Couldn't fix broken live interval");
|
||||
}
|
||||
|
||||
DEBUG(dbgs() << " counted "
|
||||
<< UsingInstrs.size() << " instrs, "
|
||||
<< UsingBlocks.size() << " blocks.\n");
|
||||
@ -89,9 +102,9 @@ void SplitAnalysis::analyzeUses() {
|
||||
|
||||
/// calcLiveBlockInfo - Fill the LiveBlocks array with information about blocks
|
||||
/// where CurLI is live.
|
||||
void SplitAnalysis::calcLiveBlockInfo() {
|
||||
bool SplitAnalysis::calcLiveBlockInfo() {
|
||||
if (CurLI->empty())
|
||||
return;
|
||||
return true;
|
||||
|
||||
LiveInterval::const_iterator LVI = CurLI->begin();
|
||||
LiveInterval::const_iterator LVE = CurLI->end();
|
||||
@ -154,6 +167,11 @@ void SplitAnalysis::calcLiveBlockInfo() {
|
||||
BI.LiveThrough = !hasGap && BI.LiveIn && BI.LiveOut;
|
||||
LiveBlocks.push_back(BI);
|
||||
|
||||
// FIXME: This should never happen. The live range stops or starts without a
|
||||
// corresponding use. An earlier pass did something wrong.
|
||||
if (!BI.LiveThrough && !BI.Uses)
|
||||
return false;
|
||||
|
||||
// LVI is now at LVE or LVI->end >= Stop.
|
||||
if (LVI == LVE)
|
||||
break;
|
||||
@ -168,6 +186,7 @@ void SplitAnalysis::calcLiveBlockInfo() {
|
||||
else
|
||||
MFI = LIS.getMBBFromIndex(LVI->start);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
bool SplitAnalysis::isOriginalEndpoint(SlotIndex Idx) const {
|
||||
|
@ -103,7 +103,7 @@ private:
|
||||
void analyzeUses();
|
||||
|
||||
/// calcLiveBlockInfo - Compute per-block information about CurLI.
|
||||
void calcLiveBlockInfo();
|
||||
bool calcLiveBlockInfo();
|
||||
|
||||
/// canAnalyzeBranch - Return true if MBB ends in a branch that can be
|
||||
/// analyzed.
|
||||
|
Loading…
Reference in New Issue
Block a user