diff options
| author | Adam Nemet <anemet@apple.com> | 2016-07-28 23:31:12 +0000 |
|---|---|---|
| committer | Adam Nemet <anemet@apple.com> | 2016-07-28 23:31:12 +0000 |
| commit | aa3506c5f0b68624895e9643824a52dafaf8ab80 (patch) | |
| tree | 70c55ad571db6752b8fb77a6c85bc4b169f20e40 /llvm/lib/Analysis | |
| parent | ae00885108531b573485aea5d6521ebe78535a63 (diff) | |
| download | bcm5719-llvm-aa3506c5f0b68624895e9643824a52dafaf8ab80.tar.gz bcm5719-llvm-aa3506c5f0b68624895e9643824a52dafaf8ab80.zip | |
[BPI] Add new LazyBPI analysis
Summary:
The motivation is the same as in D22141: In order to add the hotness
attribute to optimization remarks we need BFI to be available in all
passes that emit optimization remarks. BFI depends on BPI so unless we
make this lazy as well we would still compute BPI unconditionally.
The solution is to use the new LazyBPI pass in LazyBFI and only compute
BPI when computation of BFI is requested by the client.
I extended the laziness test using a LoopDistribute test to also cover
BPI.
Reviewers: hfinkel, davidxl
Subscribers: llvm-commits
Differential Revision: https://reviews.llvm.org/D22835
llvm-svn: 277083
Diffstat (limited to 'llvm/lib/Analysis')
| -rw-r--r-- | llvm/lib/Analysis/Analysis.cpp | 1 | ||||
| -rw-r--r-- | llvm/lib/Analysis/CMakeLists.txt | 1 | ||||
| -rw-r--r-- | llvm/lib/Analysis/LazyBlockFrequencyInfo.cpp | 15 | ||||
| -rw-r--r-- | llvm/lib/Analysis/LazyBranchProbabilityInfo.cpp | 63 |
4 files changed, 72 insertions, 8 deletions
diff --git a/llvm/lib/Analysis/Analysis.cpp b/llvm/lib/Analysis/Analysis.cpp index c04447ca58c..d31adfa90ed 100644 --- a/llvm/lib/Analysis/Analysis.cpp +++ b/llvm/lib/Analysis/Analysis.cpp @@ -54,6 +54,7 @@ void llvm::initializeAnalysis(PassRegistry &Registry) { initializeIVUsersWrapperPassPass(Registry); initializeInstCountPass(Registry); initializeIntervalPartitionPass(Registry); + initializeLazyBranchProbabilityInfoPassPass(Registry); initializeLazyBlockFrequencyInfoPassPass(Registry); initializeLazyValueInfoWrapperPassPass(Registry); initializeLintPass(Registry); diff --git a/llvm/lib/Analysis/CMakeLists.txt b/llvm/lib/Analysis/CMakeLists.txt index 57ad437ef4f..c612221d994 100644 --- a/llvm/lib/Analysis/CMakeLists.txt +++ b/llvm/lib/Analysis/CMakeLists.txt @@ -37,6 +37,7 @@ add_llvm_library(LLVMAnalysis Interval.cpp IntervalPartition.cpp IteratedDominanceFrontier.cpp + LazyBranchProbabilityInfo.cpp LazyBlockFrequencyInfo.cpp LazyCallGraph.cpp LazyValueInfo.cpp diff --git a/llvm/lib/Analysis/LazyBlockFrequencyInfo.cpp b/llvm/lib/Analysis/LazyBlockFrequencyInfo.cpp index 7debfde87d2..596b6fc1afb 100644 --- a/llvm/lib/Analysis/LazyBlockFrequencyInfo.cpp +++ b/llvm/lib/Analysis/LazyBlockFrequencyInfo.cpp @@ -15,7 +15,7 @@ //===----------------------------------------------------------------------===// #include "llvm/Analysis/LazyBlockFrequencyInfo.h" -#include "llvm/Analysis/BranchProbabilityInfo.h" +#include "llvm/Analysis/LazyBranchProbabilityInfo.h" #include "llvm/Analysis/LoopInfo.h" using namespace llvm; @@ -24,7 +24,7 @@ using namespace llvm; INITIALIZE_PASS_BEGIN(LazyBlockFrequencyInfoPass, DEBUG_TYPE, "Lazy Block Frequency Analysis", true, true) -INITIALIZE_PASS_DEPENDENCY(BranchProbabilityInfoWrapperPass) +INITIALIZE_PASS_DEPENDENCY(LazyBPIPass) INITIALIZE_PASS_DEPENDENCY(LoopInfoWrapperPass) INITIALIZE_PASS_END(LazyBlockFrequencyInfoPass, DEBUG_TYPE, "Lazy Block Frequency Analysis", true, true) @@ -40,7 +40,7 @@ void LazyBlockFrequencyInfoPass::print(raw_ostream &OS, const Module *) const { } void LazyBlockFrequencyInfoPass::getAnalysisUsage(AnalysisUsage &AU) const { - AU.addRequired<BranchProbabilityInfoWrapperPass>(); + LazyBranchProbabilityInfoPass::getLazyBPIAnalysisUsage(AU); AU.addRequired<LoopInfoWrapperPass>(); AU.setPreservesAll(); } @@ -48,21 +48,20 @@ void LazyBlockFrequencyInfoPass::getAnalysisUsage(AnalysisUsage &AU) const { void LazyBlockFrequencyInfoPass::releaseMemory() { LBFI.releaseMemory(); } bool LazyBlockFrequencyInfoPass::runOnFunction(Function &F) { - BranchProbabilityInfo &BPI = - getAnalysis<BranchProbabilityInfoWrapperPass>().getBPI(); + auto &BPIPass = getAnalysis<LazyBranchProbabilityInfoPass>(); LoopInfo &LI = getAnalysis<LoopInfoWrapperPass>().getLoopInfo(); - LBFI.setAnalysis(&F, &BPI, &LI); + LBFI.setAnalysis(&F, &BPIPass, &LI); return false; } void LazyBlockFrequencyInfoPass::getLazyBFIAnalysisUsage(AnalysisUsage &AU) { - AU.addRequired<BranchProbabilityInfoWrapperPass>(); + LazyBranchProbabilityInfoPass::getLazyBPIAnalysisUsage(AU); AU.addRequired<LazyBlockFrequencyInfoPass>(); AU.addRequired<LoopInfoWrapperPass>(); } void llvm::initializeLazyBFIPassPass(PassRegistry &Registry) { - INITIALIZE_PASS_DEPENDENCY(BranchProbabilityInfoWrapperPass); + initializeLazyBPIPassPass(Registry); INITIALIZE_PASS_DEPENDENCY(LazyBlockFrequencyInfoPass); INITIALIZE_PASS_DEPENDENCY(LoopInfoWrapperPass); } diff --git a/llvm/lib/Analysis/LazyBranchProbabilityInfo.cpp b/llvm/lib/Analysis/LazyBranchProbabilityInfo.cpp new file mode 100644 index 00000000000..b51c6beb795 --- /dev/null +++ b/llvm/lib/Analysis/LazyBranchProbabilityInfo.cpp @@ -0,0 +1,63 @@ +//===- LazyBranchProbabilityInfo.cpp - Lazy Branch Probability Analysis ---===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// This is an alternative analysis pass to BranchProbabilityInfoWrapperPass. +// The difference is that with this pass the branch probabilities are not +// computed when the analysis pass is executed but rather when the BPI results +// is explicitly requested by the analysis client. +// +//===----------------------------------------------------------------------===// + +#include "llvm/Analysis/LazyBranchProbabilityInfo.h" +#include "llvm/Analysis/LoopInfo.h" + +using namespace llvm; + +#define DEBUG_TYPE "lazy-branch-prob" + +INITIALIZE_PASS_BEGIN(LazyBranchProbabilityInfoPass, DEBUG_TYPE, + "Lazy Branch Probability Analysis", true, true) +INITIALIZE_PASS_DEPENDENCY(LoopInfoWrapperPass) +INITIALIZE_PASS_END(LazyBranchProbabilityInfoPass, DEBUG_TYPE, + "Lazy Branch Probability Analysis", true, true) + +char LazyBranchProbabilityInfoPass::ID = 0; + +LazyBranchProbabilityInfoPass::LazyBranchProbabilityInfoPass() + : FunctionPass(ID) { + initializeLazyBranchProbabilityInfoPassPass(*PassRegistry::getPassRegistry()); +} + +void LazyBranchProbabilityInfoPass::print(raw_ostream &OS, + const Module *) const { + LBPI->getCalculated().print(OS); +} + +void LazyBranchProbabilityInfoPass::getAnalysisUsage(AnalysisUsage &AU) const { + AU.addRequired<LoopInfoWrapperPass>(); + AU.setPreservesAll(); +} + +void LazyBranchProbabilityInfoPass::releaseMemory() { LBPI.reset(); } + +bool LazyBranchProbabilityInfoPass::runOnFunction(Function &F) { + LoopInfo &LI = getAnalysis<LoopInfoWrapperPass>().getLoopInfo(); + LBPI = llvm::make_unique<LazyBranchProbabilityInfo>(&F, &LI); + return false; +} + +void LazyBranchProbabilityInfoPass::getLazyBPIAnalysisUsage(AnalysisUsage &AU) { + AU.addRequired<LazyBranchProbabilityInfoPass>(); + AU.addRequired<LoopInfoWrapperPass>(); +} + +void llvm::initializeLazyBPIPassPass(PassRegistry &Registry) { + INITIALIZE_PASS_DEPENDENCY(LazyBranchProbabilityInfoPass); + INITIALIZE_PASS_DEPENDENCY(LoopInfoWrapperPass); +} |

