When checking the fixed intervals, don't forget to check for register aliases.

This fixes PR621 and Regression/CodeGen/X86/2005-08-30-RegAllocAliasProblem.ll


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@23158 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Chris Lattner 2005-08-30 21:03:36 +00:00
parent 353f1dea50
commit e836ad6736

View File

@ -444,10 +444,16 @@ void RA::assignRegOrStackSlotAtInterval(LiveInterval* cur)
unsigned physReg = getFreePhysReg(cur); unsigned physReg = getFreePhysReg(cur);
if (physReg) { if (physReg) {
// We got a register. However, if it's in the fixed_ list, we might // We got a register. However, if it's in the fixed_ list, we might
// conflict with it. Check to see if we conflict with it. // conflict with it. Check to see if we conflict with it or any of its
// aliases.
std::set<unsigned> RegAliases;
for (const unsigned *AS = mri_->getAliasSet(physReg); *AS; ++AS)
RegAliases.insert(*AS);
bool ConflictsWithFixed = false; bool ConflictsWithFixed = false;
for (unsigned i = 0, e = fixed_.size(); i != e; ++i) { for (unsigned i = 0, e = fixed_.size(); i != e; ++i) {
if (physReg == fixed_[i].first->reg) { if (physReg == fixed_[i].first->reg ||
RegAliases.count(fixed_[i].first->reg)) {
// Okay, this reg is on the fixed list. Check to see if we actually // Okay, this reg is on the fixed list. Check to see if we actually
// conflict. // conflict.
IntervalPtr &IP = fixed_[i]; IntervalPtr &IP = fixed_[i];
@ -457,11 +463,11 @@ void RA::assignRegOrStackSlotAtInterval(LiveInterval* cur)
IP.second = II; IP.second = II;
if (II != I->begin() && II->start > StartPosition) if (II != I->begin() && II->start > StartPosition)
--II; --II;
if (cur->overlapsFrom(*I, II)) if (cur->overlapsFrom(*I, II)) {
ConflictsWithFixed = true; ConflictsWithFixed = true;
break;
}
} }
break;
} }
} }