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