aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/Target/PowerPC/PPCFrameLowering.cpp
diff options
context:
space:
mode:
authorKit Barton <kbarton@ca.ibm.com>2015-11-30 18:59:41 +0000
committerKit Barton <kbarton@ca.ibm.com>2015-11-30 18:59:41 +0000
commitf4ce2f3a9e5278aa1b8ee9cb2458c959d171b0c7 (patch)
tree7f8cf37d4f06132600741725212185da3dce64ed /llvm/lib/Target/PowerPC/PPCFrameLowering.cpp
parentc98b20b0d6edbb9659907eab879e7ff07391c9e3 (diff)
downloadllvm-f4ce2f3a9e5278aa1b8ee9cb2458c959d171b0c7.zip
llvm-f4ce2f3a9e5278aa1b8ee9cb2458c959d171b0c7.tar.gz
llvm-f4ce2f3a9e5278aa1b8ee9cb2458c959d171b0c7.tar.bz2
Enable shrink wrapping for PPC64
Re-enable shrink wrapping for PPC64 Little Endian. One minor modification to PPCFrameLowering::findScratchRegister was necessary to handle fall-thru blocks (blocks with no terminator) correctly. Tested with all LLVM test, clang tests, and the self-hosting build, with no problems found. PHabricator: http://reviews.llvm.org/D14778 llvm-svn: 254314
Diffstat (limited to 'llvm/lib/Target/PowerPC/PPCFrameLowering.cpp')
-rw-r--r--llvm/lib/Target/PowerPC/PPCFrameLowering.cpp20
1 files changed, 14 insertions, 6 deletions
diff --git a/llvm/lib/Target/PowerPC/PPCFrameLowering.cpp b/llvm/lib/Target/PowerPC/PPCFrameLowering.cpp
index c7a3bbd..5a151eb 100644
--- a/llvm/lib/Target/PowerPC/PPCFrameLowering.cpp
+++ b/llvm/lib/Target/PowerPC/PPCFrameLowering.cpp
@@ -573,10 +573,18 @@ bool PPCFrameLowering::findScratchRegister(MachineBasicBlock *MBB,
RS.initRegState();
RS.enterBasicBlock(MBB);
- // The scratch register will be used at the end of the block, so must consider
- // all registers used within the block
- if (UseAtEnd && MBB->begin() != MBB->getFirstTerminator())
- RS.forward(MBB->getFirstTerminator());
+ if (UseAtEnd && !MBB->empty()) {
+ // The scratch register will be used at the end of the block, so must consider
+ // all registers used within the block
+
+ MachineBasicBlock::iterator MBBI = MBB->getFirstTerminator();
+ // If no terminator, back iterator up to previous instruction.
+ if (MBBI == MBB->end())
+ MBBI = std::prev(MBBI);
+
+ if (MBBI != MBB->begin())
+ RS.forward(MBBI);
+ }
if (!RS.isRegUsed(R0))
return true;
@@ -1768,6 +1776,6 @@ PPCFrameLowering::restoreCalleeSavedRegisters(MachineBasicBlock &MBB,
}
bool PPCFrameLowering::enableShrinkWrapping(const MachineFunction &MF) const {
- // FIXME: Enable this for non-Darwin PPC64 once it is confirmed working.
- return false;
+ return (MF.getSubtarget<PPCSubtarget>().isSVR4ABI() &&
+ MF.getSubtarget<PPCSubtarget>().isPPC64());
}