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