Add a safe-guard against repeated splitting for some rare cases.

The number of blocks covered by a live range must be strictly decreasing when
splitting, otherwise we can't allow repeated splitting.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@130249 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Jakob Stoklund Olesen
2011-04-26 22:33:12 +00:00
parent d5c7f7cb5e
commit 9f4b893b84
3 changed files with 43 additions and 3 deletions

View File

@ -921,6 +921,7 @@ void RAGreedy::splitAroundRegion(LiveInterval &VirtReg,
SmallVector<unsigned, 8> IntvMap;
SE->finish(&IntvMap);
LRStage.resize(MRI->getNumVirtRegs());
unsigned OrigBlocks = SA->getNumThroughBlocks() + SA->getUseBlocks().size();
// Sort out the new intervals created by splitting. We get four kinds:
// - Remainder intervals should not be split again.
@ -941,9 +942,20 @@ void RAGreedy::splitAroundRegion(LiveInterval &VirtReg,
continue;
}
// Other intervals are treated as new. This includes the main interval,
// local intervals created for blocks with multiple uses, and anything
// created by DCE.
// Main interval. Allow repeated splitting as long as the number of live
// blocks is strictly decreasing.
if (IntvMap[i] == MainIntv) {
if (SA->countLiveBlocks(LREdit.get(i)) >= OrigBlocks) {
DEBUG(dbgs() << "Main interval covers the same " << OrigBlocks
<< " blocks as original.\n");
// Don't allow repeated splitting as a safe guard against looping.
LRStage[Reg] = RS_Global;
}
continue;
}
// Other intervals are treated as new. This includes local intervals created
// for blocks with multiple uses, and anything created by DCE.
}
if (VerifyEnabled)