SizeOpts.h revision 360784
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/BlockFrequencyInfo.h"
17#include "llvm/Analysis/ProfileSummaryInfo.h"
18#include "llvm/Support/CommandLine.h"
19
20extern llvm::cl::opt<bool> EnablePGSO;
21extern llvm::cl::opt<bool> PGSOLargeWorkingSetSizeOnly;
22extern llvm::cl::opt<bool> PGSOIRPassOrTestOnly;
23extern llvm::cl::opt<bool> PGSOColdCodeOnly;
24extern llvm::cl::opt<bool> ForcePGSO;
25extern llvm::cl::opt<int> PgsoCutoffInstrProf;
26extern llvm::cl::opt<int> PgsoCutoffSampleProf;
27
28namespace llvm {
29
30class BasicBlock;
31class BlockFrequencyInfo;
32class Function;
33class ProfileSummaryInfo;
34
35enum class PGSOQueryType {
36  IRPass, // A query call from an IR-level transform pass.
37  Test,   // A query call from a unit test.
38  Other,  // Others.
39};
40
41template<typename AdapterT, typename FuncT, typename BFIT>
42bool shouldFuncOptimizeForSizeImpl(const FuncT *F, ProfileSummaryInfo *PSI,
43                                   BFIT *BFI, PGSOQueryType QueryType) {
44  assert(F);
45  if (!PSI || !BFI || !PSI->hasProfileSummary())
46    return false;
47  if (ForcePGSO)
48    return true;
49  if (!EnablePGSO)
50    return false;
51  // Temporarily enable size optimizations only for the IR pass or test query
52  // sites for gradual commit/rollout. This is to be removed later.
53  if (PGSOIRPassOrTestOnly && !(QueryType == PGSOQueryType::IRPass ||
54                                QueryType == PGSOQueryType::Test))
55    return false;
56  if (PGSOColdCodeOnly ||
57      (PGSOLargeWorkingSetSizeOnly && !PSI->hasLargeWorkingSetSize())) {
58    // Even if the working set size isn't large, size-optimize cold code.
59    return AdapterT::isFunctionColdInCallGraph(F, PSI, *BFI);
60  }
61  return !AdapterT::isFunctionHotInCallGraphNthPercentile(
62      PSI->hasSampleProfile() ? PgsoCutoffSampleProf : PgsoCutoffInstrProf,
63      F, PSI, *BFI);
64}
65
66template<typename AdapterT, typename BlockT, typename BFIT>
67bool shouldOptimizeForSizeImpl(const BlockT *BB, ProfileSummaryInfo *PSI,
68                               BFIT *BFI, PGSOQueryType QueryType) {
69  assert(BB);
70  if (!PSI || !BFI || !PSI->hasProfileSummary())
71    return false;
72  if (ForcePGSO)
73    return true;
74  if (!EnablePGSO)
75    return false;
76  // Temporarily enable size optimizations only for the IR pass or test query
77  // sites for gradual commit/rollout. This is to be removed later.
78  if (PGSOIRPassOrTestOnly && !(QueryType == PGSOQueryType::IRPass ||
79                                QueryType == PGSOQueryType::Test))
80    return false;
81  if (PGSOColdCodeOnly ||
82      (PGSOLargeWorkingSetSizeOnly && !PSI->hasLargeWorkingSetSize())) {
83    // Even if the working set size isn't large, size-optimize cold code.
84    return AdapterT::isColdBlock(BB, PSI, BFI);
85  }
86  return !AdapterT::isHotBlockNthPercentile(
87      PSI->hasSampleProfile() ? PgsoCutoffSampleProf : PgsoCutoffInstrProf,
88      BB, 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