Commit 75f72f6b authored by Hiroshi Yamauchi's avatar Hiroshi Yamauchi
Browse files

[PGO][PGSO] SizeOpts changes.

Summary:
(Split of off D67120)

SizeOpts/MachineSizeOpts changes for profile guided size optimization.

(A second try after previously committed as r375254 and reverted as r375375.)

Subscribers: mgorny, hiraditya, llvm-commits

Tags: #llvm

Differential Revision: https://reviews.llvm.org/D69409
parent c7557dd6
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -38,6 +38,9 @@ public:
  static char ID;

  MachineBlockFrequencyInfo();
  explicit MachineBlockFrequencyInfo(MachineFunction &F,
                                     MachineBranchProbabilityInfo &MBPI,
                                     MachineLoopInfo &MLI);
  ~MachineBlockFrequencyInfo() override;

  void getAnalysisUsage(AnalysisUsage &AU) const override;
+5 −0
Original line number Diff line number Diff line
@@ -81,6 +81,9 @@ public:
  static char ID; // Pass ID, replacement for typeid

  MachineDominatorTree();
  explicit MachineDominatorTree(MachineFunction &MF) : MachineFunctionPass(ID) {
    calculate(MF);
  }

  DomTreeT &getBase() {
    if (!DT) DT.reset(new DomTreeT());
@@ -111,6 +114,8 @@ public:

  bool runOnMachineFunction(MachineFunction &F) override;

  void calculate(MachineFunction &F);

  bool dominates(const MachineDomTreeNode *A,
                 const MachineDomTreeNode *B) const {
    applySplitCriticalEdges();
+6 −0
Original line number Diff line number Diff line
@@ -37,6 +37,7 @@

namespace llvm {

class MachineDominatorTree;
// Implementation in LoopInfoImpl.h
class MachineLoop;
extern template class LoopBase<MachineBasicBlock, MachineLoop>;
@@ -91,6 +92,10 @@ public:
  MachineLoopInfo() : MachineFunctionPass(ID) {
    initializeMachineLoopInfoPass(*PassRegistry::getPassRegistry());
  }
  explicit MachineLoopInfo(MachineDominatorTree &MDT)
      : MachineFunctionPass(ID) {
    calculate(MDT);
  }
  MachineLoopInfo(const MachineLoopInfo &) = delete;
  MachineLoopInfo &operator=(const MachineLoopInfo &) = delete;

@@ -133,6 +138,7 @@ public:

  /// Calculate the natural loop information.
  bool runOnMachineFunction(MachineFunction &F) override;
  void calculate(MachineDominatorTree &MDT);

  void releaseMemory() override { LI.releaseMemory(); }

+37 −0
Original line number Diff line number Diff line
//===- MachineSizeOpts.h - machine size optimization ------------*- C++ -*-===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
//
// This file contains some shared machine IR code size optimization related
// code.
//
//===----------------------------------------------------------------------===//
#ifndef LLVM_CODEGEN_MACHINE_SIZEOPTS_H
#define LLVM_CODEGEN_MACHINE_SIZEOPTS_H

#include "llvm/Transforms/Utils/SizeOpts.h"

namespace llvm {

class ProfileSummaryInfo;
class MachineBasicBlock;
class MachineBlockFrequencyInfo;
class MachineFunction;

/// Returns true if machine function \p MF is suggested to be size-optimized
/// base on the profile.
bool shouldOptimizeForSize(const MachineFunction *MF, ProfileSummaryInfo *PSI,
                           const MachineBlockFrequencyInfo *BFI);
/// Returns true if machine basic block \p MBB is suggested to be size-optimized
/// base on the profile.
bool shouldOptimizeForSize(const MachineBasicBlock *MBB,
                           ProfileSummaryInfo *PSI,
                           const MachineBlockFrequencyInfo *MBFI);

} // end namespace llvm

#endif // LLVM_CODEGEN_MACHINE_SIZEOPTS_H
+53 −2
Original line number Diff line number Diff line
@@ -13,6 +13,18 @@
#ifndef LLVM_TRANSFORMS_UTILS_SIZEOPTS_H
#define LLVM_TRANSFORMS_UTILS_SIZEOPTS_H

#include "llvm/Analysis/BlockFrequencyInfo.h"
#include "llvm/Analysis/ProfileSummaryInfo.h"
#include "llvm/Support/CommandLine.h"

using namespace llvm;

extern cl::opt<bool> EnablePGSO;
extern cl::opt<bool> PGSOLargeWorkingSetSizeOnly;
extern cl::opt<bool> ForcePGSO;
extern cl::opt<int> PgsoCutoffInstrProf;
extern cl::opt<int> PgsoCutoffSampleProf;

namespace llvm {

class BasicBlock;
@@ -20,13 +32,52 @@ class BlockFrequencyInfo;
class Function;
class ProfileSummaryInfo;

template<typename AdapterT, typename FuncT, typename BFIT>
bool shouldFuncOptimizeForSizeImpl(const FuncT *F, ProfileSummaryInfo *PSI,
                                   BFIT *BFI) {
  assert(F);
  if (!PSI || !BFI || !PSI->hasProfileSummary())
    return false;
  if (ForcePGSO)
    return true;
  if (!EnablePGSO)
    return false;
  if (PGSOLargeWorkingSetSizeOnly && !PSI->hasLargeWorkingSetSize()) {
    // Even if the working set size isn't large, size-optimize cold code.
    return AdapterT::isFunctionColdInCallGraph(F, PSI, *BFI);
  }
  return !AdapterT::isFunctionHotInCallGraphNthPercentile(
      PSI->hasSampleProfile() ? PgsoCutoffSampleProf : PgsoCutoffInstrProf,
      F, PSI, *BFI);
}

template<typename AdapterT, typename BlockT, typename BFIT>
bool shouldOptimizeForSizeImpl(const BlockT *BB, ProfileSummaryInfo *PSI,
                               BFIT *BFI) {
  assert(BB);
  if (!PSI || !BFI || !PSI->hasProfileSummary())
    return false;
  if (ForcePGSO)
    return true;
  if (!EnablePGSO)
    return false;
  if (PGSOLargeWorkingSetSizeOnly && !PSI->hasLargeWorkingSetSize()) {
    // Even if the working set size isn't large, size-optimize cold code.
    return AdapterT::isColdBlock(BB, PSI, BFI);
  }
  return !AdapterT::isHotBlockNthPercentile(
      PSI->hasSampleProfile() ? PgsoCutoffSampleProf : PgsoCutoffInstrProf,
      BB, PSI, BFI);
}

/// Returns true if function \p F is suggested to be size-optimized base on the
/// profile.
bool shouldOptimizeForSize(Function *F, ProfileSummaryInfo *PSI,
bool shouldOptimizeForSize(const Function *F, ProfileSummaryInfo *PSI,
                           BlockFrequencyInfo *BFI);

/// Returns true if basic block \p BB is suggested to be size-optimized base
/// on the profile.
bool shouldOptimizeForSize(BasicBlock *BB, ProfileSummaryInfo *PSI,
bool shouldOptimizeForSize(const BasicBlock *BB, ProfileSummaryInfo *PSI,
                           BlockFrequencyInfo *BFI);

} // end namespace llvm
Loading