175f72f6bSHiroshi Yamauchi //===- MachineSizeOpts.cpp - code size optimization related code ----------===// 275f72f6bSHiroshi Yamauchi // 375f72f6bSHiroshi Yamauchi // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 475f72f6bSHiroshi Yamauchi // See https://llvm.org/LICENSE.txt for license information. 575f72f6bSHiroshi Yamauchi // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 675f72f6bSHiroshi Yamauchi // 775f72f6bSHiroshi Yamauchi //===----------------------------------------------------------------------===// 875f72f6bSHiroshi Yamauchi // 975f72f6bSHiroshi Yamauchi // This file contains some shared machine IR code size optimization related 1075f72f6bSHiroshi Yamauchi // code. 1175f72f6bSHiroshi Yamauchi // 1275f72f6bSHiroshi Yamauchi //===----------------------------------------------------------------------===// 1375f72f6bSHiroshi Yamauchi 1475f72f6bSHiroshi Yamauchi #include "llvm/CodeGen/MachineSizeOpts.h" 1575f72f6bSHiroshi Yamauchi #include "llvm/Analysis/ProfileSummaryInfo.h" 1675f72f6bSHiroshi Yamauchi #include "llvm/CodeGen/MachineBlockFrequencyInfo.h" 1775f72f6bSHiroshi Yamauchi 1875f72f6bSHiroshi Yamauchi using namespace llvm; 1975f72f6bSHiroshi Yamauchi 2075f72f6bSHiroshi Yamauchi extern cl::opt<bool> EnablePGSO; 2175f72f6bSHiroshi Yamauchi extern cl::opt<bool> PGSOLargeWorkingSetSizeOnly; 2275f72f6bSHiroshi Yamauchi extern cl::opt<bool> ForcePGSO; 2375f72f6bSHiroshi Yamauchi extern cl::opt<int> PgsoCutoffInstrProf; 2475f72f6bSHiroshi Yamauchi extern cl::opt<int> PgsoCutoffSampleProf; 2575f72f6bSHiroshi Yamauchi 2675f72f6bSHiroshi Yamauchi namespace machine_size_opts_detail { 2775f72f6bSHiroshi Yamauchi 2875f72f6bSHiroshi Yamauchi /// Like ProfileSummaryInfo::isColdBlock but for MachineBasicBlock. 2975f72f6bSHiroshi Yamauchi bool isColdBlock(const MachineBasicBlock *MBB, 3075f72f6bSHiroshi Yamauchi ProfileSummaryInfo *PSI, 3175f72f6bSHiroshi Yamauchi const MachineBlockFrequencyInfo *MBFI) { 3275f72f6bSHiroshi Yamauchi auto Count = MBFI->getBlockProfileCount(MBB); 3375f72f6bSHiroshi Yamauchi return Count && PSI->isColdCount(*Count); 3475f72f6bSHiroshi Yamauchi } 3575f72f6bSHiroshi Yamauchi 3675f72f6bSHiroshi Yamauchi /// Like ProfileSummaryInfo::isHotBlockNthPercentile but for MachineBasicBlock. 3775f72f6bSHiroshi Yamauchi static bool isHotBlockNthPercentile(int PercentileCutoff, 3875f72f6bSHiroshi Yamauchi const MachineBasicBlock *MBB, 3975f72f6bSHiroshi Yamauchi ProfileSummaryInfo *PSI, 4075f72f6bSHiroshi Yamauchi const MachineBlockFrequencyInfo *MBFI) { 4175f72f6bSHiroshi Yamauchi auto Count = MBFI->getBlockProfileCount(MBB); 4275f72f6bSHiroshi Yamauchi return Count && PSI->isHotCountNthPercentile(PercentileCutoff, *Count); 4375f72f6bSHiroshi Yamauchi } 4475f72f6bSHiroshi Yamauchi 4575f72f6bSHiroshi Yamauchi /// Like ProfileSummaryInfo::isFunctionColdInCallGraph but for 4675f72f6bSHiroshi Yamauchi /// MachineFunction. 4775f72f6bSHiroshi Yamauchi bool isFunctionColdInCallGraph( 4875f72f6bSHiroshi Yamauchi const MachineFunction *MF, 4975f72f6bSHiroshi Yamauchi ProfileSummaryInfo *PSI, 5075f72f6bSHiroshi Yamauchi const MachineBlockFrequencyInfo &MBFI) { 5175f72f6bSHiroshi Yamauchi if (auto FunctionCount = MF->getFunction().getEntryCount()) 5275f72f6bSHiroshi Yamauchi if (!PSI->isColdCount(FunctionCount.getCount())) 5375f72f6bSHiroshi Yamauchi return false; 5475f72f6bSHiroshi Yamauchi for (const auto &MBB : *MF) 5575f72f6bSHiroshi Yamauchi if (!isColdBlock(&MBB, PSI, &MBFI)) 5675f72f6bSHiroshi Yamauchi return false; 5775f72f6bSHiroshi Yamauchi return true; 5875f72f6bSHiroshi Yamauchi } 5975f72f6bSHiroshi Yamauchi 6075f72f6bSHiroshi Yamauchi /// Like ProfileSummaryInfo::isFunctionHotInCallGraphNthPercentile but for 6175f72f6bSHiroshi Yamauchi /// MachineFunction. 6275f72f6bSHiroshi Yamauchi bool isFunctionHotInCallGraphNthPercentile( 6375f72f6bSHiroshi Yamauchi int PercentileCutoff, 6475f72f6bSHiroshi Yamauchi const MachineFunction *MF, 6575f72f6bSHiroshi Yamauchi ProfileSummaryInfo *PSI, 6675f72f6bSHiroshi Yamauchi const MachineBlockFrequencyInfo &MBFI) { 6775f72f6bSHiroshi Yamauchi if (auto FunctionCount = MF->getFunction().getEntryCount()) 6875f72f6bSHiroshi Yamauchi if (PSI->isHotCountNthPercentile(PercentileCutoff, 6975f72f6bSHiroshi Yamauchi FunctionCount.getCount())) 7075f72f6bSHiroshi Yamauchi return true; 7175f72f6bSHiroshi Yamauchi for (const auto &MBB : *MF) 7275f72f6bSHiroshi Yamauchi if (isHotBlockNthPercentile(PercentileCutoff, &MBB, PSI, &MBFI)) 7375f72f6bSHiroshi Yamauchi return true; 7475f72f6bSHiroshi Yamauchi return false; 7575f72f6bSHiroshi Yamauchi } 7675f72f6bSHiroshi Yamauchi } // namespace machine_size_opts_detail 7775f72f6bSHiroshi Yamauchi 7875f72f6bSHiroshi Yamauchi namespace { 7975f72f6bSHiroshi Yamauchi struct MachineBasicBlockBFIAdapter { 8075f72f6bSHiroshi Yamauchi static bool isFunctionColdInCallGraph(const MachineFunction *MF, 8175f72f6bSHiroshi Yamauchi ProfileSummaryInfo *PSI, 8275f72f6bSHiroshi Yamauchi const MachineBlockFrequencyInfo &MBFI) { 8375f72f6bSHiroshi Yamauchi return machine_size_opts_detail::isFunctionColdInCallGraph(MF, PSI, MBFI); 8475f72f6bSHiroshi Yamauchi } 8575f72f6bSHiroshi Yamauchi static bool isFunctionHotInCallGraphNthPercentile( 8675f72f6bSHiroshi Yamauchi int CutOff, 8775f72f6bSHiroshi Yamauchi const MachineFunction *MF, 8875f72f6bSHiroshi Yamauchi ProfileSummaryInfo *PSI, 8975f72f6bSHiroshi Yamauchi const MachineBlockFrequencyInfo &MBFI) { 9075f72f6bSHiroshi Yamauchi return machine_size_opts_detail::isFunctionHotInCallGraphNthPercentile( 9175f72f6bSHiroshi Yamauchi CutOff, MF, PSI, MBFI); 9275f72f6bSHiroshi Yamauchi } 9375f72f6bSHiroshi Yamauchi static bool isColdBlock(const MachineBasicBlock *MBB, 9475f72f6bSHiroshi Yamauchi ProfileSummaryInfo *PSI, 9575f72f6bSHiroshi Yamauchi const MachineBlockFrequencyInfo *MBFI) { 9675f72f6bSHiroshi Yamauchi return machine_size_opts_detail::isColdBlock(MBB, PSI, MBFI); 9775f72f6bSHiroshi Yamauchi } 9875f72f6bSHiroshi Yamauchi static bool isHotBlockNthPercentile(int CutOff, 9975f72f6bSHiroshi Yamauchi const MachineBasicBlock *MBB, 10075f72f6bSHiroshi Yamauchi ProfileSummaryInfo *PSI, 10175f72f6bSHiroshi Yamauchi const MachineBlockFrequencyInfo *MBFI) { 10275f72f6bSHiroshi Yamauchi return machine_size_opts_detail::isHotBlockNthPercentile( 10375f72f6bSHiroshi Yamauchi CutOff, MBB, PSI, MBFI); 10475f72f6bSHiroshi Yamauchi } 10575f72f6bSHiroshi Yamauchi }; 10675f72f6bSHiroshi Yamauchi } // end anonymous namespace 10775f72f6bSHiroshi Yamauchi 10875f72f6bSHiroshi Yamauchi bool llvm::shouldOptimizeForSize(const MachineFunction *MF, 10975f72f6bSHiroshi Yamauchi ProfileSummaryInfo *PSI, 110*8cdfdfeeSHiroshi Yamauchi const MachineBlockFrequencyInfo *MBFI, 111*8cdfdfeeSHiroshi Yamauchi PGSOQueryType QueryType) { 11275f72f6bSHiroshi Yamauchi return shouldFuncOptimizeForSizeImpl<MachineBasicBlockBFIAdapter>( 113*8cdfdfeeSHiroshi Yamauchi MF, PSI, MBFI, QueryType); 11475f72f6bSHiroshi Yamauchi } 11575f72f6bSHiroshi Yamauchi 11675f72f6bSHiroshi Yamauchi bool llvm::shouldOptimizeForSize(const MachineBasicBlock *MBB, 11775f72f6bSHiroshi Yamauchi ProfileSummaryInfo *PSI, 118*8cdfdfeeSHiroshi Yamauchi const MachineBlockFrequencyInfo *MBFI, 119*8cdfdfeeSHiroshi Yamauchi PGSOQueryType QueryType) { 12075f72f6bSHiroshi Yamauchi return shouldOptimizeForSizeImpl<MachineBasicBlockBFIAdapter>( 121*8cdfdfeeSHiroshi Yamauchi MBB, PSI, MBFI, QueryType); 12275f72f6bSHiroshi Yamauchi } 123