//===- 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" #include "llvm/Analysis/TargetLibraryInfo.h" #include "llvm/IR/Dominators.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.addRequired(); AU.addRequired(); AU.addRequired(); AU.setPreservesAll(); } void LazyBranchProbabilityInfoPass::releaseMemory() { LBPI.reset(); } bool LazyBranchProbabilityInfoPass::runOnFunction(Function &F) { LoopInfo &LI = getAnalysis().getLoopInfo(); TargetLibraryInfo &TLI = getAnalysis().getTLI(); LBPI = llvm::make_unique(&F, &LI, &TLI); return false; } void LazyBranchProbabilityInfoPass::getLazyBPIAnalysisUsage(AnalysisUsage &AU) { AU.addRequired(); AU.addRequired(); AU.addRequired(); } void llvm::initializeLazyBPIPassPass(PassRegistry &Registry) { INITIALIZE_PASS_DEPENDENCY(LazyBranchProbabilityInfoPass); INITIALIZE_PASS_DEPENDENCY(LoopInfoWrapperPass); INITIALIZE_PASS_DEPENDENCY(TargetLibraryInfoWrapperPass); }