Fix for PR1596: AdjustCopiesBackFrom() should conservatively check if any of its sub-registers may overlap with the interval of the copy that's being coalesced.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@41084 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Evan Cheng 2007-08-14 23:19:28 +00:00
parent c91f0b8068
commit dc5294fd83

View File

@ -125,6 +125,19 @@ bool SimpleRegisterCoalescing::AdjustCopiesBackFrom(LiveInterval &IntA, LiveInte
// live-range starts. If there are no intervening live ranges between them in
// IntB, we can merge them.
if (ValLR+1 != BLR) return false;
// If a live interval is a physical register, conservatively check if any
// of its sub-registers is overlapping the live interval of the virtual
// register. If so, do not coalesce.
if (MRegisterInfo::isPhysicalRegister(IntB.reg) &&
*mri_->getSubRegisters(IntB.reg)) {
for (const unsigned* SR = mri_->getSubRegisters(IntB.reg); *SR; ++SR)
if (li_->hasInterval(*SR) && IntA.overlaps(li_->getInterval(*SR))) {
DOUT << "Interfere with sub-register ";
DEBUG(li_->getInterval(*SR).print(DOUT, mri_));
return false;
}
}
DOUT << "\nExtending: "; IntB.print(DOUT, mri_);