summaryrefslogtreecommitdiffstats
path: root/llvm/lib
diff options
context:
space:
mode:
authorAlkis Evlogimenos <alkis@evlogimenos.com>2003-12-24 15:44:53 +0000
committerAlkis Evlogimenos <alkis@evlogimenos.com>2003-12-24 15:44:53 +0000
commiteeea81483f913a6803fc7e6326df6453b5b35eb1 (patch)
treee11f9743cbe2ffc7489030d3a2c9d31484262577 /llvm/lib
parent4688edb69d0d10cd1b89eaf5b71597af1bfa93a8 (diff)
downloadbcm5719-llvm-eeea81483f913a6803fc7e6326df6453b5b35eb1.tar.gz
bcm5719-llvm-eeea81483f913a6803fc7e6326df6453b5b35eb1.zip
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). llvm-svn: 10603
Diffstat (limited to 'llvm/lib')
-rw-r--r--llvm/lib/CodeGen/LiveIntervals.cpp37
1 files changed, 27 insertions, 10 deletions
diff --git a/llvm/lib/CodeGen/LiveIntervals.cpp b/llvm/lib/CodeGen/LiveIntervals.cpp
index e4b134bc9d5..b34a65bc644 100644
--- a/llvm/lib/CodeGen/LiveIntervals.cpp
+++ b/llvm/lib/CodeGen/LiveIntervals.cpp
@@ -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);
}
}
}
OpenPOWER on IntegriCloud