mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-02-16 00:33:10 +00:00
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:
parent
71f0a828a6
commit
7a40eaacee
@ -106,6 +106,33 @@ bool LiveIntervals::runOnMachineFunction(MachineFunction &fn) {
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
@ -255,8 +282,6 @@ void LiveIntervals::computeIntervals()
|
||||
{
|
||||
DEBUG(std::cerr << "computing live intervals:\n");
|
||||
|
||||
const LoopInfo& loopInfo = getAnalysis<LoopInfo>();
|
||||
|
||||
for (MbbIndex2MbbMap::iterator
|
||||
it = mbbi2mbbMap_.begin(), itEnd = mbbi2mbbMap_.end();
|
||||
it != itEnd; ++it) {
|
||||
@ -264,8 +289,6 @@ void LiveIntervals::computeIntervals()
|
||||
DEBUG(std::cerr << "machine basic block: "
|
||||
<< mbb->getBasicBlock()->getName() << "\n");
|
||||
|
||||
unsigned loopDepth = loopInfo.getLoopDepth(mbb->getBasicBlock());
|
||||
|
||||
for (MachineBasicBlock::iterator mi = mbb->begin(), miEnd = mbb->end();
|
||||
mi != miEnd; ++mi) {
|
||||
MachineInstr* instr = *mi;
|
||||
@ -296,12 +319,6 @@ void LiveIntervals::computeIntervals()
|
||||
else
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user