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:
Jakob Stoklund Olesen 2010-09-07 22:38:45 +00:00
parent 447e7ac913
commit 6b964cd211

View File

@ -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);