ok, this is something of a dirty hack, but it seems to work. (fixes e.g.
authorDuraid Madina <duraid@octopus.com.au>
Wed, 27 Jun 2007 09:01:14 +0000 (09:01 +0000)
committerDuraid Madina <duraid@octopus.com.au>
Wed, 27 Jun 2007 09:01:14 +0000 (09:01 +0000)
the SPASS miscompilation)

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

lib/CodeGen/RegAllocBigBlock.cpp

index 400d72ae51467d5a33dd74c3acf3304f3e388018..c7f23f51d4b1184dc21d9b9e466616fbbb996dc0 100644 (file)
@@ -459,9 +459,23 @@ unsigned RABigBlock::chooseReg(MachineBasicBlock &MBB, MachineInstr *I,
         }
       }
     }
+
+    if(PhysReg == 0) { // ok, now we're desperate. We couldn't choose
+                       // a register to spill by looking through the
+                       // read timetable, so now we just spill the
+                       // first allocatable register we find.
+                       
+      // for all physical regs in the RC,
+      for(TargetRegisterClass::iterator pReg = RC->begin(); 
+                                        pReg != RC->end();  ++pReg) {
+        // if we find a register we can spill
+        if(PhysRegsUsed[*pReg]>=-1)
+          PhysReg = *pReg; // choose it to be spilled
+      }
+    }
     
-    assert(PhysReg && "couldn't grab a register from the table?");
-    // TODO: assert that RC->contains(PhysReg) / handle aliased registers
+    assert(PhysReg && "couldn't choose a register to spill :( ");
+    // TODO: assert that RC->contains(PhysReg) / handle aliased registers?
 
     // since we needed to look in the table we need to spill this register.
     spillPhysReg(MBB, I, PhysReg);