SizeOpts.cpp revision 360784
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 15using namespace llvm; 16 17cl::opt<bool> EnablePGSO( 18 "pgso", cl::Hidden, cl::init(true), 19 cl::desc("Enable the profile guided size optimizations. ")); 20 21cl::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 26cl::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 31cl::opt<bool> PGSOIRPassOrTestOnly( 32 "pgso-ir-pass-or-test-only", cl::Hidden, cl::init(false), 33 cl::desc("Apply the profile guided size optimizations only" 34 "to the IR passes or tests.")); 35 36cl::opt<bool> ForcePGSO( 37 "force-pgso", cl::Hidden, cl::init(false), 38 cl::desc("Force the (profiled-guided) size optimizations. ")); 39 40cl::opt<int> PgsoCutoffInstrProf( 41 "pgso-cutoff-instr-prof", cl::Hidden, cl::init(250000), cl::ZeroOrMore, 42 cl::desc("The profile guided size optimization profile summary cutoff " 43 "for instrumentation profile.")); 44 45cl::opt<int> PgsoCutoffSampleProf( 46 "pgso-cutoff-sample-prof", cl::Hidden, cl::init(800000), cl::ZeroOrMore, 47 cl::desc("The profile guided size optimization profile summary cutoff " 48 "for sample profile.")); 49 50namespace { 51struct BasicBlockBFIAdapter { 52 static bool isFunctionColdInCallGraph(const Function *F, 53 ProfileSummaryInfo *PSI, 54 BlockFrequencyInfo &BFI) { 55 return PSI->isFunctionColdInCallGraph(F, BFI); 56 } 57 static bool isFunctionHotInCallGraphNthPercentile(int CutOff, 58 const Function *F, 59 ProfileSummaryInfo *PSI, 60 BlockFrequencyInfo &BFI) { 61 return PSI->isFunctionHotInCallGraphNthPercentile(CutOff, F, BFI); 62 } 63 static bool isColdBlock(const BasicBlock *BB, 64 ProfileSummaryInfo *PSI, 65 BlockFrequencyInfo *BFI) { 66 return PSI->isColdBlock(BB, BFI); 67 } 68 static bool isHotBlockNthPercentile(int CutOff, 69 const BasicBlock *BB, 70 ProfileSummaryInfo *PSI, 71 BlockFrequencyInfo *BFI) { 72 return PSI->isHotBlockNthPercentile(CutOff, BB, BFI); 73 } 74}; 75} // end anonymous namespace 76 77bool llvm::shouldOptimizeForSize(const Function *F, ProfileSummaryInfo *PSI, 78 BlockFrequencyInfo *BFI, 79 PGSOQueryType QueryType) { 80 return shouldFuncOptimizeForSizeImpl<BasicBlockBFIAdapter>(F, PSI, BFI, 81 QueryType); 82} 83 84bool llvm::shouldOptimizeForSize(const BasicBlock *BB, ProfileSummaryInfo *PSI, 85 BlockFrequencyInfo *BFI, 86 PGSOQueryType QueryType) { 87 return shouldOptimizeForSizeImpl<BasicBlockBFIAdapter>(BB, PSI, BFI, 88 QueryType); 89} 90