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(false), 28 cl::desc("Apply the profile guided size optimizations only " 29 "to cold code.")); 30 31 cl::opt<bool> PGSOColdCodeOnlyForInstrPGO( 32 "pgso-cold-code-only-for-instr-pgo", cl::Hidden, cl::init(false), 33 cl::desc("Apply the profile guided size optimizations only " 34 "to cold code under instrumentation PGO.")); 35 36 cl::opt<bool> PGSOColdCodeOnlyForSamplePGO( 37 "pgso-cold-code-only-for-sample-pgo", cl::Hidden, cl::init(false), 38 cl::desc("Apply the profile guided size optimizations only " 39 "to cold code under sample PGO.")); 40 41 cl::opt<bool> PGSOColdCodeOnlyForPartialSamplePGO( 42 "pgso-cold-code-only-for-partial-sample-pgo", cl::Hidden, cl::init(false), 43 cl::desc("Apply the profile guided size optimizations only " 44 "to cold code under partial-profile sample PGO.")); 45 46 cl::opt<bool> PGSOIRPassOrTestOnly( 47 "pgso-ir-pass-or-test-only", cl::Hidden, cl::init(false), 48 cl::desc("Apply the profile guided size optimizations only" 49 "to the IR passes or tests.")); 50 51 cl::opt<bool> ForcePGSO( 52 "force-pgso", cl::Hidden, cl::init(false), 53 cl::desc("Force the (profiled-guided) size optimizations. ")); 54 55 cl::opt<int> PgsoCutoffInstrProf( 56 "pgso-cutoff-instr-prof", cl::Hidden, cl::init(950000), cl::ZeroOrMore, 57 cl::desc("The profile guided size optimization profile summary cutoff " 58 "for instrumentation profile.")); 59 60 cl::opt<int> PgsoCutoffSampleProf( 61 "pgso-cutoff-sample-prof", cl::Hidden, cl::init(990000), cl::ZeroOrMore, 62 cl::desc("The profile guided size optimization profile summary cutoff " 63 "for sample profile.")); 64 65 namespace { 66 struct BasicBlockBFIAdapter { 67 static bool isFunctionColdInCallGraph(const Function *F, 68 ProfileSummaryInfo *PSI, 69 BlockFrequencyInfo &BFI) { 70 return PSI->isFunctionColdInCallGraph(F, BFI); 71 } 72 static bool isFunctionHotInCallGraphNthPercentile(int CutOff, 73 const Function *F, 74 ProfileSummaryInfo *PSI, 75 BlockFrequencyInfo &BFI) { 76 return PSI->isFunctionHotInCallGraphNthPercentile(CutOff, F, BFI); 77 } 78 static bool isFunctionColdInCallGraphNthPercentile(int CutOff, 79 const Function *F, 80 ProfileSummaryInfo *PSI, 81 BlockFrequencyInfo &BFI) { 82 return PSI->isFunctionColdInCallGraphNthPercentile(CutOff, F, BFI); 83 } 84 static bool isColdBlock(const BasicBlock *BB, 85 ProfileSummaryInfo *PSI, 86 BlockFrequencyInfo *BFI) { 87 return PSI->isColdBlock(BB, BFI); 88 } 89 static bool isHotBlockNthPercentile(int CutOff, 90 const BasicBlock *BB, 91 ProfileSummaryInfo *PSI, 92 BlockFrequencyInfo *BFI) { 93 return PSI->isHotBlockNthPercentile(CutOff, BB, BFI); 94 } 95 static bool isColdBlockNthPercentile(int CutOff, const BasicBlock *BB, 96 ProfileSummaryInfo *PSI, 97 BlockFrequencyInfo *BFI) { 98 return PSI->isColdBlockNthPercentile(CutOff, BB, BFI); 99 } 100 }; 101 } // end anonymous namespace 102 103 bool llvm::shouldOptimizeForSize(const Function *F, ProfileSummaryInfo *PSI, 104 BlockFrequencyInfo *BFI, 105 PGSOQueryType QueryType) { 106 return shouldFuncOptimizeForSizeImpl<BasicBlockBFIAdapter>(F, PSI, BFI, 107 QueryType); 108 } 109 110 bool llvm::shouldOptimizeForSize(const BasicBlock *BB, ProfileSummaryInfo *PSI, 111 BlockFrequencyInfo *BFI, 112 PGSOQueryType QueryType) { 113 assert(BB); 114 return shouldOptimizeForSizeImpl<BasicBlockBFIAdapter>(BB, PSI, BFI, 115 QueryType); 116 } 117