summaryrefslogtreecommitdiffstats
path: root/llvm/lib/CodeGen/LiveIntervals.cpp
diff options
context:
space:
mode:
authorAlkis Evlogimenos <alkis@evlogimenos.com>2004-04-12 17:39:20 +0000
committerAlkis Evlogimenos <alkis@evlogimenos.com>2004-04-12 17:39:20 +0000
commit0ede7ec4f8559901b0cd42439617429bd311ed73 (patch)
tree65da62612e63f004c7d2417b778e031c8571a374 /llvm/lib/CodeGen/LiveIntervals.cpp
parentb7147b33a032510c59940c78841ea6ec2dc88948 (diff)
downloadbcm5719-llvm-0ede7ec4f8559901b0cd42439617429bd311ed73.tar.gz
bcm5719-llvm-0ede7ec4f8559901b0cd42439617429bd311ed73.zip
Correctly compute spill weights
llvm-svn: 12869
Diffstat (limited to 'llvm/lib/CodeGen/LiveIntervals.cpp')
-rw-r--r--llvm/lib/CodeGen/LiveIntervals.cpp37
1 files changed, 19 insertions, 18 deletions
diff --git a/llvm/lib/CodeGen/LiveIntervals.cpp b/llvm/lib/CodeGen/LiveIntervals.cpp
index 7665d8774d5..371dfd1c345 100644
--- a/llvm/lib/CodeGen/LiveIntervals.cpp
+++ b/llvm/lib/CodeGen/LiveIntervals.cpp
@@ -133,24 +133,10 @@ bool LiveIntervals::runOnMachineFunction(MachineFunction &fn) {
for (MachineBasicBlock::iterator mii = mbb->begin(), mie = mbb->end();
mii != mie; ) {
- for (unsigned i = 0; i < mii->getNumOperands(); ++i) {
- const MachineOperand& mop = mii->getOperand(i);
- if (mop.isRegister() && mop.getReg()) {
- // replace register with representative register
- unsigned reg = rep(mop.getReg());
- mii->SetMachineOperandReg(i, reg);
-
- if (MRegisterInfo::isVirtualRegister(reg)) {
- Reg2IntervalMap::iterator r2iit = r2iMap_.find(reg);
- assert(r2iit != r2iMap_.end());
- r2iit->second->weight += pow(10.0F, loopDepth);
- }
- }
- }
-
- // if the move is now an identity move delete it
+ // if the move will be an identity move delete it
unsigned srcReg, dstReg;
- if (tii.isMoveInstr(*mii, srcReg, dstReg) && srcReg == dstReg) {
+ if (tii.isMoveInstr(*mii, srcReg, dstReg) &&
+ rep(srcReg) == rep(dstReg)) {
// remove from def list
Interval& interval = getOrCreateInterval(dstReg);
unsigned defIndex = getInstructionIndex(mii);
@@ -168,8 +154,23 @@ bool LiveIntervals::runOnMachineFunction(MachineFunction &fn) {
mii = mbbi->erase(mii);
++numPeep;
}
- else
+ else {
+ for (unsigned i = 0; i < mii->getNumOperands(); ++i) {
+ const MachineOperand& mop = mii->getOperand(i);
+ if (mop.isRegister() && mop.getReg() &&
+ MRegisterInfo::isVirtualRegister(mop.getReg())) {
+ // replace register with representative register
+ unsigned reg = rep(mop.getReg());
+ mii->SetMachineOperandReg(i, reg);
+
+ Reg2IntervalMap::iterator r2iit = r2iMap_.find(reg);
+ assert(r2iit != r2iMap_.end());
+ r2iit->second->weight +=
+ (mop.isUse() + mop.isDef()) * pow(10.0F, loopDepth);
+ }
+ }
++mii;
+ }
}
}
OpenPOWER on IntegriCloud