Fix Regression/CodeGen/Generic/2006-09-02-LocalAllocCrash.ll on X86.
authorChris Lattner <sabre@nondot.org>
Sun, 3 Sep 2006 07:15:37 +0000 (07:15 +0000)
committerChris Lattner <sabre@nondot.org>
Sun, 3 Sep 2006 07:15:37 +0000 (07:15 +0000)
Just because an alias of a register is available, it doesn't mean that we
can arbitrarily evict the register.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@30064 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/RegAllocLocal.cpp

index c435c34f49e0ef85368c75851a3f01c382c02aad..e3f3ab6fa3fab557ed8c8dbb32e61d6334e060c2 100644 (file)
@@ -103,8 +103,8 @@ namespace {
     }
 
     void MarkPhysRegRecentlyUsed(unsigned Reg) {
-      if(PhysRegsUseOrder.empty() ||
-         PhysRegsUseOrder.back() == Reg) return;  // Already most recently used
+      if (PhysRegsUseOrder.empty() ||
+          PhysRegsUseOrder.back() == Reg) return;  // Already most recently used
 
       for (unsigned i = PhysRegsUseOrder.size(); i != 0; --i)
         if (areRegsEqual(Reg, PhysRegsUseOrder[i-1])) {
@@ -408,10 +408,15 @@ unsigned RA::getReg(MachineBasicBlock &MBB, MachineInstr *I,
         } else {
           // If one of the registers aliased to the current register is
           // compatible, use it.
-          for (const unsigned *AliasSet = RegInfo->getAliasSet(R);
-               *AliasSet; ++AliasSet) {
-            if (RC->contains(*AliasSet)) {
-              PhysReg = *AliasSet;    // Take an aliased register
+          for (const unsigned *AliasIt = RegInfo->getAliasSet(R);
+               *AliasIt; ++AliasIt) {
+            if (RC->contains(*AliasIt) &&
+                // If this is pinned down for some reason, don't use it.  For
+                // example, if CL is pinned, and we run across CH, don't use
+                // CH as justification for using scavenging ECX (which will
+                // fail).
+                PhysRegsUsed[*AliasIt] != 0) {
+              PhysReg = *AliasIt;    // Take an aliased register
               break;
             }
           }