From 8083588a7eaedef8b8ec02cae37aefdaa3847355 Mon Sep 17 00:00:00 2001 From: Quentin Colombet Date: Wed, 27 May 2015 06:25:48 +0000 Subject: [ShrinkWrap] Add a target hook to check whether or not the target can handle a given basic block as prologue or epilogue. Related to llvm-svn: 238292 --- llvm/lib/CodeGen/ShrinkWrap.cpp | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) (limited to 'llvm/lib') 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; -- cgit v1.2.3