Do a separate pass to compute spill weights because doing it inline

with live intervals was missing registers that were used before they
were defined (in the arbitrary order live intervals numbers
instructions).


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@10603 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Alkis Evlogimenos 2003-12-24 15:44:53 +00:00
parent 71f0a828a6
commit 7a40eaacee

View File

@ -106,6 +106,33 @@ bool LiveIntervals::runOnMachineFunction(MachineFunction &fn) {
computeIntervals(); computeIntervals();
// compute spill weights
const LoopInfo& loopInfo = getAnalysis<LoopInfo>();
for (MbbIndex2MbbMap::iterator
it = mbbi2mbbMap_.begin(), itEnd = mbbi2mbbMap_.end();
it != itEnd; ++it) {
MachineBasicBlock* mbb = it->second;
unsigned loopDepth = loopInfo.getLoopDepth(mbb->getBasicBlock());
for (MachineBasicBlock::iterator mi = mbb->begin(), miEnd = mbb->end();
mi != miEnd; ++mi) {
MachineInstr* instr = *mi;
for (int i = instr->getNumOperands() - 1; i >= 0; --i) {
MachineOperand& mop = instr->getOperand(i);
if (!mop.isVirtualRegister())
continue;
unsigned reg = mop.getAllocatedRegNum();
Reg2IntervalMap::iterator r2iit = r2iMap_.find(reg);
assert(r2iit != r2iMap_.end());
intervals_[r2iit->second].weight += pow(10.0F, loopDepth);
}
}
}
return true; return true;
} }
@ -255,8 +282,6 @@ void LiveIntervals::computeIntervals()
{ {
DEBUG(std::cerr << "computing live intervals:\n"); DEBUG(std::cerr << "computing live intervals:\n");
const LoopInfo& loopInfo = getAnalysis<LoopInfo>();
for (MbbIndex2MbbMap::iterator for (MbbIndex2MbbMap::iterator
it = mbbi2mbbMap_.begin(), itEnd = mbbi2mbbMap_.end(); it = mbbi2mbbMap_.begin(), itEnd = mbbi2mbbMap_.end();
it != itEnd; ++it) { it != itEnd; ++it) {
@ -264,8 +289,6 @@ void LiveIntervals::computeIntervals()
DEBUG(std::cerr << "machine basic block: " DEBUG(std::cerr << "machine basic block: "
<< mbb->getBasicBlock()->getName() << "\n"); << mbb->getBasicBlock()->getName() << "\n");
unsigned loopDepth = loopInfo.getLoopDepth(mbb->getBasicBlock());
for (MachineBasicBlock::iterator mi = mbb->begin(), miEnd = mbb->end(); for (MachineBasicBlock::iterator mi = mbb->begin(), miEnd = mbb->end();
mi != miEnd; ++mi) { mi != miEnd; ++mi) {
MachineInstr* instr = *mi; MachineInstr* instr = *mi;
@ -296,12 +319,6 @@ void LiveIntervals::computeIntervals()
else else
handleVirtualRegisterDef(mbb, mi, reg); handleVirtualRegisterDef(mbb, mi, reg);
} }
// update weights
Reg2IntervalMap::iterator r2iit = r2iMap_.find(reg);
if (r2iit != r2iMap_.end() &&
reg >= MRegisterInfo::FirstVirtualRegister)
intervals_[r2iit->second].weight += pow(10.0F, loopDepth);
} }
} }
} }