From: Jakob Stoklund Olesen Date: Wed, 8 Dec 2010 01:06:06 +0000 (+0000) Subject: Move RABasic::addMBBLiveIns to the base class, it is generally useful. X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=1b19dc1d8b7594434ea9a157bfe2ae68eabf9f05;p=oota-llvm.git 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(). git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@121217 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/CodeGen/LiveIntervalUnion.h b/lib/CodeGen/LiveIntervalUnion.h index 2068149ca0c..0c9a13a606c 100644 --- a/lib/CodeGen/LiveIntervalUnion.h +++ b/lib/CodeGen/LiveIntervalUnion.h @@ -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); diff --git a/lib/CodeGen/RegAllocBase.h b/lib/CodeGen/RegAllocBase.h index 32f5e0870ed..7f38c9b95a9 100644 --- a/lib/CodeGen/RegAllocBase.h +++ b/lib/CodeGen/RegAllocBase.h @@ -149,6 +149,9 @@ protected: bool spillInterferences(LiveInterval &VirtReg, unsigned PhysReg, SmallVectorImpl &SplitVRegs); + /// addMBBLiveIns - Add physreg liveins to basic blocks. + void addMBBLiveIns(MachineFunction *); + #ifndef NDEBUG // Verify each LiveIntervalUnion. void verify(); diff --git a/lib/CodeGen/RegAllocBasic.cpp b/lib/CodeGen/RegAllocBasic.cpp index f8eafe42009..d0e63551290 100644 --- a/lib/CodeGen/RegAllocBasic.cpp +++ b/lib/CodeGen/RegAllocBasic.cpp @@ -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 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 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");