1//===- LazyBlockFrequencyInfo.cpp - Lazy Block Frequency Analysis ---------===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9// 10// This is an alternative analysis pass to BlockFrequencyInfoWrapperPass. The 11// difference is that with this pass the block frequencies are not computed when 12// the analysis pass is executed but rather when the BFI results is explicitly 13// requested by the analysis client. 14// 15//===----------------------------------------------------------------------===// 16 17#include "llvm/Analysis/LazyBlockFrequencyInfo.h" 18#include "llvm/Analysis/BranchProbabilityInfo.h" 19#include "llvm/Analysis/LoopInfo.h" 20 21using namespace llvm; 22 23#define DEBUG_TYPE "lazy-block-freq" 24 25INITIALIZE_PASS_BEGIN(LazyBlockFrequencyInfoPass, DEBUG_TYPE, 26 "Lazy Block Frequency Analysis", true, true) 27INITIALIZE_PASS_DEPENDENCY(BranchProbabilityInfoWrapperPass) 28INITIALIZE_PASS_DEPENDENCY(LoopInfoWrapperPass) 29INITIALIZE_PASS_END(LazyBlockFrequencyInfoPass, DEBUG_TYPE, 30 "Lazy Block Frequency Analysis", true, true) 31 32char LazyBlockFrequencyInfoPass::ID = 0; 33 34LazyBlockFrequencyInfoPass::LazyBlockFrequencyInfoPass() : FunctionPass(ID) { 35 initializeLazyBlockFrequencyInfoPassPass(*PassRegistry::getPassRegistry()); 36} 37 38void LazyBlockFrequencyInfoPass::print(raw_ostream &OS, const Module *) const { 39 LBFI.getCalculated().print(OS); 40} 41 42void LazyBlockFrequencyInfoPass::getAnalysisUsage(AnalysisUsage &AU) const { 43 AU.addRequired<BranchProbabilityInfoWrapperPass>(); 44 AU.addRequired<LoopInfoWrapperPass>(); 45 AU.setPreservesAll(); 46} 47 48void LazyBlockFrequencyInfoPass::releaseMemory() { LBFI.releaseMemory(); } 49 50bool LazyBlockFrequencyInfoPass::runOnFunction(Function &F) { 51 BranchProbabilityInfo &BPI = 52 getAnalysis<BranchProbabilityInfoWrapperPass>().getBPI(); 53 LoopInfo &LI = getAnalysis<LoopInfoWrapperPass>().getLoopInfo(); 54 LBFI.setAnalysis(&F, &BPI, &LI); 55 return false; 56} 57 58void LazyBlockFrequencyInfoPass::getLazyBFIAnalysisUsage(AnalysisUsage &AU) { 59 AU.addRequired<BranchProbabilityInfoWrapperPass>(); 60 AU.addRequired<LazyBlockFrequencyInfoPass>(); 61 AU.addRequired<LoopInfoWrapperPass>(); 62} 63 64void llvm::initializeLazyBFIPassPass(PassRegistry &Registry) { 65 INITIALIZE_PASS_DEPENDENCY(BranchProbabilityInfoWrapperPass); 66 INITIALIZE_PASS_DEPENDENCY(LazyBlockFrequencyInfoPass); 67 INITIALIZE_PASS_DEPENDENCY(LoopInfoWrapperPass); 68} 69