forked from OSchip/llvm-project
Fix PR9883. Make sure all caches are invalidated when a live range is repaired.
The previous invalidation missed the alias interference caches. Also add a stats counter for the number of repaired ranges. llvm-svn: 131133
This commit is contained in:
parent
86a5101c27
commit
50215afd8a
|
@ -113,6 +113,10 @@ protected:
|
|||
return Queries[PhysReg];
|
||||
}
|
||||
|
||||
// Invalidate all cached information about virtual registers - live ranges may
|
||||
// have changed.
|
||||
void invalidateVirtRegs() { ++UserTag; }
|
||||
|
||||
// The top-level driver. The output is a VirtRegMap that us updated with
|
||||
// physical register assignments.
|
||||
//
|
||||
|
|
|
@ -309,7 +309,7 @@ void RegAllocBase::allocatePhysRegs() {
|
|||
}
|
||||
|
||||
// Invalidate all interference queries, live ranges could have changed.
|
||||
++UserTag;
|
||||
invalidateVirtRegs();
|
||||
|
||||
// selectOrSplit requests the allocator to return an available physical
|
||||
// register if possible and populate a list of new live intervals that
|
||||
|
|
|
@ -1325,9 +1325,7 @@ unsigned RAGreedy::trySplit(LiveInterval &VirtReg, AllocationOrder &Order,
|
|||
// an assertion when the coalescer is fixed.
|
||||
if (SA->didRepairRange()) {
|
||||
// VirtReg has changed, so all cached queries are invalid.
|
||||
Order.rewind();
|
||||
while (unsigned PhysReg = Order.next())
|
||||
query(VirtReg, PhysReg).clear();
|
||||
invalidateVirtRegs();
|
||||
if (unsigned PhysReg = tryAssign(VirtReg, Order, NewVRegs))
|
||||
return PhysReg;
|
||||
}
|
||||
|
|
|
@ -32,6 +32,7 @@ STATISTIC(NumFinished, "Number of splits finished");
|
|||
STATISTIC(NumSimple, "Number of splits that were simple");
|
||||
STATISTIC(NumCopies, "Number of copies inserted for splitting");
|
||||
STATISTIC(NumRemats, "Number of rematerialized defs for splitting");
|
||||
STATISTIC(NumRepairs, "Number of invalid live ranges repaired");
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// Split Analysis
|
||||
|
@ -123,6 +124,7 @@ void SplitAnalysis::analyzeUses() {
|
|||
// FIXME: calcLiveBlockInfo found inconsistencies in the live range.
|
||||
// I am looking at you, SimpleRegisterCoalescing!
|
||||
DidRepairRange = true;
|
||||
++NumRepairs;
|
||||
DEBUG(dbgs() << "*** Fixing inconsistent live interval! ***\n");
|
||||
const_cast<LiveIntervals&>(LIS)
|
||||
.shrinkToUses(const_cast<LiveInterval*>(CurLI));
|
||||
|
|
Loading…
Reference in New Issue