mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-13 04:30:23 +00:00
Handle register mask operands in setPhysRegsDeadExcept().
Calls that use register mask operands don't have implicit defs for returned values. The register mask operand handles the call clobber, but it always behaves like a set of dead defs. Add live implicit defs for any implicitly defined physregs that are actually used. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@149715 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
ae46a3362d
commit
77180e0b40
@ -792,6 +792,9 @@ public:
|
|||||||
|
|
||||||
/// setPhysRegsDeadExcept - Mark every physreg used by this instruction as
|
/// setPhysRegsDeadExcept - Mark every physreg used by this instruction as
|
||||||
/// dead except those in the UsedRegs list.
|
/// dead except those in the UsedRegs list.
|
||||||
|
///
|
||||||
|
/// On instructions with register mask operands, also add implicit-def
|
||||||
|
/// operands for all registers in UsedRegs.
|
||||||
void setPhysRegsDeadExcept(ArrayRef<unsigned> UsedRegs,
|
void setPhysRegsDeadExcept(ArrayRef<unsigned> UsedRegs,
|
||||||
const TargetRegisterInfo &TRI);
|
const TargetRegisterInfo &TRI);
|
||||||
|
|
||||||
|
@ -1795,8 +1795,13 @@ void MachineInstr::addRegisterDefined(unsigned IncomingReg,
|
|||||||
|
|
||||||
void MachineInstr::setPhysRegsDeadExcept(ArrayRef<unsigned> UsedRegs,
|
void MachineInstr::setPhysRegsDeadExcept(ArrayRef<unsigned> UsedRegs,
|
||||||
const TargetRegisterInfo &TRI) {
|
const TargetRegisterInfo &TRI) {
|
||||||
|
bool HasRegMask = false;
|
||||||
for (unsigned i = 0, e = getNumOperands(); i != e; ++i) {
|
for (unsigned i = 0, e = getNumOperands(); i != e; ++i) {
|
||||||
MachineOperand &MO = getOperand(i);
|
MachineOperand &MO = getOperand(i);
|
||||||
|
if (MO.isRegMask()) {
|
||||||
|
HasRegMask = true;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
if (!MO.isReg() || !MO.isDef()) continue;
|
if (!MO.isReg() || !MO.isDef()) continue;
|
||||||
unsigned Reg = MO.getReg();
|
unsigned Reg = MO.getReg();
|
||||||
if (!TargetRegisterInfo::isPhysicalRegister(Reg)) continue;
|
if (!TargetRegisterInfo::isPhysicalRegister(Reg)) continue;
|
||||||
@ -1810,6 +1815,13 @@ void MachineInstr::setPhysRegsDeadExcept(ArrayRef<unsigned> UsedRegs,
|
|||||||
// If there are no uses, including partial uses, the def is dead.
|
// If there are no uses, including partial uses, the def is dead.
|
||||||
if (Dead) MO.setIsDead();
|
if (Dead) MO.setIsDead();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// This is a call with a register mask operand.
|
||||||
|
// Mask clobbers are always dead, so add defs for the non-dead defines.
|
||||||
|
if (HasRegMask)
|
||||||
|
for (ArrayRef<unsigned>::iterator I = UsedRegs.begin(), E = UsedRegs.end();
|
||||||
|
I != E; ++I)
|
||||||
|
addRegisterDefined(*I, &TRI);
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned
|
unsigned
|
||||||
|
Loading…
Reference in New Issue
Block a user