[llvm-commits] CVS: llvm/lib/CodeGen/RegAllocSimple.cpp
Misha Brukman
brukman at cs.uiuc.edu
Fri Dec 13 05:34:00 PST 2002
Changes in directory llvm/lib/CodeGen:
RegAllocSimple.cpp updated: 1.9 -> 1.10
---
Log message:
This should be more correct: invalidates physical registers that are used in
an instruction to avoid using them to allocate to other virtual registers.
---
Diffs of the changes:
Index: llvm/lib/CodeGen/RegAllocSimple.cpp
diff -u llvm/lib/CodeGen/RegAllocSimple.cpp:1.9 llvm/lib/CodeGen/RegAllocSimple.cpp:1.10
--- llvm/lib/CodeGen/RegAllocSimple.cpp:1.9 Fri Dec 13 04:42:31 2002
+++ llvm/lib/CodeGen/RegAllocSimple.cpp Fri Dec 13 05:33:22 2002
@@ -79,6 +79,36 @@
RegClassIdx.clear();
}
+ /// Invalidates any references, real or implicit, to physical registers
+ ///
+ void invalidatePhysRegs(const MachineInstr *MI) {
+ unsigned Opcode = MI->getOpcode();
+ const MachineInstrInfo &MII = TM.getInstrInfo();
+ const MachineInstrDescriptor &Desc = MII.get(Opcode);
+ const unsigned *regs = Desc.ImplicitUses;
+ while (*regs)
+ RegsUsed[*regs++] = 1;
+
+ regs = Desc.ImplicitDefs;
+ while (*regs)
+ RegsUsed[*regs++] = 1;
+
+
+ /*
+ for (int i = MI->getNumOperands() - 1; i >= 0; --i) {
+ const MachineOperand &op = MI->getOperand(i);
+ if (op.isMachineRegister())
+ RegsUsed[op.getAllocatedRegNum()] = 1;
+ }
+
+ for (int i = MI->getNumImplicitRefs() - 1; i >= 0; --i) {
+ const MachineOperand &op = MI->getImplicitOp(i);
+ if (op.isMachineRegister())
+ RegsUsed[op.getAllocatedRegNum()] = 1;
+ }
+ */
+ }
+
void cleanupAfterFunction() {
RegMap.clear();
SSA2PhysRegMap.clear();
@@ -222,6 +252,12 @@
// get rid of the phi
MBB->erase(MBB->begin());
+ // a preliminary pass that will invalidate any registers that
+ // are used by the instruction (including implicit uses)
+ invalidatePhysRegs(MI);
+
+ DEBUG(std::cerr << "num invalid regs: " << RegsUsed.size() << "\n");
+
DEBUG(std::cerr << "num ops: " << MI->getNumOperands() << "\n");
MachineOperand &targetReg = MI->getOperand(0);
@@ -285,13 +321,13 @@
saveVirtRegToStack(opBlock, opI, virtualReg, opPhysReg);
}
}
+
+ // make regs available to other instructions
+ clearAllRegs();
}
// really delete the instruction
delete MI;
-
- // make regs available to other instructions
- clearAllRegs();
}
//loop over each basic block
@@ -299,8 +335,9 @@
{
MachineInstr *MI = *I;
- // FIXME: add a preliminary pass that will invalidate any registers that
+ // a preliminary pass that will invalidate any registers that
// are used by the instruction (including implicit uses)
+ invalidatePhysRegs(MI);
// Loop over uses, move from memory into registers
for (int i = MI->getNumOperands() - 1; i >= 0; --i) {
More information about the llvm-commits
mailing list