From 7a40eaaceec0af76d5b97610f3d4e7a47a19d245 Mon Sep 17 00:00:00 2001 From: Alkis Evlogimenos Date: Wed, 24 Dec 2003 15:44:53 +0000 Subject: [PATCH] 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 --- lib/CodeGen/LiveIntervalAnalysis.cpp | 37 ++++++++++++++++++++-------- 1 file changed, 27 insertions(+), 10 deletions(-) diff --git a/lib/CodeGen/LiveIntervalAnalysis.cpp b/lib/CodeGen/LiveIntervalAnalysis.cpp index e4b134bc9d5..b34a65bc644 100644 --- a/lib/CodeGen/LiveIntervalAnalysis.cpp +++ b/lib/CodeGen/LiveIntervalAnalysis.cpp @@ -106,6 +106,33 @@ bool LiveIntervals::runOnMachineFunction(MachineFunction &fn) { computeIntervals(); + // compute spill weights + const LoopInfo& loopInfo = getAnalysis(); + + 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(); - 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); } } }