Move RABasic::addMBBLiveIns to the base class, it is generally useful.

Minor optimization to the use of IntervalMap iterators. They are fairly
heavyweight, so prefer SI.valid() over SI != end().

llvm-svn: 121217
This commit is contained in:
Jakob Stoklund Olesen 2010-12-08 01:06:06 +00:00
parent 72ce453c73
commit 5885e99405
3 changed files with 35 additions and 33 deletions

View File

@ -75,6 +75,7 @@ public:
// by their starting position.
SegmentIter begin() { return Segments.begin(); }
SegmentIter end() { return Segments.end(); }
bool empty() { return Segments.empty(); }
// Add a live virtual register to this union and merge its segments.
void unify(LiveInterval &VirtReg);

View File

@ -149,6 +149,9 @@ protected:
bool spillInterferences(LiveInterval &VirtReg, unsigned PhysReg,
SmallVectorImpl<LiveInterval*> &SplitVRegs);
/// addMBBLiveIns - Add physreg liveins to basic blocks.
void addMBBLiveIns(MachineFunction *);
#ifndef NDEBUG
// Verify each LiveIntervalUnion.
void verify();

View File

@ -110,9 +110,6 @@ public:
virtual bool runOnMachineFunction(MachineFunction &mf);
static char ID;
private:
void addMBBLiveIns();
};
char RABasic::ID = 0;
@ -395,6 +392,36 @@ RegAllocBase::spillInterferences(LiveInterval &VirtReg, unsigned PhysReg,
return true;
}
// Add newly allocated physical registers to the MBB live in sets.
void RegAllocBase::addMBBLiveIns(MachineFunction *MF) {
typedef SmallVector<MachineBasicBlock*, 8> MBBVec;
MBBVec liveInMBBs;
MachineBasicBlock &entryMBB = *MF->begin();
for (unsigned PhysReg = 0; PhysReg < PhysReg2LiveUnion.numRegs(); ++PhysReg) {
LiveIntervalUnion &LiveUnion = PhysReg2LiveUnion[PhysReg];
if (LiveUnion.empty())
continue;
for (LiveIntervalUnion::SegmentIter SI = LiveUnion.begin(); SI.valid();
++SI) {
// Find the set of basic blocks which this range is live into...
liveInMBBs.clear();
if (!LIS->findLiveInMBBs(SI.start(), SI.stop(), liveInMBBs)) continue;
// And add the physreg for this interval to their live-in sets.
for (MBBVec::iterator I = liveInMBBs.begin(), E = liveInMBBs.end();
I != E; ++I) {
MachineBasicBlock *MBB = *I;
if (MBB == &entryMBB) continue;
if (MBB->isLiveIn(PhysReg)) continue;
MBB->addLiveIn(PhysReg);
}
}
}
}
//===----------------------------------------------------------------------===//
// RABasic Implementation
//===----------------------------------------------------------------------===//
@ -467,35 +494,6 @@ unsigned RABasic::selectOrSplit(LiveInterval &VirtReg,
return 0;
}
// Add newly allocated physical registers to the MBB live in sets.
void RABasic::addMBBLiveIns() {
typedef SmallVector<MachineBasicBlock*, 8> MBBVec;
MBBVec liveInMBBs;
MachineBasicBlock &entryMBB = *MF->begin();
for (unsigned PhysReg = 0; PhysReg < PhysReg2LiveUnion.numRegs(); ++PhysReg) {
LiveIntervalUnion &LiveUnion = PhysReg2LiveUnion[PhysReg];
for (LiveIntervalUnion::SegmentIter SI = LiveUnion.begin(),
SegEnd = LiveUnion.end();
SI != SegEnd; ++SI) {
// Find the set of basic blocks which this range is live into...
liveInMBBs.clear();
if (!LIS->findLiveInMBBs(SI.start(), SI.stop(), liveInMBBs)) continue;
// And add the physreg for this interval to their live-in sets.
for (MBBVec::iterator I = liveInMBBs.begin(), E = liveInMBBs.end();
I != E; ++I) {
MachineBasicBlock *MBB = *I;
if (MBB == &entryMBB) continue;
if (MBB->isLiveIn(PhysReg)) continue;
MBB->addLiveIn(PhysReg);
}
}
}
}
bool RABasic::runOnMachineFunction(MachineFunction &mf) {
DEBUG(dbgs() << "********** BASIC REGISTER ALLOCATION **********\n"
<< "********** Function: "
@ -517,7 +515,7 @@ bool RABasic::runOnMachineFunction(MachineFunction &mf) {
allocatePhysRegs();
addMBBLiveIns();
addMBBLiveIns(MF);
// Diagnostic output before rewriting
DEBUG(dbgs() << "Post alloc VirtRegMap:\n" << *VRM << "\n");