115 lines · cpp
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-exception6//7//===----------------------------------------------------------------------===//8//9// This file contains some shared code size optimization related code.10//11//===----------------------------------------------------------------------===//12 13#include "llvm/Transforms/Utils/SizeOpts.h"14#include "llvm/Analysis/BlockFrequencyInfo.h"15 16using namespace llvm;17 18cl::opt<bool> llvm::EnablePGSO(19 "pgso", cl::Hidden, cl::init(true),20 cl::desc("Enable the profile guided size optimizations. "));21 22cl::opt<bool> llvm::PGSOLargeWorkingSetSizeOnly(23 "pgso-lwss-only", cl::Hidden, cl::init(true),24 cl::desc("Apply the profile guided size optimizations only "25 "if the working set size is large (except for cold code.)"));26 27cl::opt<bool> llvm::PGSOColdCodeOnly(28 "pgso-cold-code-only", cl::Hidden, cl::init(false),29 cl::desc("Apply the profile guided size optimizations only "30 "to cold code."));31 32cl::opt<bool> llvm::PGSOColdCodeOnlyForInstrPGO(33 "pgso-cold-code-only-for-instr-pgo", cl::Hidden, cl::init(false),34 cl::desc("Apply the profile guided size optimizations only "35 "to cold code under instrumentation PGO."));36 37cl::opt<bool> llvm::PGSOColdCodeOnlyForSamplePGO(38 "pgso-cold-code-only-for-sample-pgo", cl::Hidden, cl::init(false),39 cl::desc("Apply the profile guided size optimizations only "40 "to cold code under sample PGO."));41 42cl::opt<bool> llvm::PGSOColdCodeOnlyForPartialSamplePGO(43 "pgso-cold-code-only-for-partial-sample-pgo", cl::Hidden, cl::init(false),44 cl::desc("Apply the profile guided size optimizations only "45 "to cold code under partial-profile sample PGO."));46 47cl::opt<bool> llvm::ForcePGSO(48 "force-pgso", cl::Hidden, cl::init(false),49 cl::desc("Force the (profiled-guided) size optimizations. "));50 51cl::opt<int> llvm::PgsoCutoffInstrProf(52 "pgso-cutoff-instr-prof", cl::Hidden, cl::init(950000),53 cl::desc("The profile guided size optimization profile summary cutoff "54 "for instrumentation profile."));55 56cl::opt<int> llvm::PgsoCutoffSampleProf(57 "pgso-cutoff-sample-prof", cl::Hidden, cl::init(990000),58 cl::desc("The profile guided size optimization profile summary cutoff "59 "for sample profile."));60 61namespace {62struct BasicBlockBFIAdapter {63 static bool isFunctionColdInCallGraph(const Function *F,64 ProfileSummaryInfo *PSI,65 BlockFrequencyInfo &BFI) {66 return PSI->isFunctionColdInCallGraph(F, BFI);67 }68 static bool isFunctionHotInCallGraphNthPercentile(int CutOff,69 const Function *F,70 ProfileSummaryInfo *PSI,71 BlockFrequencyInfo &BFI) {72 return PSI->isFunctionHotInCallGraphNthPercentile(CutOff, F, BFI);73 }74 static bool isFunctionColdInCallGraphNthPercentile(int CutOff,75 const Function *F,76 ProfileSummaryInfo *PSI,77 BlockFrequencyInfo &BFI) {78 return PSI->isFunctionColdInCallGraphNthPercentile(CutOff, F, BFI);79 }80 static bool isColdBlock(const BasicBlock *BB,81 ProfileSummaryInfo *PSI,82 BlockFrequencyInfo *BFI) {83 return PSI->isColdBlock(BB, BFI);84 }85 static bool isHotBlockNthPercentile(int CutOff,86 const BasicBlock *BB,87 ProfileSummaryInfo *PSI,88 BlockFrequencyInfo *BFI) {89 return PSI->isHotBlockNthPercentile(CutOff, BB, BFI);90 }91 static bool isColdBlockNthPercentile(int CutOff, const BasicBlock *BB,92 ProfileSummaryInfo *PSI,93 BlockFrequencyInfo *BFI) {94 return PSI->isColdBlockNthPercentile(CutOff, BB, BFI);95 }96};97} // end anonymous namespace98 99bool llvm::shouldOptimizeForSize(const Function *F, ProfileSummaryInfo *PSI,100 BlockFrequencyInfo *BFI,101 PGSOQueryType QueryType) {102 if (F->hasOptSize())103 return true;104 return shouldFuncOptimizeForSizeImpl(F, PSI, BFI, QueryType);105}106 107bool llvm::shouldOptimizeForSize(const BasicBlock *BB, ProfileSummaryInfo *PSI,108 BlockFrequencyInfo *BFI,109 PGSOQueryType QueryType) {110 assert(BB);111 if (BB->getParent()->hasOptSize())112 return true;113 return shouldOptimizeForSizeImpl(BB, PSI, BFI, QueryType);114}115