Fix bugs handling ESP in alloca references
authorChris Lattner <sabre@nondot.org>
Tue, 5 Aug 2003 04:13:58 +0000 (04:13 +0000)
committerChris Lattner <sabre@nondot.org>
Tue, 5 Aug 2003 04:13:58 +0000 (04:13 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@7591 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/RegAllocLocal.cpp

index bf1670229ae18283765f9af1d84fc577ed88a2af..1b84b30f57f0970c5c02f017f663f69850d2f607 100644 (file)
@@ -232,7 +232,8 @@ void RA::removePhysReg(unsigned PhysReg) {
 ///
 void RA::spillVirtReg(MachineBasicBlock &MBB, MachineBasicBlock::iterator &I,
                       unsigned VirtReg, unsigned PhysReg) {
-  assert((VirtReg || DisableKill) && "Spilling a physical register is illegal!"
+  if (!VirtReg && DisableKill) return;
+  assert(VirtReg && "Spilling a physical register is illegal!"
          " Must not have appropriate kill for the register or use exists beyond"
          " the intended one.");
   DEBUG(std::cerr << "  Spilling register " << RegInfo->getName(PhysReg);
@@ -606,8 +607,10 @@ void RA::AllocateBasicBlock(MachineBasicBlock &MBB) {
 
   // Spill all physical registers holding virtual registers now.
   while (!PhysRegsUsed.empty())
-    spillVirtReg(MBB, I, PhysRegsUsed.begin()->second,
-                 PhysRegsUsed.begin()->first);
+    if (unsigned VirtReg = PhysRegsUsed.begin()->second)
+      spillVirtReg(MBB, I, VirtReg, PhysRegsUsed.begin()->first);
+    else
+      removePhysReg(PhysRegsUsed.begin()->first);
 
   for (std::map<unsigned, unsigned>::iterator I = Virt2PhysRegMap.begin(),
          E = Virt2PhysRegMap.end(); I != E; ++I)