109e539fcSHiroshi Yamauchi //===-- SizeOpts.cpp - code size optimization related code ----------------===//
209e539fcSHiroshi Yamauchi //
309e539fcSHiroshi Yamauchi // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
409e539fcSHiroshi Yamauchi // See https://llvm.org/LICENSE.txt for license information.
509e539fcSHiroshi Yamauchi // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
609e539fcSHiroshi Yamauchi //
709e539fcSHiroshi Yamauchi //===----------------------------------------------------------------------===//
809e539fcSHiroshi Yamauchi //
909e539fcSHiroshi Yamauchi // This file contains some shared code size optimization related code.
1009e539fcSHiroshi Yamauchi //
1109e539fcSHiroshi Yamauchi //===----------------------------------------------------------------------===//
1209e539fcSHiroshi Yamauchi
1309e539fcSHiroshi Yamauchi #include "llvm/Transforms/Utils/SizeOpts.h"
1475f72f6bSHiroshi Yamauchi
1509e539fcSHiroshi Yamauchi using namespace llvm;
1609e539fcSHiroshi Yamauchi
17d8aba75aSFangrui Song cl::opt<bool> llvm::EnablePGSO(
1809e539fcSHiroshi Yamauchi "pgso", cl::Hidden, cl::init(true),
1975f72f6bSHiroshi Yamauchi cl::desc("Enable the profile guided size optimizations. "));
2009e539fcSHiroshi Yamauchi
21d8aba75aSFangrui Song cl::opt<bool> llvm::PGSOLargeWorkingSetSizeOnly(
2275f72f6bSHiroshi Yamauchi "pgso-lwss-only", cl::Hidden, cl::init(true),
2375f72f6bSHiroshi Yamauchi cl::desc("Apply the profile guided size optimizations only "
2475f72f6bSHiroshi Yamauchi "if the working set size is large (except for cold code.)"));
2575f72f6bSHiroshi Yamauchi
26d8aba75aSFangrui Song cl::opt<bool> llvm::PGSOColdCodeOnly(
274ed205c8SHiroshi Yamauchi "pgso-cold-code-only", cl::Hidden, cl::init(false),
283f0969daSHiroshi Yamauchi cl::desc("Apply the profile guided size optimizations only "
293f0969daSHiroshi Yamauchi "to cold code."));
303f0969daSHiroshi Yamauchi
31d8aba75aSFangrui Song cl::opt<bool> llvm::PGSOColdCodeOnlyForInstrPGO(
324ed205c8SHiroshi Yamauchi "pgso-cold-code-only-for-instr-pgo", cl::Hidden, cl::init(false),
33b70f23f5SHiroshi Yamauchi cl::desc("Apply the profile guided size optimizations only "
34b70f23f5SHiroshi Yamauchi "to cold code under instrumentation PGO."));
35b70f23f5SHiroshi Yamauchi
36d8aba75aSFangrui Song cl::opt<bool> llvm::PGSOColdCodeOnlyForSamplePGO(
37b5632f40SHiroshi Yamauchi "pgso-cold-code-only-for-sample-pgo", cl::Hidden, cl::init(false),
38b70f23f5SHiroshi Yamauchi cl::desc("Apply the profile guided size optimizations only "
39b70f23f5SHiroshi Yamauchi "to cold code under sample PGO."));
40b70f23f5SHiroshi Yamauchi
41d8aba75aSFangrui Song cl::opt<bool> llvm::PGSOColdCodeOnlyForPartialSamplePGO(
429e1decf7SHiroshi Yamauchi "pgso-cold-code-only-for-partial-sample-pgo", cl::Hidden, cl::init(false),
4318319868SHiroshi Yamauchi cl::desc("Apply the profile guided size optimizations only "
4418319868SHiroshi Yamauchi "to cold code under partial-profile sample PGO."));
4518319868SHiroshi Yamauchi
46d8aba75aSFangrui Song cl::opt<bool> llvm::ForcePGSO(
4775f72f6bSHiroshi Yamauchi "force-pgso", cl::Hidden, cl::init(false),
4875f72f6bSHiroshi Yamauchi cl::desc("Force the (profiled-guided) size optimizations. "));
4975f72f6bSHiroshi Yamauchi
50d8aba75aSFangrui Song cl::opt<int> llvm::PgsoCutoffInstrProf(
51*557efc9aSFangrui Song "pgso-cutoff-instr-prof", cl::Hidden, cl::init(950000),
5275f72f6bSHiroshi Yamauchi cl::desc("The profile guided size optimization profile summary cutoff "
5375f72f6bSHiroshi Yamauchi "for instrumentation profile."));
5475f72f6bSHiroshi Yamauchi
55d8aba75aSFangrui Song cl::opt<int> llvm::PgsoCutoffSampleProf(
56*557efc9aSFangrui Song "pgso-cutoff-sample-prof", cl::Hidden, cl::init(990000),
5775f72f6bSHiroshi Yamauchi cl::desc("The profile guided size optimization profile summary cutoff "
5875f72f6bSHiroshi Yamauchi "for sample profile."));
5975f72f6bSHiroshi Yamauchi
6075f72f6bSHiroshi Yamauchi namespace {
6175f72f6bSHiroshi Yamauchi struct BasicBlockBFIAdapter {
isFunctionColdInCallGraph__anonfc1c2e5f0111::BasicBlockBFIAdapter6275f72f6bSHiroshi Yamauchi static bool isFunctionColdInCallGraph(const Function *F,
6375f72f6bSHiroshi Yamauchi ProfileSummaryInfo *PSI,
6475f72f6bSHiroshi Yamauchi BlockFrequencyInfo &BFI) {
6575f72f6bSHiroshi Yamauchi return PSI->isFunctionColdInCallGraph(F, BFI);
6675f72f6bSHiroshi Yamauchi }
isFunctionHotInCallGraphNthPercentile__anonfc1c2e5f0111::BasicBlockBFIAdapter6775f72f6bSHiroshi Yamauchi static bool isFunctionHotInCallGraphNthPercentile(int CutOff,
6875f72f6bSHiroshi Yamauchi const Function *F,
6975f72f6bSHiroshi Yamauchi ProfileSummaryInfo *PSI,
7075f72f6bSHiroshi Yamauchi BlockFrequencyInfo &BFI) {
7175f72f6bSHiroshi Yamauchi return PSI->isFunctionHotInCallGraphNthPercentile(CutOff, F, BFI);
7275f72f6bSHiroshi Yamauchi }
isFunctionColdInCallGraphNthPercentile__anonfc1c2e5f0111::BasicBlockBFIAdapter7376b9901fSHiroshi Yamauchi static bool isFunctionColdInCallGraphNthPercentile(int CutOff,
7476b9901fSHiroshi Yamauchi const Function *F,
7576b9901fSHiroshi Yamauchi ProfileSummaryInfo *PSI,
7676b9901fSHiroshi Yamauchi BlockFrequencyInfo &BFI) {
7776b9901fSHiroshi Yamauchi return PSI->isFunctionColdInCallGraphNthPercentile(CutOff, F, BFI);
7876b9901fSHiroshi Yamauchi }
isColdBlock__anonfc1c2e5f0111::BasicBlockBFIAdapter7975f72f6bSHiroshi Yamauchi static bool isColdBlock(const BasicBlock *BB,
8075f72f6bSHiroshi Yamauchi ProfileSummaryInfo *PSI,
8109e539fcSHiroshi Yamauchi BlockFrequencyInfo *BFI) {
8275f72f6bSHiroshi Yamauchi return PSI->isColdBlock(BB, BFI);
8375f72f6bSHiroshi Yamauchi }
isHotBlockNthPercentile__anonfc1c2e5f0111::BasicBlockBFIAdapter8475f72f6bSHiroshi Yamauchi static bool isHotBlockNthPercentile(int CutOff,
8575f72f6bSHiroshi Yamauchi const BasicBlock *BB,
8675f72f6bSHiroshi Yamauchi ProfileSummaryInfo *PSI,
8775f72f6bSHiroshi Yamauchi BlockFrequencyInfo *BFI) {
8875f72f6bSHiroshi Yamauchi return PSI->isHotBlockNthPercentile(CutOff, BB, BFI);
8975f72f6bSHiroshi Yamauchi }
isColdBlockNthPercentile__anonfc1c2e5f0111::BasicBlockBFIAdapter9076b9901fSHiroshi Yamauchi static bool isColdBlockNthPercentile(int CutOff, const BasicBlock *BB,
9176b9901fSHiroshi Yamauchi ProfileSummaryInfo *PSI,
9276b9901fSHiroshi Yamauchi BlockFrequencyInfo *BFI) {
9376b9901fSHiroshi Yamauchi return PSI->isColdBlockNthPercentile(CutOff, BB, BFI);
9476b9901fSHiroshi Yamauchi }
9575f72f6bSHiroshi Yamauchi };
9675f72f6bSHiroshi Yamauchi } // end anonymous namespace
9775f72f6bSHiroshi Yamauchi
shouldOptimizeForSize(const Function * F,ProfileSummaryInfo * PSI,BlockFrequencyInfo * BFI,PGSOQueryType QueryType)9875f72f6bSHiroshi Yamauchi bool llvm::shouldOptimizeForSize(const Function *F, ProfileSummaryInfo *PSI,
998cdfdfeeSHiroshi Yamauchi BlockFrequencyInfo *BFI,
1008cdfdfeeSHiroshi Yamauchi PGSOQueryType QueryType) {
1018cdfdfeeSHiroshi Yamauchi return shouldFuncOptimizeForSizeImpl<BasicBlockBFIAdapter>(F, PSI, BFI,
1028cdfdfeeSHiroshi Yamauchi QueryType);
10309e539fcSHiroshi Yamauchi }
10409e539fcSHiroshi Yamauchi
shouldOptimizeForSize(const BasicBlock * BB,ProfileSummaryInfo * PSI,BlockFrequencyInfo * BFI,PGSOQueryType QueryType)10575f72f6bSHiroshi Yamauchi bool llvm::shouldOptimizeForSize(const BasicBlock *BB, ProfileSummaryInfo *PSI,
1068cdfdfeeSHiroshi Yamauchi BlockFrequencyInfo *BFI,
1078cdfdfeeSHiroshi Yamauchi PGSOQueryType QueryType) {
108ac8da31aSHiroshi Yamauchi assert(BB);
1098cdfdfeeSHiroshi Yamauchi return shouldOptimizeForSizeImpl<BasicBlockBFIAdapter>(BB, PSI, BFI,
1108cdfdfeeSHiroshi Yamauchi QueryType);
11109e539fcSHiroshi Yamauchi }
112