From 6a6328ba3d007b2e5a71131793179ef96d4bee7d Mon Sep 17 00:00:00 2001 From: Jakob Stoklund Olesen Date: Fri, 14 May 2010 22:40:43 +0000 Subject: [PATCH] Don't bother spilling before a return git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@103831 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/RegAllocFast.cpp | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/lib/CodeGen/RegAllocFast.cpp b/lib/CodeGen/RegAllocFast.cpp index 651f010a71e..2a66cb12d95 100644 --- a/lib/CodeGen/RegAllocFast.cpp +++ b/lib/CodeGen/RegAllocFast.cpp @@ -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