diff options
author | Quentin Colombet <qcolombet@apple.com> | 2015-05-27 06:25:48 +0000 |
---|---|---|
committer | Quentin Colombet <qcolombet@apple.com> | 2015-05-27 06:25:48 +0000 |
commit | 8083588a7eaedef8b8ec02cae37aefdaa3847355 (patch) | |
tree | 01a278985acbaf041a7ed6d723695cb5edf58f39 /llvm/lib/CodeGen/ShrinkWrap.cpp | |
parent | 3e0dcc27d5eae976d1028f81813158c75a4b37a4 (diff) | |
download | bcm5719-llvm-8083588a7eaedef8b8ec02cae37aefdaa3847355.tar.gz bcm5719-llvm-8083588a7eaedef8b8ec02cae37aefdaa3847355.zip |
[ShrinkWrap] Add a target hook to check whether or not
the target can handle a given basic block as prologue
or epilogue.
Related to <rdar://problem/20821487>
llvm-svn: 238292
Diffstat (limited to 'llvm/lib/CodeGen/ShrinkWrap.cpp')
-rw-r--r-- | llvm/lib/CodeGen/ShrinkWrap.cpp | 15 |
1 files changed, 10 insertions, 5 deletions
diff --git a/llvm/lib/CodeGen/ShrinkWrap.cpp b/llvm/lib/CodeGen/ShrinkWrap.cpp index e1869b30343..4463cc7d3c5 100644 --- a/llvm/lib/CodeGen/ShrinkWrap.cpp +++ b/llvm/lib/CodeGen/ShrinkWrap.cpp @@ -62,6 +62,8 @@ // To know about callee-saved. #include "llvm/CodeGen/RegisterClassInfo.h" #include "llvm/Support/Debug.h" +// To query the target about frame lowering. +#include "llvm/Target/TargetFrameLowering.h" // To know about frame setup operation. #include "llvm/Target/TargetInstrInfo.h" // To access TargetInstrInfo. @@ -338,6 +340,7 @@ bool ShrinkWrap::runOnMachineFunction(MachineFunction &MF) { DEBUG(dbgs() << "\n ** Results **\nFrequency of the Entry: " << EntryFreq << '\n'); + const TargetFrameLowering *TFI = MF.getSubtarget().getFrameLowering(); do { DEBUG(dbgs() << "Shrink wrap candidates (#, Name, Freq):\nSave: " << Save->getNumber() << ' ' << Save->getName() << ' ' @@ -345,13 +348,15 @@ bool ShrinkWrap::runOnMachineFunction(MachineFunction &MF) { << Restore->getNumber() << ' ' << Restore->getName() << ' ' << MBFI->getBlockFreq(Restore).getFrequency() << '\n'); - bool IsSaveCheap; - if ((IsSaveCheap = EntryFreq >= MBFI->getBlockFreq(Save).getFrequency()) && - EntryFreq >= MBFI->getBlockFreq(Restore).getFrequency()) + bool IsSaveCheap, TargetCanUseSaveAsPrologue = false; + if (((IsSaveCheap = EntryFreq >= MBFI->getBlockFreq(Save).getFrequency()) && + EntryFreq >= MBFI->getBlockFreq(Restore).getFrequency()) && + ((TargetCanUseSaveAsPrologue = TFI->canUseAsPrologue(*Save)) && + TFI->canUseAsEpilogue(*Restore))) break; - DEBUG(dbgs() << "New points are too expensive\n"); + DEBUG(dbgs() << "New points are too expensive or invalid for the target\n"); MachineBasicBlock *NewBB; - if (!IsSaveCheap) { + if (!IsSaveCheap || !TargetCanUseSaveAsPrologue) { Save = FindIDom<>(*Save, Save->predecessors(), *MDT); if (!Save) break; |