diff --git a/llvm/include/llvm/CodeGen/MachineBlockFrequencyInfo.h b/llvm/include/llvm/CodeGen/MachineBlockFrequencyInfo.h --- a/llvm/include/llvm/CodeGen/MachineBlockFrequencyInfo.h +++ b/llvm/include/llvm/CodeGen/MachineBlockFrequencyInfo.h @@ -26,6 +26,7 @@ class MachineBranchProbabilityInfo; class MachineFunction; class MachineLoopInfo; +class ProfileSummaryInfo; class raw_ostream; /// MachineBlockFrequencyInfo pass uses BlockFrequencyInfoImpl implementation @@ -101,8 +102,45 @@ /// Divide a block's BlockFrequency::getFrequency() value by this value to /// obtain the entry block - relative frequency of said block. uint64_t getEntryFreq() const; -}; + /// Below utility functions are like ProfileSummaryInfo, except for + /// MachineBasicBlock. + bool isFunctionHotInCallGraphNthPercentile(int PercentileCutoff, + const MachineFunction *MF, + ProfileSummaryInfo *PSI) const; + + bool isFunctionColdInCallGraphNthPercentile(int PercentileCutoff, + const MachineFunction *MF, + ProfileSummaryInfo *PSI) const; + + bool isFunctionHotInCallGraph(const MachineFunction *MF, + ProfileSummaryInfo *PSI) const; + + bool isFunctionColdInCallGraph(const MachineFunction *MF, + ProfileSummaryInfo *PSI) const; + + bool isHotBlock(const MachineBasicBlock *MBB, ProfileSummaryInfo *PSI) const; + + bool isHotBlock(BlockFrequency BlockFreq, ProfileSummaryInfo *PSI) const; + + bool isColdBlock(const MachineBasicBlock *MBB, ProfileSummaryInfo *PSI) const; + + bool isColdBlock(BlockFrequency BlockFreq, ProfileSummaryInfo *PSI) const; + + bool isHotBlockNthPercentile(int PercentileCutoff, + const MachineBasicBlock *MBB, + ProfileSummaryInfo *PSI) const; + + bool isHotBlockNthPercentile(int PercentileCutoff, BlockFrequency BlockFreq, + ProfileSummaryInfo *PSI) const; + + bool isColdBlockNthPercentile(int PercentileCutoff, + const MachineBasicBlock *MBB, + ProfileSummaryInfo *PSI) const; + + bool isColdBlockNthPercentile(int PercentileCutoff, BlockFrequency BlockFreq, + ProfileSummaryInfo *PSI) const; +}; } // end namespace llvm #endif // LLVM_CODEGEN_MACHINEBLOCKFREQUENCYINFO_H diff --git a/llvm/lib/CodeGen/MachineBlockFrequencyInfo.cpp b/llvm/lib/CodeGen/MachineBlockFrequencyInfo.cpp --- a/llvm/lib/CodeGen/MachineBlockFrequencyInfo.cpp +++ b/llvm/lib/CodeGen/MachineBlockFrequencyInfo.cpp @@ -14,6 +14,7 @@ #include "llvm/ADT/DenseMap.h" #include "llvm/ADT/iterator.h" #include "llvm/Analysis/BlockFrequencyInfoImpl.h" +#include "llvm/Analysis/ProfileSummaryInfo.h" #include "llvm/CodeGen/MachineBasicBlock.h" #include "llvm/CodeGen/MachineBranchProbabilityInfo.h" #include "llvm/CodeGen/MachineFunction.h" @@ -289,3 +290,103 @@ uint64_t MachineBlockFrequencyInfo::getEntryFreq() const { return MBFI ? MBFI->getEntryFreq() : 0; } + +bool MachineBlockFrequencyInfo::isHotBlock(const MachineBasicBlock *MBB, + ProfileSummaryInfo *PSI) const { + auto Count = getBlockProfileCount(MBB); + return Count && PSI->isHotCount(*Count); +} + +bool MachineBlockFrequencyInfo::isHotBlock(BlockFrequency BlockFreq, + ProfileSummaryInfo *PSI) const { + auto Count = getProfileCountFromFreq(BlockFreq.getFrequency()); + return Count && PSI->isHotCount(*Count); +} + +bool MachineBlockFrequencyInfo::isColdBlock(const MachineBasicBlock *MBB, + ProfileSummaryInfo *PSI) const { + auto Count = getBlockProfileCount(MBB); + return Count && PSI->isColdCount(*Count); +} + +bool MachineBlockFrequencyInfo::isColdBlock(BlockFrequency BlockFreq, + ProfileSummaryInfo *PSI) const { + auto Count = getProfileCountFromFreq(BlockFreq.getFrequency()); + return Count && PSI->isColdCount(*Count); +} + +bool MachineBlockFrequencyInfo::isFunctionHotInCallGraphNthPercentile( + int PercentileCutoff, const MachineFunction *MF, + ProfileSummaryInfo *PSI) const { + if (auto FunctionCount = MF->getFunction().getEntryCount()) + if (PSI->isHotCountNthPercentile(PercentileCutoff, + FunctionCount->getCount())) + return true; + for (const auto &MBB : *MF) + if (isHotBlockNthPercentile(PercentileCutoff, &MBB, PSI)) + return true; + return false; +} + +bool MachineBlockFrequencyInfo::isFunctionColdInCallGraphNthPercentile( + int PercentileCutoff, const MachineFunction *MF, + ProfileSummaryInfo *PSI) const { + if (auto FunctionCount = MF->getFunction().getEntryCount()) + if (!PSI->isColdCountNthPercentile(PercentileCutoff, + FunctionCount->getCount())) + return false; + for (const auto &MBB : *MF) + if (!isColdBlockNthPercentile(PercentileCutoff, &MBB, PSI)) + return false; + return true; +} + +bool MachineBlockFrequencyInfo::isFunctionHotInCallGraph( + const MachineFunction *MF, ProfileSummaryInfo *PSI) const { + if (auto FunctionCount = MF->getFunction().getEntryCount()) + if (PSI->isHotCount(FunctionCount->getCount())) + return true; + for (const auto &MBB : *MF) + if (isHotBlock(&MBB, PSI)) + return true; + return false; +} + +bool MachineBlockFrequencyInfo::isFunctionColdInCallGraph( + const MachineFunction *MF, ProfileSummaryInfo *PSI) const { + if (auto FunctionCount = MF->getFunction().getEntryCount()) + if (!PSI->isColdCount(FunctionCount->getCount())) + return false; + for (const auto &MBB : *MF) + if (!isColdBlock(&MBB, PSI)) + return false; + return true; +} + +bool MachineBlockFrequencyInfo::isHotBlockNthPercentile( + int PercentileCutoff, const MachineBasicBlock *MBB, + ProfileSummaryInfo *PSI) const { + auto Count = getBlockProfileCount(MBB); + return Count && PSI->isHotCountNthPercentile(PercentileCutoff, *Count); +} + +bool MachineBlockFrequencyInfo::isHotBlockNthPercentile( + int PercentileCutoff, BlockFrequency BlockFreq, + ProfileSummaryInfo *PSI) const { + auto Count = getProfileCountFromFreq(BlockFreq.getFrequency()); + return Count && PSI->isHotCountNthPercentile(PercentileCutoff, *Count); +} + +bool MachineBlockFrequencyInfo::isColdBlockNthPercentile( + int PercentileCutoff, const MachineBasicBlock *MBB, + ProfileSummaryInfo *PSI) const { + auto Count = getBlockProfileCount(MBB); + return Count && PSI->isColdCountNthPercentile(PercentileCutoff, *Count); +} + +bool MachineBlockFrequencyInfo::isColdBlockNthPercentile( + int PercentileCutoff, BlockFrequency BlockFreq, + ProfileSummaryInfo *PSI) const { + auto Count = getProfileCountFromFreq(BlockFreq.getFrequency()); + return Count && PSI->isColdCountNthPercentile(PercentileCutoff, *Count); +} diff --git a/llvm/lib/CodeGen/MachineSizeOpts.cpp b/llvm/lib/CodeGen/MachineSizeOpts.cpp --- a/llvm/lib/CodeGen/MachineSizeOpts.cpp +++ b/llvm/lib/CodeGen/MachineSizeOpts.cpp @@ -25,157 +25,55 @@ extern cl::opt PgsoCutoffSampleProf; namespace { -namespace machine_size_opts_detail { - -/// Like ProfileSummaryInfo::isColdBlock but for MachineBasicBlock. -bool isColdBlock(const MachineBasicBlock *MBB, - ProfileSummaryInfo *PSI, - const MachineBlockFrequencyInfo *MBFI) { - auto Count = MBFI->getBlockProfileCount(MBB); - return Count && PSI->isColdCount(*Count); -} - -bool isColdBlock(BlockFrequency BlockFreq, - ProfileSummaryInfo *PSI, - const MachineBlockFrequencyInfo *MBFI) { - auto Count = MBFI->getProfileCountFromFreq(BlockFreq.getFrequency()); - return Count && PSI->isColdCount(*Count); -} - -/// Like ProfileSummaryInfo::isHotBlockNthPercentile but for MachineBasicBlock. -static bool isHotBlockNthPercentile(int PercentileCutoff, - const MachineBasicBlock *MBB, - ProfileSummaryInfo *PSI, - const MachineBlockFrequencyInfo *MBFI) { - auto Count = MBFI->getBlockProfileCount(MBB); - return Count && PSI->isHotCountNthPercentile(PercentileCutoff, *Count); -} - -static bool isHotBlockNthPercentile(int PercentileCutoff, - BlockFrequency BlockFreq, - ProfileSummaryInfo *PSI, - const MachineBlockFrequencyInfo *MBFI) { - auto Count = MBFI->getProfileCountFromFreq(BlockFreq.getFrequency()); - return Count && PSI->isHotCountNthPercentile(PercentileCutoff, *Count); -} - -static bool isColdBlockNthPercentile(int PercentileCutoff, - const MachineBasicBlock *MBB, - ProfileSummaryInfo *PSI, - const MachineBlockFrequencyInfo *MBFI) { - auto Count = MBFI->getBlockProfileCount(MBB); - return Count && PSI->isColdCountNthPercentile(PercentileCutoff, *Count); -} - -static bool isColdBlockNthPercentile(int PercentileCutoff, - BlockFrequency BlockFreq, - ProfileSummaryInfo *PSI, - const MachineBlockFrequencyInfo *MBFI) { - auto Count = MBFI->getProfileCountFromFreq(BlockFreq.getFrequency()); - return Count && PSI->isColdCountNthPercentile(PercentileCutoff, *Count); -} - -/// Like ProfileSummaryInfo::isFunctionColdInCallGraph but for -/// MachineFunction. -bool isFunctionColdInCallGraph( - const MachineFunction *MF, - ProfileSummaryInfo *PSI, - const MachineBlockFrequencyInfo &MBFI) { - if (auto FunctionCount = MF->getFunction().getEntryCount()) - if (!PSI->isColdCount(FunctionCount->getCount())) - return false; - for (const auto &MBB : *MF) - if (!isColdBlock(&MBB, PSI, &MBFI)) - return false; - return true; -} - -/// Like ProfileSummaryInfo::isFunctionHotInCallGraphNthPercentile but for -/// MachineFunction. -bool isFunctionHotInCallGraphNthPercentile( - int PercentileCutoff, - const MachineFunction *MF, - ProfileSummaryInfo *PSI, - const MachineBlockFrequencyInfo &MBFI) { - if (auto FunctionCount = MF->getFunction().getEntryCount()) - if (PSI->isHotCountNthPercentile(PercentileCutoff, - FunctionCount->getCount())) - return true; - for (const auto &MBB : *MF) - if (isHotBlockNthPercentile(PercentileCutoff, &MBB, PSI, &MBFI)) - return true; - return false; -} - -bool isFunctionColdInCallGraphNthPercentile( - int PercentileCutoff, const MachineFunction *MF, ProfileSummaryInfo *PSI, - const MachineBlockFrequencyInfo &MBFI) { - if (auto FunctionCount = MF->getFunction().getEntryCount()) - if (!PSI->isColdCountNthPercentile(PercentileCutoff, - FunctionCount->getCount())) - return false; - for (const auto &MBB : *MF) - if (!isColdBlockNthPercentile(PercentileCutoff, &MBB, PSI, &MBFI)) - return false; - return true; -} -} // namespace machine_size_opts_detail - struct MachineBasicBlockBFIAdapter { static bool isFunctionColdInCallGraph(const MachineFunction *MF, ProfileSummaryInfo *PSI, const MachineBlockFrequencyInfo &MBFI) { - return machine_size_opts_detail::isFunctionColdInCallGraph(MF, PSI, MBFI); + return MBFI.isFunctionColdInCallGraph(MF, PSI); } static bool isFunctionHotInCallGraphNthPercentile( int CutOff, const MachineFunction *MF, ProfileSummaryInfo *PSI, const MachineBlockFrequencyInfo &MBFI) { - return machine_size_opts_detail::isFunctionHotInCallGraphNthPercentile( - CutOff, MF, PSI, MBFI); + return MBFI.isFunctionHotInCallGraphNthPercentile(CutOff, MF, PSI); } static bool isFunctionColdInCallGraphNthPercentile( int CutOff, const MachineFunction *MF, ProfileSummaryInfo *PSI, const MachineBlockFrequencyInfo &MBFI) { - return machine_size_opts_detail::isFunctionColdInCallGraphNthPercentile( - CutOff, MF, PSI, MBFI); + return MBFI.isFunctionColdInCallGraphNthPercentile(CutOff, MF, PSI); } static bool isColdBlock(const MachineBasicBlock *MBB, ProfileSummaryInfo *PSI, const MachineBlockFrequencyInfo *MBFI) { - return machine_size_opts_detail::isColdBlock(MBB, PSI, MBFI); + return MBFI->isColdBlock(MBB, PSI); } static bool isColdBlock(BlockFrequency BlockFreq, ProfileSummaryInfo *PSI, const MachineBlockFrequencyInfo *MBFI) { - return machine_size_opts_detail::isColdBlock(BlockFreq, PSI, MBFI); + return MBFI->isColdBlock(BlockFreq, PSI); } static bool isHotBlockNthPercentile(int CutOff, const MachineBasicBlock *MBB, ProfileSummaryInfo *PSI, const MachineBlockFrequencyInfo *MBFI) { - return machine_size_opts_detail::isHotBlockNthPercentile( - CutOff, MBB, PSI, MBFI); + return MBFI->isHotBlockNthPercentile(CutOff, MBB, PSI); } static bool isHotBlockNthPercentile(int CutOff, BlockFrequency BlockFreq, ProfileSummaryInfo *PSI, const MachineBlockFrequencyInfo *MBFI) { - return machine_size_opts_detail::isHotBlockNthPercentile( - CutOff, BlockFreq, PSI, MBFI); + return MBFI->isHotBlockNthPercentile(CutOff, BlockFreq, PSI); } static bool isColdBlockNthPercentile(int CutOff, const MachineBasicBlock *MBB, ProfileSummaryInfo *PSI, const MachineBlockFrequencyInfo *MBFI) { - return machine_size_opts_detail::isColdBlockNthPercentile(CutOff, MBB, PSI, - MBFI); + return MBFI->isColdBlockNthPercentile(CutOff, MBB, PSI); } static bool isColdBlockNthPercentile(int CutOff, BlockFrequency BlockFreq, ProfileSummaryInfo *PSI, const MachineBlockFrequencyInfo *MBFI) { - return machine_size_opts_detail::isColdBlockNthPercentile(CutOff, BlockFreq, - PSI, MBFI); + return MBFI->isColdBlockNthPercentile(CutOff, BlockFreq, PSI); } }; } // end anonymous namespace