summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Target/PowerPC
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2005-09-09 21:46:49 +0000
committerChris Lattner <sabre@nondot.org>2005-09-09 21:46:49 +0000
commit712e78ee280a274feb708c6f933b3747095cf0aa (patch)
tree50bcd430cc28cbac86c7201affdbf3f601ea642b /llvm/lib/Target/PowerPC
parentf540c1a2e8a4d84d576108b14b54767bc56c445a (diff)
downloadbcm5719-llvm-712e78ee280a274feb708c6f933b3747095cf0aa.tar.gz
bcm5719-llvm-712e78ee280a274feb708c6f933b3747095cf0aa.zip
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 llvm-svn: 23298
Diffstat (limited to 'llvm/lib/Target/PowerPC')
-rw-r--r--llvm/lib/Target/PowerPC/PPC32RegisterInfo.cpp27
-rw-r--r--llvm/lib/Target/PowerPC/PPC32RegisterInfo.h5
2 files changed, 32 insertions, 0 deletions
diff --git a/llvm/lib/Target/PowerPC/PPC32RegisterInfo.cpp b/llvm/lib/Target/PowerPC/PPC32RegisterInfo.cpp
index 750d97978e2..1ccc8599015 100644
--- a/llvm/lib/Target/PowerPC/PPC32RegisterInfo.cpp
+++ b/llvm/lib/Target/PowerPC/PPC32RegisterInfo.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/llvm/lib/Target/PowerPC/PPC32RegisterInfo.h b/llvm/lib/Target/PowerPC/PPC32RegisterInfo.h
index 442eae26935..d2745455040 100644
--- a/llvm/lib/Target/PowerPC/PPC32RegisterInfo.h
+++ b/llvm/lib/Target/PowerPC/PPC32RegisterInfo.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;
OpenPOWER on IntegriCloud