Properly compose subregister indices when coalescing.

The comment about ordering of subreg indices is no longer true.
This exposed a bug in the new substVirtReg method that is also fixed.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@105294 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Jakob Stoklund Olesen 2010-06-01 22:39:25 +00:00
parent 23d3d4595c
commit a5135f60dd
2 changed files with 3 additions and 14 deletions

View File

@ -117,7 +117,8 @@ void MachineOperand::substVirtReg(unsigned Reg, unsigned SubIdx,
if (SubIdx && getSubReg())
SubIdx = TRI.composeSubRegIndices(SubIdx, getSubReg());
setReg(Reg);
setSubReg(SubIdx);
if (SubIdx)
setSubReg(SubIdx);
}
void MachineOperand::substPhysReg(unsigned Reg, const TargetRegisterInfo &TRI) {

View File

@ -848,19 +848,7 @@ SimpleRegisterCoalescing::UpdateRegDefsUses(unsigned SrcReg, unsigned DstReg,
continue;
}
// Sub-register indexes goes from small to large. e.g.
// RAX: 1 -> AL, 2 -> AX, 3 -> EAX
// EAX: 1 -> AL, 2 -> AX
// So RAX's sub-register 2 is AX, RAX's sub-regsiter 3 is EAX, whose
// sub-register 2 is also AX.
//
// FIXME: Properly compose subreg indices for all targets.
//
if (SubIdx && OldSubIdx && SubIdx != OldSubIdx)
;
else if (SubIdx)
O.setSubReg(SubIdx);
O.setReg(DstReg);
O.substVirtReg(DstReg, SubIdx, *tri_);
DEBUG({
dbgs() << "\t\tupdated: ";