| //===- LazyBlockFrequencyInfo.cpp - Lazy Block Frequency 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 BlockFrequencyInfoWrapperPass. The | |
| // difference is that with this pass the block frequencies are not computed when | |
| // the analysis pass is executed but rather when the BFI result is explicitly | |
| // requested by the analysis client. | |
| // | |
| //===----------------------------------------------------------------------===// | |
| #include "llvm/Analysis/LazyBlockFrequencyInfo.h" | |
| #include "llvm/Analysis/LazyBranchProbabilityInfo.h" | |
| #include "llvm/Analysis/LoopInfo.h" | |
| #include "llvm/IR/Dominators.h" | |
| #include "llvm/InitializePasses.h" | |
| using namespace llvm; | |
| #define DEBUG_TYPE "lazy-block-freq" | |
| INITIALIZE_PASS_BEGIN(LazyBlockFrequencyInfoPass, DEBUG_TYPE, | |
| "Lazy Block Frequency Analysis", true, true) | |
| INITIALIZE_PASS_DEPENDENCY(LazyBPIPass) | |
| INITIALIZE_PASS_DEPENDENCY(LoopInfoWrapperPass) | |
| INITIALIZE_PASS_END(LazyBlockFrequencyInfoPass, DEBUG_TYPE, | |
| "Lazy Block Frequency Analysis", true, true) | |
| char LazyBlockFrequencyInfoPass::ID = 0; | |
| LazyBlockFrequencyInfoPass::LazyBlockFrequencyInfoPass() : FunctionPass(ID) { | |
| initializeLazyBlockFrequencyInfoPassPass(*PassRegistry::getPassRegistry()); | |
| } | |
| void LazyBlockFrequencyInfoPass::print(raw_ostream &OS, const Module *) const { | |
| LBFI.getCalculated().print(OS); | |
| } | |
| void LazyBlockFrequencyInfoPass::getAnalysisUsage(AnalysisUsage &AU) const { | |
| LazyBranchProbabilityInfoPass::getLazyBPIAnalysisUsage(AU); | |
| // 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.setPreservesAll(); | |
| } | |
| void LazyBlockFrequencyInfoPass::releaseMemory() { LBFI.releaseMemory(); } | |
| bool LazyBlockFrequencyInfoPass::runOnFunction(Function &F) { | |
| auto &BPIPass = getAnalysis<LazyBranchProbabilityInfoPass>(); | |
| LoopInfo &LI = getAnalysis<LoopInfoWrapperPass>().getLoopInfo(); | |
| LBFI.setAnalysis(&F, &BPIPass, &LI); | |
| return false; | |
| } | |
| void LazyBlockFrequencyInfoPass::getLazyBFIAnalysisUsage(AnalysisUsage &AU) { | |
| LazyBranchProbabilityInfoPass::getLazyBPIAnalysisUsage(AU); | |
| AU.addRequiredTransitive<LazyBlockFrequencyInfoPass>(); | |
| AU.addRequiredTransitive<LoopInfoWrapperPass>(); | |
| } | |
| void llvm::initializeLazyBFIPassPass(PassRegistry &Registry) { | |
| initializeLazyBPIPassPass(Registry); | |
| INITIALIZE_PASS_DEPENDENCY(LazyBlockFrequencyInfoPass); | |
| INITIALIZE_PASS_DEPENDENCY(LoopInfoWrapperPass); | |
| } |