mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-11-02 07:11:49 +00:00
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. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@97838 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
a76e816844
commit
53e000bac3
@ -365,27 +365,7 @@ bool LiveVariables::HandlePhysRegKill(unsigned Reg, MachineInstr *MI) {
|
||||
}
|
||||
}
|
||||
|
||||
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 if (!PhysRegUse[Reg]) {
|
||||
if (!PhysRegUse[Reg]) {
|
||||
// Partial uses. Mark register def dead and add implicit def of
|
||||
// sub-registers which are used.
|
||||
// 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)
|
||||
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
|
||||
LastRefOrPartRef->addRegisterKilled(Reg, TRI, 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
|
||||
|
||||
@g_3 = external global i16 ; <i16*> [#uses=1]
|
||||
|
Loading…
Reference in New Issue
Block a user