1 //===-- SizeOpts.cpp - code size optimization related code ----------------===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 // 9 // This file contains some shared code size optimization related code. 10 // 11 //===----------------------------------------------------------------------===// 12 13 #include "llvm/Transforms/Utils/SizeOpts.h" 14 15 using namespace llvm; 16 17 cl::opt<bool> EnablePGSO( 18 "pgso", cl::Hidden, cl::init(true), 19 cl::desc("Enable the profile guided size optimizations. ")); 20 21 cl::opt<bool> PGSOLargeWorkingSetSizeOnly( 22 "pgso-lwss-only", cl::Hidden, cl::init(true), 23 cl::desc("Apply the profile guided size optimizations only " 24 "if the working set size is large (except for cold code.)")); 25 26 cl::opt<bool> PGSOColdCodeOnly( 27 "pgso-cold-code-only", cl::Hidden, cl::init(true), 28 cl::desc("Apply the profile guided size optimizations only " 29 "to cold code.")); 30 31 cl::opt<bool> ForcePGSO( 32 "force-pgso", cl::Hidden, cl::init(false), 33 cl::desc("Force the (profiled-guided) size optimizations. ")); 34 35 cl::opt<int> PgsoCutoffInstrProf( 36 "pgso-cutoff-instr-prof", cl::Hidden, cl::init(250000), cl::ZeroOrMore, 37 cl::desc("The profile guided size optimization profile summary cutoff " 38 "for instrumentation profile.")); 39 40 cl::opt<int> PgsoCutoffSampleProf( 41 "pgso-cutoff-sample-prof", cl::Hidden, cl::init(800000), cl::ZeroOrMore, 42 cl::desc("The profile guided size optimization profile summary cutoff " 43 "for sample profile.")); 44 45 namespace { 46 struct BasicBlockBFIAdapter { 47 static bool isFunctionColdInCallGraph(const Function *F, 48 ProfileSummaryInfo *PSI, 49 BlockFrequencyInfo &BFI) { 50 return PSI->isFunctionColdInCallGraph(F, BFI); 51 } 52 static bool isFunctionHotInCallGraphNthPercentile(int CutOff, 53 const Function *F, 54 ProfileSummaryInfo *PSI, 55 BlockFrequencyInfo &BFI) { 56 return PSI->isFunctionHotInCallGraphNthPercentile(CutOff, F, BFI); 57 } 58 static bool isColdBlock(const BasicBlock *BB, 59 ProfileSummaryInfo *PSI, 60 BlockFrequencyInfo *BFI) { 61 return PSI->isColdBlock(BB, BFI); 62 } 63 static bool isHotBlockNthPercentile(int CutOff, 64 const BasicBlock *BB, 65 ProfileSummaryInfo *PSI, 66 BlockFrequencyInfo *BFI) { 67 return PSI->isHotBlockNthPercentile(CutOff, BB, BFI); 68 } 69 }; 70 } // end anonymous namespace 71 72 bool llvm::shouldOptimizeForSize(const Function *F, ProfileSummaryInfo *PSI, 73 BlockFrequencyInfo *BFI) { 74 return shouldFuncOptimizeForSizeImpl<BasicBlockBFIAdapter>(F, PSI, BFI); 75 } 76 77 bool llvm::shouldOptimizeForSize(const BasicBlock *BB, ProfileSummaryInfo *PSI, 78 BlockFrequencyInfo *BFI) { 79 return shouldOptimizeForSizeImpl<BasicBlockBFIAdapter>(BB, PSI, BFI); 80 } 81