aboutsummaryrefslogtreecommitdiff
path: root/lib/CodeGen/VirtRegMap.cpp
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2005-10-05 18:30:19 +0000
committerChris Lattner <sabre@nondot.org>2005-10-05 18:30:19 +0000
commit22480c43504eca3092f79d9b42bdbb1b413e8e53 (patch)
treea71efdd3ca74c1b3c5bcbe13f2517b333ef44943 /lib/CodeGen/VirtRegMap.cpp
parentf5c6e6b7452a4aba6d3067896c3d95c4f9457c87 (diff)
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
Diffstat (limited to 'lib/CodeGen/VirtRegMap.cpp')
-rw-r--r--lib/CodeGen/VirtRegMap.cpp10
1 files changed, 5 insertions, 5 deletions
diff --git a/lib/CodeGen/VirtRegMap.cpp b/lib/CodeGen/VirtRegMap.cpp
index 633cf2bf8d..f7306c5d0a 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;