1 //===- MachineSizeOpts.cpp - code size optimization related code ----------===//
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
7 //===----------------------------------------------------------------------===//
9 // This file contains some shared machine IR code size optimization related
12 //===----------------------------------------------------------------------===//
14 #include "llvm/CodeGen/MachineSizeOpts.h"
15 #include "llvm/CodeGen/MBFIWrapper.h"
16 #include "llvm/Analysis/ProfileSummaryInfo.h"
17 #include "llvm/CodeGen/MachineBlockFrequencyInfo.h"
21 extern cl::opt
<bool> EnablePGSO
;
22 extern cl::opt
<bool> PGSOLargeWorkingSetSizeOnly
;
23 extern cl::opt
<bool> ForcePGSO
;
24 extern cl::opt
<int> PgsoCutoffInstrProf
;
25 extern cl::opt
<int> PgsoCutoffSampleProf
;
28 namespace machine_size_opts_detail
{
30 /// Like ProfileSummaryInfo::isColdBlock but for MachineBasicBlock.
31 bool isColdBlock(const MachineBasicBlock
*MBB
,
32 ProfileSummaryInfo
*PSI
,
33 const MachineBlockFrequencyInfo
*MBFI
) {
34 auto Count
= MBFI
->getBlockProfileCount(MBB
);
35 return Count
&& PSI
->isColdCount(*Count
);
38 bool isColdBlock(BlockFrequency BlockFreq
,
39 ProfileSummaryInfo
*PSI
,
40 const MachineBlockFrequencyInfo
*MBFI
) {
41 auto Count
= MBFI
->getProfileCountFromFreq(BlockFreq
.getFrequency());
42 return Count
&& PSI
->isColdCount(*Count
);
45 /// Like ProfileSummaryInfo::isHotBlockNthPercentile but for MachineBasicBlock.
46 static bool isHotBlockNthPercentile(int PercentileCutoff
,
47 const MachineBasicBlock
*MBB
,
48 ProfileSummaryInfo
*PSI
,
49 const MachineBlockFrequencyInfo
*MBFI
) {
50 auto Count
= MBFI
->getBlockProfileCount(MBB
);
51 return Count
&& PSI
->isHotCountNthPercentile(PercentileCutoff
, *Count
);
54 static bool isHotBlockNthPercentile(int PercentileCutoff
,
55 BlockFrequency BlockFreq
,
56 ProfileSummaryInfo
*PSI
,
57 const MachineBlockFrequencyInfo
*MBFI
) {
58 auto Count
= MBFI
->getProfileCountFromFreq(BlockFreq
.getFrequency());
59 return Count
&& PSI
->isHotCountNthPercentile(PercentileCutoff
, *Count
);
62 static bool isColdBlockNthPercentile(int PercentileCutoff
,
63 const MachineBasicBlock
*MBB
,
64 ProfileSummaryInfo
*PSI
,
65 const MachineBlockFrequencyInfo
*MBFI
) {
66 auto Count
= MBFI
->getBlockProfileCount(MBB
);
67 return Count
&& PSI
->isColdCountNthPercentile(PercentileCutoff
, *Count
);
70 static bool isColdBlockNthPercentile(int PercentileCutoff
,
71 BlockFrequency BlockFreq
,
72 ProfileSummaryInfo
*PSI
,
73 const MachineBlockFrequencyInfo
*MBFI
) {
74 auto Count
= MBFI
->getProfileCountFromFreq(BlockFreq
.getFrequency());
75 return Count
&& PSI
->isColdCountNthPercentile(PercentileCutoff
, *Count
);
78 /// Like ProfileSummaryInfo::isFunctionColdInCallGraph but for
80 bool isFunctionColdInCallGraph(
81 const MachineFunction
*MF
,
82 ProfileSummaryInfo
*PSI
,
83 const MachineBlockFrequencyInfo
&MBFI
) {
84 if (auto FunctionCount
= MF
->getFunction().getEntryCount())
85 if (!PSI
->isColdCount(FunctionCount
->getCount()))
87 for (const auto &MBB
: *MF
)
88 if (!isColdBlock(&MBB
, PSI
, &MBFI
))
93 /// Like ProfileSummaryInfo::isFunctionHotInCallGraphNthPercentile but for
95 bool isFunctionHotInCallGraphNthPercentile(
97 const MachineFunction
*MF
,
98 ProfileSummaryInfo
*PSI
,
99 const MachineBlockFrequencyInfo
&MBFI
) {
100 if (auto FunctionCount
= MF
->getFunction().getEntryCount())
101 if (PSI
->isHotCountNthPercentile(PercentileCutoff
,
102 FunctionCount
->getCount()))
104 for (const auto &MBB
: *MF
)
105 if (isHotBlockNthPercentile(PercentileCutoff
, &MBB
, PSI
, &MBFI
))
110 bool isFunctionColdInCallGraphNthPercentile(
111 int PercentileCutoff
, const MachineFunction
*MF
, ProfileSummaryInfo
*PSI
,
112 const MachineBlockFrequencyInfo
&MBFI
) {
113 if (auto FunctionCount
= MF
->getFunction().getEntryCount())
114 if (!PSI
->isColdCountNthPercentile(PercentileCutoff
,
115 FunctionCount
->getCount()))
117 for (const auto &MBB
: *MF
)
118 if (!isColdBlockNthPercentile(PercentileCutoff
, &MBB
, PSI
, &MBFI
))
122 } // namespace machine_size_opts_detail
124 struct MachineBasicBlockBFIAdapter
{
125 static bool isFunctionColdInCallGraph(const MachineFunction
*MF
,
126 ProfileSummaryInfo
*PSI
,
127 const MachineBlockFrequencyInfo
&MBFI
) {
128 return machine_size_opts_detail::isFunctionColdInCallGraph(MF
, PSI
, MBFI
);
130 static bool isFunctionHotInCallGraphNthPercentile(
132 const MachineFunction
*MF
,
133 ProfileSummaryInfo
*PSI
,
134 const MachineBlockFrequencyInfo
&MBFI
) {
135 return machine_size_opts_detail::isFunctionHotInCallGraphNthPercentile(
136 CutOff
, MF
, PSI
, MBFI
);
138 static bool isFunctionColdInCallGraphNthPercentile(
139 int CutOff
, const MachineFunction
*MF
, ProfileSummaryInfo
*PSI
,
140 const MachineBlockFrequencyInfo
&MBFI
) {
141 return machine_size_opts_detail::isFunctionColdInCallGraphNthPercentile(
142 CutOff
, MF
, PSI
, MBFI
);
144 static bool isColdBlock(const MachineBasicBlock
*MBB
,
145 ProfileSummaryInfo
*PSI
,
146 const MachineBlockFrequencyInfo
*MBFI
) {
147 return machine_size_opts_detail::isColdBlock(MBB
, PSI
, MBFI
);
149 static bool isColdBlock(BlockFrequency BlockFreq
,
150 ProfileSummaryInfo
*PSI
,
151 const MachineBlockFrequencyInfo
*MBFI
) {
152 return machine_size_opts_detail::isColdBlock(BlockFreq
, PSI
, MBFI
);
154 static bool isHotBlockNthPercentile(int CutOff
,
155 const MachineBasicBlock
*MBB
,
156 ProfileSummaryInfo
*PSI
,
157 const MachineBlockFrequencyInfo
*MBFI
) {
158 return machine_size_opts_detail::isHotBlockNthPercentile(
159 CutOff
, MBB
, PSI
, MBFI
);
161 static bool isHotBlockNthPercentile(int CutOff
,
162 BlockFrequency BlockFreq
,
163 ProfileSummaryInfo
*PSI
,
164 const MachineBlockFrequencyInfo
*MBFI
) {
165 return machine_size_opts_detail::isHotBlockNthPercentile(
166 CutOff
, BlockFreq
, PSI
, MBFI
);
168 static bool isColdBlockNthPercentile(int CutOff
, const MachineBasicBlock
*MBB
,
169 ProfileSummaryInfo
*PSI
,
170 const MachineBlockFrequencyInfo
*MBFI
) {
171 return machine_size_opts_detail::isColdBlockNthPercentile(CutOff
, MBB
, PSI
,
174 static bool isColdBlockNthPercentile(int CutOff
, BlockFrequency BlockFreq
,
175 ProfileSummaryInfo
*PSI
,
176 const MachineBlockFrequencyInfo
*MBFI
) {
177 return machine_size_opts_detail::isColdBlockNthPercentile(CutOff
, BlockFreq
,
181 } // end anonymous namespace
183 bool llvm::shouldOptimizeForSize(const MachineFunction
*MF
,
184 ProfileSummaryInfo
*PSI
,
185 const MachineBlockFrequencyInfo
*MBFI
,
186 PGSOQueryType QueryType
) {
187 return shouldFuncOptimizeForSizeImpl
<MachineBasicBlockBFIAdapter
>(
188 MF
, PSI
, MBFI
, QueryType
);
191 bool llvm::shouldOptimizeForSize(const MachineBasicBlock
*MBB
,
192 ProfileSummaryInfo
*PSI
,
193 const MachineBlockFrequencyInfo
*MBFI
,
194 PGSOQueryType QueryType
) {
196 return shouldOptimizeForSizeImpl
<MachineBasicBlockBFIAdapter
>(
197 MBB
, PSI
, MBFI
, QueryType
);
200 bool llvm::shouldOptimizeForSize(const MachineBasicBlock
*MBB
,
201 ProfileSummaryInfo
*PSI
,
203 PGSOQueryType QueryType
) {
207 BlockFrequency BlockFreq
= MBFIW
->getBlockFreq(MBB
);
208 return shouldOptimizeForSizeImpl
<MachineBasicBlockBFIAdapter
>(
209 BlockFreq
, PSI
, &MBFIW
->getMBFI(), QueryType
);