diff options
author | Evan Cheng <evan.cheng@apple.com> | 2007-10-17 02:10:22 +0000 |
---|---|---|
committer | Evan Cheng <evan.cheng@apple.com> | 2007-10-17 02:10:22 +0000 |
commit | 4ca980e7f9ce7b78955307c2d07001a24d3b6bef (patch) | |
tree | 7b2b71417abe3c9fde438a4a1f63a38827723d5b /lib/CodeGen/LiveIntervalAnalysis.cpp | |
parent | 05d2318fbde7b603bd6de690f18d48e0ef44d81d (diff) |
Clean up code that calculate MBB live-in's.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@43060 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/LiveIntervalAnalysis.cpp')
-rw-r--r-- | lib/CodeGen/LiveIntervalAnalysis.cpp | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/lib/CodeGen/LiveIntervalAnalysis.cpp b/lib/CodeGen/LiveIntervalAnalysis.cpp index c574bef4a6..3aec772f1a 100644 --- a/lib/CodeGen/LiveIntervalAnalysis.cpp +++ b/lib/CodeGen/LiveIntervalAnalysis.cpp @@ -62,6 +62,7 @@ void LiveIntervals::getAnalysisUsage(AnalysisUsage &AU) const { } void LiveIntervals::releaseMemory() { + Idx2MBBMap.clear(); mi2iMap_.clear(); i2miMap_.clear(); r2iMap_.clear(); @@ -71,6 +72,22 @@ void LiveIntervals::releaseMemory() { delete ClonedMIs[i]; } +namespace llvm { + inline bool operator<(unsigned V, const IdxMBBPair &IM) { + return V < IM.first; + } + + inline bool operator<(const IdxMBBPair &IM, unsigned V) { + return IM.first < V; + } + + struct Idx2MBBCompare { + bool operator()(const IdxMBBPair &LHS, const IdxMBBPair &RHS) const { + return LHS.first < RHS.first; + } + }; +} + /// runOnMachineFunction - Register allocate the whole function /// bool LiveIntervals::runOnMachineFunction(MachineFunction &fn) { @@ -100,7 +117,9 @@ bool LiveIntervals::runOnMachineFunction(MachineFunction &fn) { // Set the MBB2IdxMap entry for this MBB. MBB2IdxMap[MBB->getNumber()] = std::make_pair(StartIdx, MIIndex - 1); + Idx2MBBMap.push_back(std::make_pair(StartIdx, MBB)); } + std::sort(Idx2MBBMap.begin(), Idx2MBBMap.end(), Idx2MBBCompare()); computeIntervals(); @@ -797,6 +816,23 @@ void LiveIntervals::computeIntervals() { } } +bool LiveIntervals::findLiveInMBBs(const LiveRange &LR, + SmallVector<MachineBasicBlock*, 4> &MBBs) const { + std::vector<IdxMBBPair>::const_iterator I = + std::lower_bound(Idx2MBBMap.begin(), Idx2MBBMap.end(), LR.start); + + bool ResVal = false; + while (I != Idx2MBBMap.end()) { + if (LR.end <= I->first) + break; + MBBs.push_back(I->second); + ResVal = true; + ++I; + } + return ResVal; +} + + LiveInterval LiveIntervals::createInterval(unsigned reg) { float Weight = MRegisterInfo::isPhysicalRegister(reg) ? HUGE_VALF : 0.0F; |