Better handling of dead super registers in LiveVariables. We used to do this:
CALL ... %RAX<imp-def> ... [not using %RAX] %EAX = ..., %RAX<imp-use, kill> RET %EAX<imp-use,kill> Now we do this: CALL ... %RAX<imp-def, dead> ... [not using %RAX] %EAX = ... RET %EAX<imp-use,kill> By not artificially keeping %RAX alive, we lower register pressure a bit. The correct number of instructions for 2008-08-05-SpillerBug.ll is obviously 55, anybody can see that. Sheesh. llvm-svn: 97838
This commit is contained in:
@@ -365,27 +365,7 @@ bool LiveVariables::HandlePhysRegKill(unsigned Reg, MachineInstr *MI) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (LastRefOrPartRef == PhysRegDef[Reg] && LastRefOrPartRef != MI) {
|
if (!PhysRegUse[Reg]) {
|
||||||
if (LastPartDef)
|
|
||||||
// The last partial def kills the register.
|
|
||||||
LastPartDef->addOperand(MachineOperand::CreateReg(Reg, false/*IsDef*/,
|
|
||||||
true/*IsImp*/, true/*IsKill*/));
|
|
||||||
else {
|
|
||||||
MachineOperand *MO =
|
|
||||||
LastRefOrPartRef->findRegisterDefOperand(Reg, false, TRI);
|
|
||||||
bool NeedEC = MO->isEarlyClobber() && MO->getReg() != Reg;
|
|
||||||
// If the last reference is the last def, then it's not used at all.
|
|
||||||
// That is, unless we are currently processing the last reference itself.
|
|
||||||
LastRefOrPartRef->addRegisterDead(Reg, TRI, true);
|
|
||||||
if (NeedEC) {
|
|
||||||
// If we are adding a subreg def and the superreg def is marked early
|
|
||||||
// clobber, add an early clobber marker to the subreg def.
|
|
||||||
MO = LastRefOrPartRef->findRegisterDefOperand(Reg);
|
|
||||||
if (MO)
|
|
||||||
MO->setIsEarlyClobber();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else if (!PhysRegUse[Reg]) {
|
|
||||||
// Partial uses. Mark register def dead and add implicit def of
|
// Partial uses. Mark register def dead and add implicit def of
|
||||||
// sub-registers which are used.
|
// sub-registers which are used.
|
||||||
// EAX<dead> = op AL<imp-def>
|
// EAX<dead> = op AL<imp-def>
|
||||||
@@ -419,6 +399,26 @@ bool LiveVariables::HandlePhysRegKill(unsigned Reg, MachineInstr *MI) {
|
|||||||
for (const unsigned *SS = TRI->getSubRegisters(SubReg); *SS; ++SS)
|
for (const unsigned *SS = TRI->getSubRegisters(SubReg); *SS; ++SS)
|
||||||
PartUses.erase(*SS);
|
PartUses.erase(*SS);
|
||||||
}
|
}
|
||||||
|
} else if (LastRefOrPartRef == PhysRegDef[Reg] && LastRefOrPartRef != MI) {
|
||||||
|
if (LastPartDef)
|
||||||
|
// The last partial def kills the register.
|
||||||
|
LastPartDef->addOperand(MachineOperand::CreateReg(Reg, false/*IsDef*/,
|
||||||
|
true/*IsImp*/, true/*IsKill*/));
|
||||||
|
else {
|
||||||
|
MachineOperand *MO =
|
||||||
|
LastRefOrPartRef->findRegisterDefOperand(Reg, false, TRI);
|
||||||
|
bool NeedEC = MO->isEarlyClobber() && MO->getReg() != Reg;
|
||||||
|
// If the last reference is the last def, then it's not used at all.
|
||||||
|
// That is, unless we are currently processing the last reference itself.
|
||||||
|
LastRefOrPartRef->addRegisterDead(Reg, TRI, true);
|
||||||
|
if (NeedEC) {
|
||||||
|
// If we are adding a subreg def and the superreg def is marked early
|
||||||
|
// clobber, add an early clobber marker to the subreg def.
|
||||||
|
MO = LastRefOrPartRef->findRegisterDefOperand(Reg);
|
||||||
|
if (MO)
|
||||||
|
MO->setIsEarlyClobber();
|
||||||
|
}
|
||||||
|
}
|
||||||
} else
|
} else
|
||||||
LastRefOrPartRef->addRegisterKilled(Reg, TRI, true);
|
LastRefOrPartRef->addRegisterKilled(Reg, TRI, true);
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
; RUN: llc < %s -mtriple=i386-apple-darwin -disable-fp-elim -stats |& grep asm-printer | grep 58
|
; RUN: llc < %s -mtriple=i386-apple-darwin -disable-fp-elim -stats |& grep asm-printer | grep 55
|
||||||
; PR2568
|
; PR2568
|
||||||
|
|
||||||
@g_3 = external global i16 ; <i16*> [#uses=1]
|
@g_3 = external global i16 ; <i16*> [#uses=1]
|
||||||
|
|||||||
Reference in New Issue
Block a user