1//===- llvm/Transforms/Utils/SizeOpts.h - size optimization -----*- C++ -*-===//
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#ifndef LLVM_TRANSFORMS_UTILS_SIZEOPTS_H
14#define LLVM_TRANSFORMS_UTILS_SIZEOPTS_H
15
16#include "llvm/Analysis/ProfileSummaryInfo.h"
17#include "llvm/Support/CommandLine.h"
18
19namespace llvm {
20extern cl::opt<bool> EnablePGSO;
21extern cl::opt<bool> PGSOLargeWorkingSetSizeOnly;
22extern cl::opt<bool> PGSOColdCodeOnly;
23extern cl::opt<bool> PGSOColdCodeOnlyForInstrPGO;
24extern cl::opt<bool> PGSOColdCodeOnlyForSamplePGO;
25extern cl::opt<bool> PGSOColdCodeOnlyForPartialSamplePGO;
26extern cl::opt<bool> ForcePGSO;
27extern cl::opt<int> PgsoCutoffInstrProf;
28extern cl::opt<int> PgsoCutoffSampleProf;
29
30class BasicBlock;
31class BlockFrequencyInfo;
32class Function;
33
34enum class PGSOQueryType {
35 IRPass, // A query call from an IR-level transform pass.
36 Test, // A query call from a unit test.
37 Other, // Others.
38};
39
40static inline bool isPGSOColdCodeOnly(ProfileSummaryInfo *PSI) {
41 return PGSOColdCodeOnly ||
42 (PSI->hasInstrumentationProfile() && PGSOColdCodeOnlyForInstrPGO) ||
43 (PSI->hasSampleProfile() &&
44 ((!PSI->hasPartialSampleProfile() && PGSOColdCodeOnlyForSamplePGO) ||
45 (PSI->hasPartialSampleProfile() &&
46 PGSOColdCodeOnlyForPartialSamplePGO))) ||
47 (PGSOLargeWorkingSetSizeOnly && !PSI->hasLargeWorkingSetSize());
48}
49
50template<typename AdapterT, typename FuncT, typename BFIT>
51bool shouldFuncOptimizeForSizeImpl(const FuncT *F, ProfileSummaryInfo *PSI,
52 BFIT *BFI, PGSOQueryType QueryType) {
53 assert(F);
54 if (!PSI || !BFI || !PSI->hasProfileSummary())
55 return false;
56 if (ForcePGSO)
57 return true;
58 if (!EnablePGSO)
59 return false;
60 if (isPGSOColdCodeOnly(PSI))
61 return AdapterT::isFunctionColdInCallGraph(F, PSI, *BFI);
62 if (PSI->hasSampleProfile())
63 // The "isCold" check seems to work better for Sample PGO as it could have
64 // many profile-unannotated functions.
65 return AdapterT::isFunctionColdInCallGraphNthPercentile(
66 PgsoCutoffSampleProf, F, PSI, *BFI);
67 return !AdapterT::isFunctionHotInCallGraphNthPercentile(PgsoCutoffInstrProf,
68 F, PSI, *BFI);
69}
70
71template<typename AdapterT, typename BlockTOrBlockFreq, typename BFIT>
72bool shouldOptimizeForSizeImpl(BlockTOrBlockFreq BBOrBlockFreq, ProfileSummaryInfo *PSI,
73 BFIT *BFI, PGSOQueryType QueryType) {
74 if (!PSI || !BFI || !PSI->hasProfileSummary())
75 return false;
76 if (ForcePGSO)
77 return true;
78 if (!EnablePGSO)
79 return false;
80 if (isPGSOColdCodeOnly(PSI))
81 return AdapterT::isColdBlock(BBOrBlockFreq, PSI, BFI);
82 if (PSI->hasSampleProfile())
83 // The "isCold" check seems to work better for Sample PGO as it could have
84 // many profile-unannotated functions.
85 return AdapterT::isColdBlockNthPercentile(PgsoCutoffSampleProf,
86 BBOrBlockFreq, PSI, BFI);
87 return !AdapterT::isHotBlockNthPercentile(PgsoCutoffInstrProf, BBOrBlockFreq,
88 PSI, BFI);
89}
90
91/// Returns true if function \p F is suggested to be size-optimized based on the
92/// profile.
93bool shouldOptimizeForSize(const Function *F, ProfileSummaryInfo *PSI,
94 BlockFrequencyInfo *BFI,
95 PGSOQueryType QueryType = PGSOQueryType::Other);
96
97/// Returns true if basic block \p BB is suggested to be size-optimized based on
98/// the profile.
99bool shouldOptimizeForSize(const BasicBlock *BB, ProfileSummaryInfo *PSI,
100 BlockFrequencyInfo *BFI,
101 PGSOQueryType QueryType = PGSOQueryType::Other);
102
103} // end namespace llvm
104
105#endif // LLVM_TRANSFORMS_UTILS_SIZEOPTS_H
106

source code of llvm/include/llvm/Transforms/Utils/SizeOpts.h