Remove move copies and dead stuff by not clobbering the result reg of a noop copy.

llvm-svn: 25926
This commit is contained in:
Chris Lattner 2006-02-03 03:16:14 +00:00
parent 1318240fd0
commit e18ef0d4a6
1 changed files with 21 additions and 12 deletions

View File

@ -607,6 +607,15 @@ void LocalSpiller::RewriteMBB(MachineBasicBlock &MBB, const VirtRegMap &VRM) {
}
if (!OpTakenCareOf) {
// Check to see if this is a noop copy. If so, eliminate the
// instruction before considering the dest reg to be changed.
unsigned Src, Dst;
if (TII->isMoveInstr(MI, Src, Dst) && Src == Dst) {
++NumDCE;
DEBUG(std::cerr << "Removing now-noop copy: " << MI);
MBB.erase(&MI);
goto ProcessNextInst;
}
ClobberPhysReg(VirtReg, SpillSlotsAvailable, PhysRegsAvailable);
continue;
}
@ -631,6 +640,18 @@ void LocalSpiller::RewriteMBB(MachineBasicBlock &MBB, const VirtRegMap &VRM) {
DEBUG(std::cerr << "Store:\t" << *next(MII));
MI.SetMachineOperandReg(i, PhysReg);
// Check to see if this is a noop copy. If so, eliminate the
// instruction before considering the dest reg to be changed.
{
unsigned Src, Dst;
if (TII->isMoveInstr(MI, Src, Dst) && Src == Dst) {
++NumDCE;
DEBUG(std::cerr << "Removing now-noop copy: " << MI);
MBB.erase(&MI);
goto ProcessNextInst;
}
}
// If there is a dead store to this stack slot, nuke it now.
MachineInstr *&LastStore = MaybeDeadStores[StackSlot];
if (LastStore) {
@ -654,18 +675,6 @@ void LocalSpiller::RewriteMBB(MachineBasicBlock &MBB, const VirtRegMap &VRM) {
++NumStores;
}
}
// Okay, the instruction has been completely processed, input and output
// registers have been added. As a final sanity check, make sure this is
// not a noop-copy. If it is, nuke it.
{
unsigned Src, Dst;
if (TII->isMoveInstr(MI, Src, Dst) && Src == Dst) {
++NumDCE;
DEBUG(std::cerr << "Removing now-noop copy: " << MI);
MBB.erase(&MI);
}
}
ProcessNextInst:
MII = NextMII;
}