| //===- LazyBranchProbabilityInfo.cpp - Lazy Branch Probability Analysis ---===// |
| // |
| // 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 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" |
| #include "llvm/Analysis/TargetLibraryInfo.h" |
| #include "llvm/IR/Dominators.h" |
| #include "llvm/InitializePasses.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_DEPENDENCY(TargetLibraryInfoWrapperPass) |
| 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 { |
| // We require DT so it's available when LI is available. The LI updating code |
| // asserts that DT is also present so if we don't make sure that we have DT |
| // here, that assert will trigger. |
| AU.addRequiredTransitive<DominatorTreeWrapperPass>(); |
| AU.addRequiredTransitive<LoopInfoWrapperPass>(); |
| AU.addRequiredTransitive<TargetLibraryInfoWrapperPass>(); |
| AU.setPreservesAll(); |
| } |
| |
| void LazyBranchProbabilityInfoPass::releaseMemory() { LBPI.reset(); } |
| |
| bool LazyBranchProbabilityInfoPass::runOnFunction(Function &F) { |
| LoopInfo &LI = getAnalysis<LoopInfoWrapperPass>().getLoopInfo(); |
| TargetLibraryInfo &TLI = |
| getAnalysis<TargetLibraryInfoWrapperPass>().getTLI(F); |
| LBPI = std::make_unique<LazyBranchProbabilityInfo>(&F, &LI, &TLI); |
| return false; |
| } |
| |
| void LazyBranchProbabilityInfoPass::getLazyBPIAnalysisUsage(AnalysisUsage &AU) { |
| AU.addRequiredTransitive<LazyBranchProbabilityInfoPass>(); |
| AU.addRequiredTransitive<LoopInfoWrapperPass>(); |
| AU.addRequiredTransitive<TargetLibraryInfoWrapperPass>(); |
| } |
| |
| void llvm::initializeLazyBPIPassPass(PassRegistry &Registry) { |
| INITIALIZE_PASS_DEPENDENCY(LazyBranchProbabilityInfoPass); |
| INITIALIZE_PASS_DEPENDENCY(LoopInfoWrapperPass); |
| INITIALIZE_PASS_DEPENDENCY(TargetLibraryInfoWrapperPass); |
| } |