mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-02-09 13:33:17 +00:00
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
This commit is contained in:
parent
05d2318fbd
commit
4ca980e7f9
@ -36,6 +36,7 @@ namespace llvm {
|
||||
class TargetInstrInfo;
|
||||
class TargetRegisterClass;
|
||||
class VirtRegMap;
|
||||
typedef std::pair<unsigned, MachineBasicBlock*> IdxMBBPair;
|
||||
|
||||
class LiveIntervals : public MachineFunctionPass {
|
||||
MachineFunction* mf_;
|
||||
@ -52,6 +53,10 @@ namespace llvm {
|
||||
/// specified basic block.
|
||||
std::vector<std::pair<unsigned, unsigned> > MBB2IdxMap;
|
||||
|
||||
/// Idx2MBBMap - Sorted list of pairs of index of first instruction
|
||||
/// and MBB id.
|
||||
std::vector<IdxMBBPair> Idx2MBBMap;
|
||||
|
||||
typedef std::map<MachineInstr*, unsigned> Mi2IndexMap;
|
||||
Mi2IndexMap mi2iMap_;
|
||||
|
||||
@ -158,6 +163,12 @@ namespace llvm {
|
||||
return i2miMap_[index];
|
||||
}
|
||||
|
||||
/// findLiveInMBBs - Given a live range, if the value of the range
|
||||
/// is live in any MBB returns true as well as the list of basic blocks
|
||||
/// where the value is live in.
|
||||
bool findLiveInMBBs(const LiveRange &LR,
|
||||
SmallVector<MachineBasicBlock*, 4> &MBBs) const;
|
||||
|
||||
// Interval creation
|
||||
|
||||
LiveInterval &getOrCreateInterval(unsigned reg) {
|
||||
|
@ -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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user