From: Chris Lattner Date: Wed, 5 Oct 2005 18:30:19 +0000 (+0000) Subject: Fix a bug in the local spiller, where we could take code like this: X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=22480c43504eca3092f79d9b42bdbb1b413e8e53;p=oota-llvm.git Fix a bug in the local spiller, where we could take code like this: store r12 -> [ss#2] R3 = load [ss#1] use R3 R3 = load [ss#2] R4 = load [ss#1] and turn it into this code: store R12 -> [ss#2] R3 = load [ss#1] use R3 R3 = R12 R4 = R3 <- oops! The problem was that promoting R3 = load[ss#2] to a copy missed the fact that the instruction invalidated R3 at that point. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@23638 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/CodeGen/VirtRegMap.cpp b/lib/CodeGen/VirtRegMap.cpp index 633cf2bf8de..f7306c5d0a2 100644 --- a/lib/CodeGen/VirtRegMap.cpp +++ b/lib/CodeGen/VirtRegMap.cpp @@ -490,11 +490,11 @@ void LocalSpiller::RewriteMBB(MachineBasicBlock &MBB, const VirtRegMap &VRM) { if (DestReg != It->second) { MRI->copyRegToReg(MBB, &MI, DestReg, It->second, MF.getSSARegMap()->getRegClass(VirtReg)); - // Revisit the copy if the destination is a vreg. - if (MRegisterInfo::isVirtualRegister(DestReg)) { - NextMII = &MI; - --NextMII; // backtrack to the copy. - } + // Revisit the copy so we make sure to notice the effects of the + // operation on the destreg (either needing to RA it if it's + // virtual or needing to clobber any values if it's physical). + NextMII = &MI; + --NextMII; // backtrack to the copy. } MBB.erase(&MI); goto ProcessNextInst;