mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-29 10:32:47 +00:00
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:
parent
353f1dea50
commit
e836ad6736
@ -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;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user