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> llvm::EnablePGSO( 18 "pgso", cl::Hidden, cl::init(true), 19 cl::desc("Enable the profile guided size optimizations. ")); 20 21cl::opt<bool> llvm::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> llvm::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 31cl::opt<bool> llvm::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 36cl::opt<bool> llvm::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 41cl::opt<bool> llvm::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 46cl::opt<bool> llvm::ForcePGSO( 47 "force-pgso", cl::Hidden, cl::init(false), 48 cl::desc("Force the (profiled-guided) size optimizations. ")); 49 50cl::opt<int> llvm::PgsoCutoffInstrProf( 51 "pgso-cutoff-instr-prof", cl::Hidden, cl::init(950000), 52 cl::desc("The profile guided size optimization profile summary cutoff " 53 "for instrumentation profile.")); 54 55cl::opt<int> llvm::PgsoCutoffSampleProf( 56 "pgso-cutoff-sample-prof", cl::Hidden, cl::init(990000), 57 cl::desc("The profile guided size optimization profile summary cutoff " 58 "for sample profile.")); 59 60namespace { 61struct BasicBlockBFIAdapter { 62 static bool isFunctionColdInCallGraph(const Function *F, 63 ProfileSummaryInfo *PSI, 64 BlockFrequencyInfo &BFI) { 65 return PSI->isFunctionColdInCallGraph(F, BFI); 66 } 67 static bool isFunctionHotInCallGraphNthPercentile(int CutOff, 68 const Function *F, 69 ProfileSummaryInfo *PSI, 70 BlockFrequencyInfo &BFI) { 71 return PSI->isFunctionHotInCallGraphNthPercentile(CutOff, F, BFI); 72 } 73 static bool isFunctionColdInCallGraphNthPercentile(int CutOff, 74 const Function *F, 75 ProfileSummaryInfo *PSI, 76 BlockFrequencyInfo &BFI) { 77 return PSI->isFunctionColdInCallGraphNthPercentile(CutOff, F, BFI); 78 } 79 static bool isColdBlock(const BasicBlock *BB, 80 ProfileSummaryInfo *PSI, 81 BlockFrequencyInfo *BFI) { 82 return PSI->isColdBlock(BB, BFI); 83 } 84 static bool isHotBlockNthPercentile(int CutOff, 85 const BasicBlock *BB, 86 ProfileSummaryInfo *PSI, 87 BlockFrequencyInfo *BFI) { 88 return PSI->isHotBlockNthPercentile(CutOff, BB, BFI); 89 } 90 static bool isColdBlockNthPercentile(int CutOff, const BasicBlock *BB, 91 ProfileSummaryInfo *PSI, 92 BlockFrequencyInfo *BFI) { 93 return PSI->isColdBlockNthPercentile(CutOff, BB, BFI); 94 } 95}; 96} // end anonymous namespace 97 98bool llvm::shouldOptimizeForSize(const Function *F, ProfileSummaryInfo *PSI, 99 BlockFrequencyInfo *BFI, 100 PGSOQueryType QueryType) { 101 return shouldFuncOptimizeForSizeImpl(F, PSI, BFI, QueryType); 102} 103 104bool llvm::shouldOptimizeForSize(const BasicBlock *BB, ProfileSummaryInfo *PSI, 105 BlockFrequencyInfo *BFI, 106 PGSOQueryType QueryType) { 107 assert(BB); 108 return shouldOptimizeForSizeImpl(BB, PSI, BFI, QueryType); 109} 110