1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-10-19 19:12:56 +02:00

Cleanup the main RegisterCoalescer loop.

Block priorities still apply outside loops.

llvm-svn: 167793
This commit is contained in:
Andrew Trick 2012-11-13 00:34:44 +00:00
parent 9597b0a305
commit d8c621a864
2 changed files with 11 additions and 24 deletions

View File

@ -2001,30 +2001,17 @@ void RegisterCoalescer::joinAllIntervals() {
DEBUG(dbgs() << "********** JOINING INTERVALS ***********\n");
assert(WorkList.empty() && "Old data still around.");
if (Loops->empty()) {
// If there are no loops in the function, join intervals in function order.
for (MachineFunction::iterator I = MF->begin(), E = MF->end();
I != E; ++I)
copyCoalesceInMBB(I);
} else {
// Otherwise, join intervals in inner loops before other intervals.
// Unfortunately we can't just iterate over loop hierarchy here because
// there may be more MBB's than BB's. Collect MBB's for sorting.
// Join intervals in the function prolog first. We want to join physical
// registers with virtual registers before the intervals got too long.
std::vector<MBBPriorityInfo> MBBs;
for (MachineFunction::iterator I = MF->begin(), E = MF->end();I != E;++I){
MachineBasicBlock *MBB = I;
MBBs.push_back(MBBPriorityInfo(MBB, Loops->getLoopDepth(MBB),
isSplitEdge(MBB)));
}
std::sort(MBBs.begin(), MBBs.end(), MBBPriorityCompare());
// Finally, join intervals in loop nest order.
for (unsigned i = 0, e = MBBs.size(); i != e; ++i)
copyCoalesceInMBB(MBBs[i].MBB);
std::vector<MBBPriorityInfo> MBBs;
for (MachineFunction::iterator I = MF->begin(), E = MF->end();I != E;++I){
MachineBasicBlock *MBB = I;
MBBs.push_back(MBBPriorityInfo(MBB, Loops->getLoopDepth(MBB),
isSplitEdge(MBB)));
}
std::sort(MBBs.begin(), MBBs.end(), MBBPriorityCompare());
// Coalesce intervals in MBB priority order.
for (unsigned i = 0, e = MBBs.size(); i != e; ++i)
copyCoalesceInMBB(MBBs[i].MBB);
// Joining intervals can allow other intervals to be joined. Iteratively join
// until we make no progress.

View File

@ -147,7 +147,7 @@ if.end: ; preds = %entry, %if.then
; CHECK: vmov.f32 {{.*}}, #1.0
; CHECK-NOT: vmov
; CHECK-NOT: vorr
; CHECK: %if.end
; CHECK: bx
; We may leave the last insertelement in the if.end block.
; It is inserting the %add value into a dead lane, but %add causes interference
; in the entry block, and we don't do dead lane checks across basic blocks.