diff options
author | Chris Lattner <sabre@nondot.org> | 2005-09-09 21:46:49 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2005-09-09 21:46:49 +0000 |
commit | f38df04c3a0c2aa766fa50b254d2d0fc743f8152 (patch) | |
tree | 96ec08c0df059cb57a6940ac19801af3a53b9959 | |
parent | 1463019e84cea6857914cea30c0180ec7289f09f (diff) | |
download | external_llvm-f38df04c3a0c2aa766fa50b254d2d0fc743f8152.zip external_llvm-f38df04c3a0c2aa766fa50b254d2d0fc743f8152.tar.gz external_llvm-f38df04c3a0c2aa766fa50b254d2d0fc743f8152.tar.bz2 |
Fix a problem that Nate noticed, where spill code was not getting coallesced
with copies, leading to code like this:
lwz r4, 380(r1)
or r10, r4, r4 ;; Last use of r4
By teaching the PPC backend how to fold spills into copies, we now get this
code:
lwz r10, 380(r1)
wow. :)
This reduces a testcase nate sent me from 1505 instructions to 1484.
Note that this could handle FP values but doesn't currently, for reasons
mentioned in the patch
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@23298 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/Target/PowerPC/PPCRegisterInfo.cpp | 27 | ||||
-rw-r--r-- | lib/Target/PowerPC/PPCRegisterInfo.h | 5 |
2 files changed, 32 insertions, 0 deletions
diff --git a/lib/Target/PowerPC/PPCRegisterInfo.cpp b/lib/Target/PowerPC/PPCRegisterInfo.cpp index 750d979..1ccc859 100644 --- a/lib/Target/PowerPC/PPCRegisterInfo.cpp +++ b/lib/Target/PowerPC/PPCRegisterInfo.cpp @@ -134,6 +134,33 @@ void PPC32RegisterInfo::copyRegToReg(MachineBasicBlock &MBB, } } +/// foldMemoryOperand - PowerPC (like most RISC's) can only fold spills into +/// copy instructions, turning them into load/store instructions. +MachineInstr *PPC32RegisterInfo::foldMemoryOperand(MachineInstr *MI, + unsigned OpNum, + int FrameIndex) const { + // Make sure this is a reg-reg copy. Note that we can't handle MCRF, because + // it takes more than one instruction to store it. + unsigned Opc = MI->getOpcode(); + + if ((Opc == PPC::OR && + MI->getOperand(1).getReg() == MI->getOperand(2).getReg())) { + if (OpNum == 0) { // move -> store + unsigned InReg = MI->getOperand(1).getReg(); + return addFrameReference(BuildMI(PPC::STW, + 3).addReg(InReg), FrameIndex); + } else { + unsigned OutReg = MI->getOperand(0).getReg(); + return addFrameReference(BuildMI(PPC::LWZ, 2, OutReg), FrameIndex); + } + + } else if (Opc == PPC::FMR) { + // FIXME: We would be able to fold this, but we don't know whether to use a + // 32- or 64-bit load/store :(. + } + return 0; +} + //===----------------------------------------------------------------------===// // Stack Frame Processing methods //===----------------------------------------------------------------------===// diff --git a/lib/Target/PowerPC/PPCRegisterInfo.h b/lib/Target/PowerPC/PPCRegisterInfo.h index 442eae2..d274545 100644 --- a/lib/Target/PowerPC/PPCRegisterInfo.h +++ b/lib/Target/PowerPC/PPCRegisterInfo.h @@ -40,6 +40,11 @@ public: unsigned DestReg, unsigned SrcReg, const TargetRegisterClass *RC) const; + /// foldMemoryOperand - PowerPC (like most RISC's) can only fold spills into + /// copy instructions, turning them into load/store instructions. + virtual MachineInstr* foldMemoryOperand(MachineInstr* MI, unsigned OpNum, + int FrameIndex) const; + void eliminateCallFramePseudoInstr(MachineFunction &MF, MachineBasicBlock &MBB, MachineBasicBlock::iterator I) const; |