1//=======-------- BlockFrequencyInfo.cpp - 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// Loops should be simplified before this analysis. 11// 12//===----------------------------------------------------------------------===// 13 14#include "llvm/InitializePasses.h" 15#include "llvm/Analysis/BlockFrequencyImpl.h" 16#include "llvm/Analysis/BlockFrequencyInfo.h" 17#include "llvm/Analysis/LoopInfo.h" 18#include "llvm/Analysis/Passes.h" 19#include "llvm/Analysis/BranchProbabilityInfo.h" 20 21using namespace llvm; 22 23INITIALIZE_PASS_BEGIN(BlockFrequencyInfo, "block-freq", "Block Frequency Analysis", 24 true, true) 25INITIALIZE_PASS_DEPENDENCY(BranchProbabilityInfo) 26INITIALIZE_PASS_END(BlockFrequencyInfo, "block-freq", "Block Frequency Analysis", 27 true, true) 28 29char BlockFrequencyInfo::ID = 0; 30 31 32BlockFrequencyInfo::BlockFrequencyInfo() : FunctionPass(ID) { 33 initializeBlockFrequencyInfoPass(*PassRegistry::getPassRegistry()); 34 BFI = new BlockFrequencyImpl<BasicBlock, Function, BranchProbabilityInfo>(); 35} 36 37BlockFrequencyInfo::~BlockFrequencyInfo() { 38 delete BFI; 39} 40 41void BlockFrequencyInfo::getAnalysisUsage(AnalysisUsage &AU) const { 42 AU.addRequired<BranchProbabilityInfo>(); 43 AU.setPreservesAll(); 44} 45 46bool BlockFrequencyInfo::runOnFunction(Function &F) { 47 BranchProbabilityInfo &BPI = getAnalysis<BranchProbabilityInfo>(); 48 BFI->doFunction(&F, &BPI); 49 return false; 50} 51 52void BlockFrequencyInfo::print(raw_ostream &O, const Module *) const { 53 if (BFI) BFI->print(O); 54} 55 56/// getblockFreq - Return block frequency. Return 0 if we don't have the 57/// information. Please note that initial frequency is equal to 1024. It means 58/// that we should not rely on the value itself, but only on the comparison to 59/// the other block frequencies. We do this to avoid using of floating points. 60/// 61BlockFrequency BlockFrequencyInfo::getBlockFreq(BasicBlock *BB) const { 62 return BFI->getBlockFreq(BB); 63} 64