diff options
author | Jakob Stoklund Olesen <stoklund@2pi.dk> | 2011-03-05 18:33:49 +0000 |
---|---|---|
committer | Jakob Stoklund Olesen <stoklund@2pi.dk> | 2011-03-05 18:33:49 +0000 |
commit | 27e0a4ab86a9066f19e4027d2a6ead4e51e40d76 (patch) | |
tree | fa23578804e4747a559c49e20c38ff3f9895668c /llvm/lib | |
parent | 1c3af96724fbc63e55e01719fa169be9e274afb2 (diff) | |
download | bcm5719-llvm-27e0a4ab86a9066f19e4027d2a6ead4e51e40d76.tar.gz bcm5719-llvm-27e0a4ab86a9066f19e4027d2a6ead4e51e40d76.zip |
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.
llvm-svn: 127096
Diffstat (limited to 'llvm/lib')
-rw-r--r-- | llvm/lib/CodeGen/SplitKit.cpp | 25 | ||||
-rw-r--r-- | llvm/lib/CodeGen/SplitKit.h | 2 |
2 files changed, 23 insertions, 4 deletions
diff --git a/llvm/lib/CodeGen/SplitKit.cpp b/llvm/lib/CodeGen/SplitKit.cpp index 4adf8f7f949..c4ae8c474c5 100644 --- a/llvm/lib/CodeGen/SplitKit.cpp +++ b/llvm/lib/CodeGen/SplitKit.cpp @@ -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 { diff --git a/llvm/lib/CodeGen/SplitKit.h b/llvm/lib/CodeGen/SplitKit.h index 29c0afc76ca..0e35df0ed6c 100644 --- a/llvm/lib/CodeGen/SplitKit.h +++ b/llvm/lib/CodeGen/SplitKit.h @@ -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. |