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 | #include "llvm/Analysis/BlockFrequencyInfo.h" |
15 | |
16 | using namespace llvm; |
17 | |
18 | cl::opt<bool> llvm::EnablePGSO( |
19 | "pgso" , cl::Hidden, cl::init(Val: true), |
20 | cl::desc("Enable the profile guided size optimizations. " )); |
21 | |
22 | cl::opt<bool> llvm::PGSOLargeWorkingSetSizeOnly( |
23 | "pgso-lwss-only" , cl::Hidden, cl::init(Val: true), |
24 | cl::desc("Apply the profile guided size optimizations only " |
25 | "if the working set size is large (except for cold code.)" )); |
26 | |
27 | cl::opt<bool> llvm::PGSOColdCodeOnly( |
28 | "pgso-cold-code-only" , cl::Hidden, cl::init(Val: false), |
29 | cl::desc("Apply the profile guided size optimizations only " |
30 | "to cold code." )); |
31 | |
32 | cl::opt<bool> llvm::PGSOColdCodeOnlyForInstrPGO( |
33 | "pgso-cold-code-only-for-instr-pgo" , cl::Hidden, cl::init(Val: false), |
34 | cl::desc("Apply the profile guided size optimizations only " |
35 | "to cold code under instrumentation PGO." )); |
36 | |
37 | cl::opt<bool> llvm::PGSOColdCodeOnlyForSamplePGO( |
38 | "pgso-cold-code-only-for-sample-pgo" , cl::Hidden, cl::init(Val: false), |
39 | cl::desc("Apply the profile guided size optimizations only " |
40 | "to cold code under sample PGO." )); |
41 | |
42 | cl::opt<bool> llvm::PGSOColdCodeOnlyForPartialSamplePGO( |
43 | "pgso-cold-code-only-for-partial-sample-pgo" , cl::Hidden, cl::init(Val: false), |
44 | cl::desc("Apply the profile guided size optimizations only " |
45 | "to cold code under partial-profile sample PGO." )); |
46 | |
47 | cl::opt<bool> llvm::ForcePGSO( |
48 | "force-pgso" , cl::Hidden, cl::init(Val: false), |
49 | cl::desc("Force the (profiled-guided) size optimizations. " )); |
50 | |
51 | cl::opt<int> llvm::PgsoCutoffInstrProf( |
52 | "pgso-cutoff-instr-prof" , cl::Hidden, cl::init(Val: 950000), |
53 | cl::desc("The profile guided size optimization profile summary cutoff " |
54 | "for instrumentation profile." )); |
55 | |
56 | cl::opt<int> llvm::PgsoCutoffSampleProf( |
57 | "pgso-cutoff-sample-prof" , cl::Hidden, cl::init(Val: 990000), |
58 | cl::desc("The profile guided size optimization profile summary cutoff " |
59 | "for sample profile." )); |
60 | |
61 | namespace { |
62 | struct 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(PercentileCutoff: CutOff, F, BFI); |
73 | } |
74 | static bool isFunctionColdInCallGraphNthPercentile(int CutOff, |
75 | const Function *F, |
76 | ProfileSummaryInfo *PSI, |
77 | BlockFrequencyInfo &BFI) { |
78 | return PSI->isFunctionColdInCallGraphNthPercentile(PercentileCutoff: 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(PercentileCutoff: CutOff, BB, BFI); |
90 | } |
91 | static bool isColdBlockNthPercentile(int CutOff, const BasicBlock *BB, |
92 | ProfileSummaryInfo *PSI, |
93 | BlockFrequencyInfo *BFI) { |
94 | return PSI->isColdBlockNthPercentile(PercentileCutoff: CutOff, BB, BFI); |
95 | } |
96 | }; |
97 | } // end anonymous namespace |
98 | |
99 | bool 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 | |
107 | bool 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(BBOrBlockFreq: BB, PSI, BFI, QueryType); |
114 | } |
115 | |