mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-14 11:32:34 +00:00
Don't add <imp-def> operands during register rewriting.
LiveIntervals already adds <imp-def> operands for super-registers when a subreg def defines the whole register. Thus, it is not necessary to do it again when rewriting. In fact, the super-register imp-defs caused miscompilations because the late scheduler couldn't see that the super-register was read. We still add super-reg <imp-use,kill> operands when rewriting virtuals to physicals. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@113299 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
447e7ac913
commit
6b964cd211
@ -67,23 +67,16 @@ VirtRegRewriter::~VirtRegRewriter() {}
|
||||
/// Note that operands may be added, so the MO reference is no longer valid.
|
||||
static void substitutePhysReg(MachineOperand &MO, unsigned Reg,
|
||||
const TargetRegisterInfo &TRI) {
|
||||
if (unsigned SubIdx = MO.getSubReg()) {
|
||||
// Insert the physical subreg and reset the subreg field.
|
||||
MO.setReg(TRI.getSubReg(Reg, SubIdx));
|
||||
MO.setSubReg(0);
|
||||
if (MO.getSubReg()) {
|
||||
MO.substPhysReg(Reg, TRI);
|
||||
|
||||
// Any def, dead, and kill flags apply to the full virtual register, so they
|
||||
// also apply to the full physical register. Add imp-def/dead and imp-kill
|
||||
// as needed.
|
||||
// Any kill flags apply to the full virtual register, so they also apply to
|
||||
// the full physical register.
|
||||
// We assume that partial defs have already been decorated with a super-reg
|
||||
// <imp-def> operand by LiveIntervals.
|
||||
MachineInstr &MI = *MO.getParent();
|
||||
if (MO.isDef())
|
||||
if (MO.isDead())
|
||||
MI.addRegisterDead(Reg, &TRI, /*AddIfNotFound=*/ true);
|
||||
else
|
||||
MI.addRegisterDefined(Reg, &TRI);
|
||||
else if (!MO.isUndef() &&
|
||||
(MO.isKill() ||
|
||||
MI.isRegTiedToDefOperand(&MO-&MI.getOperand(0))))
|
||||
if (MO.isUse() && !MO.isUndef() &&
|
||||
(MO.isKill() || MI.isRegTiedToDefOperand(&MO-&MI.getOperand(0))))
|
||||
MI.addRegisterKilled(Reg, &TRI, /*AddIfNotFound=*/ true);
|
||||
} else {
|
||||
MO.setReg(Reg);
|
||||
|
Loading…
Reference in New Issue
Block a user