Fix more places assuming subregisters have live intervals

llvm-svn: 107780
This commit is contained in:
Jakob Stoklund Olesen 2010-07-07 14:41:22 +00:00
parent 4e39130919
commit 8e1338eea8
1 changed files with 6 additions and 1 deletions

View File

@ -211,6 +211,8 @@ bool SimpleRegisterCoalescing::AdjustCopiesBackFrom(const CoalescerPair &CP,
// physreg has sub-registers, update their live intervals as well. // physreg has sub-registers, update their live intervals as well.
if (TargetRegisterInfo::isPhysicalRegister(IntB.reg)) { if (TargetRegisterInfo::isPhysicalRegister(IntB.reg)) {
for (const unsigned *SR = tri_->getSubRegisters(IntB.reg); *SR; ++SR) { for (const unsigned *SR = tri_->getSubRegisters(IntB.reg); *SR; ++SR) {
if (!li_->hasInterval(*SR))
continue;
LiveInterval &SRLI = li_->getInterval(*SR); LiveInterval &SRLI = li_->getInterval(*SR);
SRLI.addRange(LiveRange(FillerStart, FillerEnd, SRLI.addRange(LiveRange(FillerStart, FillerEnd,
SRLI.getNextValue(FillerStart, 0, true, SRLI.getNextValue(FillerStart, 0, true,
@ -392,7 +394,8 @@ bool SimpleRegisterCoalescing::RemoveCopyByCommutingDef(const CoalescerPair &CP,
// clobbers from the superreg. // clobbers from the superreg.
if (BHasSubRegs) if (BHasSubRegs)
for (const unsigned *SR = tri_->getSubRegisters(IntB.reg); *SR; ++SR) for (const unsigned *SR = tri_->getSubRegisters(IntB.reg); *SR; ++SR)
if (HasOtherReachingDefs(IntA, li_->getInterval(*SR), AValNo, 0)) if (li_->hasInterval(*SR) &&
HasOtherReachingDefs(IntA, li_->getInterval(*SR), AValNo, 0))
return false; return false;
// If some of the uses of IntA.reg is already coalesced away, return false. // If some of the uses of IntA.reg is already coalesced away, return false.
@ -498,6 +501,8 @@ bool SimpleRegisterCoalescing::RemoveCopyByCommutingDef(const CoalescerPair &CP,
VNInfo *DeadVNI = BDeadValNos[i]; VNInfo *DeadVNI = BDeadValNos[i];
if (BHasSubRegs) { if (BHasSubRegs) {
for (const unsigned *SR = tri_->getSubRegisters(IntB.reg); *SR; ++SR) { for (const unsigned *SR = tri_->getSubRegisters(IntB.reg); *SR; ++SR) {
if (!li_->hasInterval(*SR))
continue;
LiveInterval &SRLI = li_->getInterval(*SR); LiveInterval &SRLI = li_->getInterval(*SR);
if (const LiveRange *SRLR = SRLI.getLiveRangeContaining(DeadVNI->def)) if (const LiveRange *SRLR = SRLI.getLiveRangeContaining(DeadVNI->def))
SRLI.removeValNo(SRLR->valno); SRLI.removeValNo(SRLR->valno);