From 7e1637451d20d40553165f806094ada30cb0a708 Mon Sep 17 00:00:00 2001 From: Hiroshi Yamauchi Date: Fri, 18 Oct 2019 16:46:01 +0000 Subject: [PGO][PGSO] SizeOpts changes. Summary: (Split of off D67120) SizeOpts/MachineSizeOpts changes for profile guided size optimization. Reviewers: davidxl Subscribers: mgorny, hiraditya, llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D69070 llvm-svn: 375254 --- llvm/lib/CodeGen/CMakeLists.txt | 1 + llvm/lib/CodeGen/MachineBlockFrequencyInfo.cpp | 7 ++ llvm/lib/CodeGen/MachineDominators.cpp | 6 +- llvm/lib/CodeGen/MachineLoopInfo.cpp | 8 +- llvm/lib/CodeGen/MachineSizeOpts.cpp | 120 +++++++++++++++++++++++++ 5 files changed, 139 insertions(+), 3 deletions(-) create mode 100644 llvm/lib/CodeGen/MachineSizeOpts.cpp (limited to 'llvm/lib/CodeGen') diff --git a/llvm/lib/CodeGen/CMakeLists.txt b/llvm/lib/CodeGen/CMakeLists.txt index 50b469d6d93..f5c18f89fa0 100644 --- a/llvm/lib/CodeGen/CMakeLists.txt +++ b/llvm/lib/CodeGen/CMakeLists.txt @@ -92,6 +92,7 @@ add_llvm_library(LLVMCodeGen MachineRegisterInfo.cpp MachineScheduler.cpp MachineSink.cpp + MachineSizeOpts.cpp MachineSSAUpdater.cpp MachineTraceMetrics.cpp MachineVerifier.cpp diff --git a/llvm/lib/CodeGen/MachineBlockFrequencyInfo.cpp b/llvm/lib/CodeGen/MachineBlockFrequencyInfo.cpp index 53a35b7e89c..889fde606a4 100644 --- a/llvm/lib/CodeGen/MachineBlockFrequencyInfo.cpp +++ b/llvm/lib/CodeGen/MachineBlockFrequencyInfo.cpp @@ -172,6 +172,13 @@ MachineBlockFrequencyInfo::MachineBlockFrequencyInfo() initializeMachineBlockFrequencyInfoPass(*PassRegistry::getPassRegistry()); } +MachineBlockFrequencyInfo::MachineBlockFrequencyInfo( + MachineFunction &F, + MachineBranchProbabilityInfo &MBPI, + MachineLoopInfo &MLI) : MachineFunctionPass(ID) { + calculate(F, MBPI, MLI); +} + MachineBlockFrequencyInfo::~MachineBlockFrequencyInfo() = default; void MachineBlockFrequencyInfo::getAnalysisUsage(AnalysisUsage &AU) const { diff --git a/llvm/lib/CodeGen/MachineDominators.cpp b/llvm/lib/CodeGen/MachineDominators.cpp index 706c706d752..0d57bca37d9 100644 --- a/llvm/lib/CodeGen/MachineDominators.cpp +++ b/llvm/lib/CodeGen/MachineDominators.cpp @@ -49,11 +49,15 @@ void MachineDominatorTree::getAnalysisUsage(AnalysisUsage &AU) const { } bool MachineDominatorTree::runOnMachineFunction(MachineFunction &F) { + calculate(F); + return false; +} + +void MachineDominatorTree::calculate(MachineFunction &F) { CriticalEdgesToSplit.clear(); NewBBs.clear(); DT.reset(new DomTreeBase()); DT->recalculate(F); - return false; } MachineDominatorTree::MachineDominatorTree() diff --git a/llvm/lib/CodeGen/MachineLoopInfo.cpp b/llvm/lib/CodeGen/MachineLoopInfo.cpp index 3b8b430d1b0..85822a67149 100644 --- a/llvm/lib/CodeGen/MachineLoopInfo.cpp +++ b/llvm/lib/CodeGen/MachineLoopInfo.cpp @@ -36,11 +36,15 @@ INITIALIZE_PASS_END(MachineLoopInfo, "machine-loops", char &llvm::MachineLoopInfoID = MachineLoopInfo::ID; bool MachineLoopInfo::runOnMachineFunction(MachineFunction &) { - releaseMemory(); - LI.analyze(getAnalysis().getBase()); + calculate(getAnalysis()); return false; } +void MachineLoopInfo::calculate(MachineDominatorTree &MDT) { + releaseMemory(); + LI.analyze(MDT.getBase()); +} + void MachineLoopInfo::getAnalysisUsage(AnalysisUsage &AU) const { AU.setPreservesAll(); AU.addRequired(); diff --git a/llvm/lib/CodeGen/MachineSizeOpts.cpp b/llvm/lib/CodeGen/MachineSizeOpts.cpp new file mode 100644 index 00000000000..0c2ef3321e0 --- /dev/null +++ b/llvm/lib/CodeGen/MachineSizeOpts.cpp @@ -0,0 +1,120 @@ +//===- MachineSizeOpts.cpp - code size optimization related code ----------===// +// +// 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. +// +//===----------------------------------------------------------------------===// + +#include "llvm/CodeGen/MachineSizeOpts.h" +#include "llvm/Analysis/ProfileSummaryInfo.h" +#include "llvm/CodeGen/MachineBlockFrequencyInfo.h" + +using namespace llvm; + +extern cl::opt EnablePGSO; +extern cl::opt PGSOLargeWorkingSetSizeOnly; +extern cl::opt ForcePGSO; +extern cl::opt PgsoCutoffInstrProf; +extern cl::opt PgsoCutoffSampleProf; + +namespace machine_size_opts_detail { + +/// Like ProfileSummaryInfo::isColdBlock but for MachineBasicBlock. +bool isColdBlock(const MachineBasicBlock *MBB, + ProfileSummaryInfo *PSI, + const MachineBlockFrequencyInfo *MBFI) { + auto Count = MBFI->getBlockProfileCount(MBB); + return Count && PSI->isColdCount(*Count); +} + +/// Like ProfileSummaryInfo::isHotBlockNthPercentile but for MachineBasicBlock. +static bool isHotBlockNthPercentile(int PercentileCutoff, + const MachineBasicBlock *MBB, + ProfileSummaryInfo *PSI, + const MachineBlockFrequencyInfo *MBFI) { + auto Count = MBFI->getBlockProfileCount(MBB); + return Count && PSI->isHotCountNthPercentile(PercentileCutoff, *Count); +} + +/// Like ProfileSummaryInfo::isFunctionColdInCallGraph but for +/// MachineFunction. +bool isFunctionColdInCallGraph( + const MachineFunction *MF, + ProfileSummaryInfo *PSI, + const MachineBlockFrequencyInfo &MBFI) { + if (auto FunctionCount = MF->getFunction().getEntryCount()) + if (!PSI->isColdCount(FunctionCount.getCount())) + return false; + for (const auto &MBB : *MF) + if (!isColdBlock(&MBB, PSI, &MBFI)) + return false; + return true; +} + +/// Like ProfileSummaryInfo::isFunctionHotInCallGraphNthPercentile but for +/// MachineFunction. +bool isFunctionHotInCallGraphNthPercentile( + int PercentileCutoff, + const MachineFunction *MF, + ProfileSummaryInfo *PSI, + const MachineBlockFrequencyInfo &MBFI) { + if (auto FunctionCount = MF->getFunction().getEntryCount()) + if (PSI->isHotCountNthPercentile(PercentileCutoff, + FunctionCount.getCount())) + return true; + for (const auto &MBB : *MF) + if (isHotBlockNthPercentile(PercentileCutoff, &MBB, PSI, &MBFI)) + return true; + return false; +} +} // namespace machine_size_opts_detail + +namespace { +struct MachineBasicBlockBFIAdapter { + static bool isFunctionColdInCallGraph(const MachineFunction *MF, + ProfileSummaryInfo *PSI, + const MachineBlockFrequencyInfo &MBFI) { + return machine_size_opts_detail::isFunctionColdInCallGraph(MF, PSI, MBFI); + } + static bool isFunctionHotInCallGraphNthPercentile( + int CutOff, + const MachineFunction *MF, + ProfileSummaryInfo *PSI, + const MachineBlockFrequencyInfo &MBFI) { + return machine_size_opts_detail::isFunctionHotInCallGraphNthPercentile( + CutOff, MF, PSI, MBFI); + } + static bool isColdBlock(const MachineBasicBlock *MBB, + ProfileSummaryInfo *PSI, + const MachineBlockFrequencyInfo *MBFI) { + return machine_size_opts_detail::isColdBlock(MBB, PSI, MBFI); + } + static bool isHotBlockNthPercentile(int CutOff, + const MachineBasicBlock *MBB, + ProfileSummaryInfo *PSI, + const MachineBlockFrequencyInfo *MBFI) { + return machine_size_opts_detail::isHotBlockNthPercentile( + CutOff, MBB, PSI, MBFI); + } +}; +} // end anonymous namespace + +bool llvm::shouldOptimizeForSize(const MachineFunction *MF, + ProfileSummaryInfo *PSI, + const MachineBlockFrequencyInfo *MBFI) { + return shouldFuncOptimizeForSizeImpl( + MF, PSI, MBFI); +} + +bool llvm::shouldOptimizeForSize(const MachineBasicBlock *MBB, + ProfileSummaryInfo *PSI, + const MachineBlockFrequencyInfo *MBFI) { + return shouldOptimizeForSizeImpl( + MBB, PSI, MBFI); +} -- cgit v1.2.3