When checking the fixed intervals, don't forget to check for register aliases.
authorChris Lattner <sabre@nondot.org>
Tue, 30 Aug 2005 21:03:36 +0000 (21:03 +0000)
committerChris Lattner <sabre@nondot.org>
Tue, 30 Aug 2005 21:03:36 +0000 (21:03 +0000)
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

lib/CodeGen/RegAllocLinearScan.cpp

index 06682dd11e651d021ef60506a50cd3e87590a95d..584316ecd761af57f38265b12f586c6808a22a94 100644 (file)
@@ -444,10 +444,16 @@ void RA::assignRegOrStackSlotAtInterval(LiveInterval* cur)
   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) {
-      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];
@@ -457,11 +463,11 @@ void RA::assignRegOrStackSlotAtInterval(LiveInterval* cur)
           IP.second = II;
           if (II != I->begin() && II->start > StartPosition)
             --II;
-          if (cur->overlapsFrom(*I, II))
+          if (cur->overlapsFrom(*I, II)) {
             ConflictsWithFixed = true;
+            break;
+          }
         }
-  
-        break;
       }
     }