Don't bother spilling before a return
authorJakob Stoklund Olesen <stoklund@2pi.dk>
Fri, 14 May 2010 22:40:43 +0000 (22:40 +0000)
committerJakob Stoklund Olesen <stoklund@2pi.dk>
Fri, 14 May 2010 22:40:43 +0000 (22:40 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@103831 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/RegAllocFast.cpp

index 651f010a71eb6808ee0dc24b67a2e4882c9c4267..2a66cb12d953acb11dc21ecc4df405571072f252 100644 (file)
@@ -768,11 +768,20 @@ void RAFast::AllocateBasicBlock(MachineBasicBlock &MBB) {
 
   // Spill all physical registers holding virtual registers now.
   atEndOfBlock = true;
-  DEBUG(dbgs() << "Killing live registers at end of block.\n");
   MachineBasicBlock::iterator MI = MBB.getFirstTerminator();
-  for (LiveRegMap::iterator i = LiveVirtRegs.begin(), e = LiveVirtRegs.end();
-       i != e; ++i)
-    spillVirtReg(MBB, MI, i, true);
+  if (MI != MBB.end() && MI->getDesc().isReturn()) {
+    // This is a return block, kill all virtual registers.
+    DEBUG(dbgs() << "Killing live registers at end of return block.\n");
+    for (LiveRegMap::iterator i = LiveVirtRegs.begin(), e = LiveVirtRegs.end();
+         i != e; ++i)
+      killVirtReg(i);
+  } else {
+    // This is a normal block, spill any dirty virtregs.
+    DEBUG(dbgs() << "Spilling live registers at end of block.\n");
+    for (LiveRegMap::iterator i = LiveVirtRegs.begin(), e = LiveVirtRegs.end();
+        i != e; ++i)
+      spillVirtReg(MBB, MI, i, true);
+  }
   LiveVirtRegs.clear();
 
   // Erase all the coalesced copies. We are delaying it until now because