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
unsigned physReg = getFreePhysReg(cur);
if (physReg) {
// We got a register. However, if it's in the fixed_ list, we might
unsigned physReg = getFreePhysReg(cur);
if (physReg) {
// 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;
for (unsigned i = 0, e = fixed_.size(); i != e; ++i) {
bool ConflictsWithFixed = false;
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
// conflict.
IntervalPtr &IP = fixed_[i];
// Okay, this reg is on the fixed list. Check to see if we actually
// conflict.
IntervalPtr &IP = fixed_[i];
IP.second = II;
if (II != I->begin() && II->start > StartPosition)
--II;
IP.second = II;
if (II != I->begin() && II->start > StartPosition)
--II;
- if (cur->overlapsFrom(*I, II))
+ if (cur->overlapsFrom(*I, II)) {
ConflictsWithFixed = true;
ConflictsWithFixed = true;