diff options
author | Chris Lattner <sabre@nondot.org> | 2006-10-12 02:34:07 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2006-10-12 02:34:07 +0000 |
commit | f183cabba8ec381685807ab40a6e7e3b4077e95a (patch) | |
tree | ce4849e55955df0874d3398520fa48dfc2558a02 /lib/CodeGen/VirtRegMap.cpp | |
parent | 4326ef582bceb8841f36623d98a98ee879642f2f (diff) |
If we see a load from a stack slot into a physreg, consider it as providing
the stack slot. This fixes PR943.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@30898 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/VirtRegMap.cpp')
-rw-r--r-- | lib/CodeGen/VirtRegMap.cpp | 49 |
1 files changed, 32 insertions, 17 deletions
diff --git a/lib/CodeGen/VirtRegMap.cpp b/lib/CodeGen/VirtRegMap.cpp index ea1794caf5..850c16904e 100644 --- a/lib/CodeGen/VirtRegMap.cpp +++ b/lib/CodeGen/VirtRegMap.cpp @@ -706,24 +706,25 @@ void LocalSpiller::RewriteMBB(MachineBasicBlock &MBB, VirtRegMap &VRM) { if ((MR & VirtRegMap::isRef) && !(MR & VirtRegMap::isMod)) { int FrameIdx; if (unsigned DestReg = TII->isLoadFromStackSlot(&MI, FrameIdx)) { - // If this spill slot is available, turn it into a copy (or nothing) - // instead of leaving it as a load! - unsigned InReg; - if (FrameIdx == SS && (InReg = Spills.getSpillSlotPhysReg(SS))) { - DEBUG(std::cerr << "Promoted Load To Copy: " << MI); - MachineFunction &MF = *MBB.getParent(); - if (DestReg != InReg) { - MRI->copyRegToReg(MBB, &MI, DestReg, InReg, - MF.getSSARegMap()->getRegClass(VirtReg)); - // 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. + if (FrameIdx == SS) { + // If this spill slot is available, turn it into a copy (or nothing) + // instead of leaving it as a load! + if (unsigned InReg = Spills.getSpillSlotPhysReg(SS)) { + DEBUG(std::cerr << "Promoted Load To Copy: " << MI); + MachineFunction &MF = *MBB.getParent(); + if (DestReg != InReg) { + MRI->copyRegToReg(MBB, &MI, DestReg, InReg, + MF.getSSARegMap()->getRegClass(VirtReg)); + // 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. + } + VRM.RemoveFromFoldedVirtMap(&MI); + MBB.erase(&MI); + goto ProcessNextInst; } - VRM.RemoveFromFoldedVirtMap(&MI); - MBB.erase(&MI); - goto ProcessNextInst; } } } @@ -791,7 +792,21 @@ void LocalSpiller::RewriteMBB(MachineBasicBlock &MBB, VirtRegMap &VRM) { VRM.RemoveFromFoldedVirtMap(&MI); goto ProcessNextInst; } + + // If it's not a no-op copy, it clobbers the value in the destreg. Spills.ClobberPhysReg(VirtReg); + + // Check to see if this instruction is a load from a stack slot into + // a register. If so, this provides the stack slot value in the reg. + int FrameIdx; + if (unsigned DestReg = TII->isLoadFromStackSlot(&MI, FrameIdx)) { + assert(DestReg == VirtReg && "Unknown load situation!"); + + // Otherwise, if it wasn't available, remember that it is now! + Spills.addAvailable(FrameIdx, DestReg); + goto ProcessNextInst; + } + continue; } |