brintos

brintos / llvm-project-archived public Read only

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