[llvm-commits] [llvm] r54930 - /llvm/trunk/lib/CodeGen/LiveIntervalAnalysis.cpp
Owen Anderson
resistor at mac.com
Mon Aug 18 11:38:13 PDT 2008
Author: resistor
Date: Mon Aug 18 13:38:12 2008
New Revision: 54930
URL: http://llvm.org/viewvc/llvm-project?rev=54930&view=rev
Log:
Simplify the fast-patch interval spilling by using MachineRegisterInfo::reg_iterator.
Modified:
llvm/trunk/lib/CodeGen/LiveIntervalAnalysis.cpp
Modified: llvm/trunk/lib/CodeGen/LiveIntervalAnalysis.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/LiveIntervalAnalysis.cpp?rev=54930&r1=54929&r2=54930&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/LiveIntervalAnalysis.cpp (original)
+++ llvm/trunk/lib/CodeGen/LiveIntervalAnalysis.cpp Mon Aug 18 13:38:12 2008
@@ -1618,83 +1618,61 @@
const TargetRegisterClass* rc = mri_->getRegClass(li.reg);
- for (LiveInterval::Ranges::const_iterator
- i = li.ranges.begin(), e = li.ranges.end(); i != e; ++i) {
- unsigned index = getBaseIndex(i->start);
- unsigned end = getBaseIndex(i->end-1) + InstrSlots::NUM;
- for (; index != end; index += InstrSlots::NUM) {
- // skip deleted instructions
- while (index != end && !getInstructionFromIndex(index))
- index += InstrSlots::NUM;
- if (index == end) break;
-
- MachineInstr *MI = getInstructionFromIndex(index);
+ DenseMap<MachineInstr*, unsigned> VRegMap;
+ DenseMap<MachineInstr*, VNInfo*> VNMap;
- for (unsigned i = 0; i != MI->getNumOperands(); ++i) {
- MachineOperand& mop = MI->getOperand(i);
- if (mop.isRegister() && mop.getReg() == li.reg) {
- // Create a new virtual register for the spill interval.
- unsigned NewVReg = mri_->createVirtualRegister(rc);
-
- // Scan all of the operands of this instruction rewriting operands
- // to use NewVReg instead of li.reg as appropriate. We do this for
- // two reasons:
- //
- // 1. If the instr reads the same spilled vreg multiple times, we
- // want to reuse the NewVReg.
- // 2. If the instr is a two-addr instruction, we are required to
- // keep the src/dst regs pinned.
- //
- // Keep track of whether we replace a use and/or def so that we can
- // create the spill interval with the appropriate range.
- mop.setReg(NewVReg);
-
- bool HasUse = mop.isUse();
- bool HasDef = mop.isDef();
- for (unsigned j = i+1, e = MI->getNumOperands(); j != e; ++j) {
- if (MI->getOperand(j).isReg() &&
- MI->getOperand(j).getReg() == li.reg) {
- MI->getOperand(j).setReg(NewVReg);
- HasUse |= MI->getOperand(j).isUse();
- HasDef |= MI->getOperand(j).isDef();
- }
- }
-
- // create a new register for this spill
- vrm.grow();
- vrm.assignVirt2StackSlot(NewVReg, slot);
- LiveInterval &nI = getOrCreateInterval(NewVReg);
- assert(nI.empty());
-
- // the spill weight is now infinity as it
- // cannot be spilled again
- nI.weight = HUGE_VALF;
-
- if (HasUse) {
- LiveRange LR(getLoadIndex(index), getUseIndex(index),
- nI.getNextValue(~0U, 0, getVNInfoAllocator()));
- DOUT << " +" << LR;
- nI.addRange(LR);
- }
- if (HasDef) {
- LiveRange LR(getDefIndex(index), getStoreIndex(index),
- nI.getNextValue(~0U, 0, getVNInfoAllocator()));
- DOUT << " +" << LR;
- nI.addRange(LR);
- }
-
- added.push_back(&nI);
-
- // update live variables if it is available
- if (lv_)
- lv_->addVirtualRegisterKilled(NewVReg, MI);
-
- DOUT << "\t\t\t\tadded new interval: ";
- DEBUG(nI.dump());
- DOUT << '\n';
- }
- }
+ for (MachineRegisterInfo::reg_iterator RI = mri_->reg_begin(li.reg),
+ RE = mri_->reg_end(); RI != RE; ) {
+ // Create a new virtual register for the spill interval.
+ MachineOperand& MO = RI.getOperand();
+ unsigned NewVReg = 0;
+ if (!VRegMap.count(MO.getParent()))
+ VRegMap[MO.getParent()] = NewVReg = mri_->createVirtualRegister(rc);
+ else
+ NewVReg = VRegMap[MO.getParent()];
+
+ // Increment iterator to avoid invalidation.
+ ++RI;
+
+ MO.setReg(NewVReg);
+
+ // create a new register for this spill
+ vrm.grow();
+ vrm.assignVirt2StackSlot(NewVReg, slot);
+ LiveInterval &nI = getOrCreateInterval(NewVReg);
+ assert(nI.empty());
+
+ // the spill weight is now infinity as it
+ // cannot be spilled again
+ nI.weight = HUGE_VALF;
+
+ unsigned index = getInstructionIndex(MO.getParent());
+ bool HasUse = MO.isUse();
+ bool HasDef = MO.isDef();
+ if (!VNMap.count(MO.getParent()))
+ VNMap[MO.getParent()] = nI.getNextValue(~0U, 0, getVNInfoAllocator());
+ if (HasUse) {
+ LiveRange LR(getLoadIndex(index), getUseIndex(index),
+ VNMap[MO.getParent()]);
+ DOUT << " +" << LR;
+ nI.addRange(LR);
+ }
+ if (HasDef) {
+ LiveRange LR(getDefIndex(index), getStoreIndex(index),
+ VNMap[MO.getParent()]);
+ DOUT << " +" << LR;
+ nI.addRange(LR);
}
+
+ added.push_back(&nI);
+
+ // update live variables if it is available
+ if (lv_)
+ lv_->addVirtualRegisterKilled(NewVReg, MO.getParent());
+
+ DOUT << "\t\t\t\tadded new interval: ";
+ DEBUG(nI.dump());
+ DOUT << '\n';
}
SSWeight = HUGE_VALF;
More information about the llvm-commits
mailing list