blob: 100e5c8ae7dd68d90a75e300b01611ca386b9563 [file] [log] [blame]
Jakub Staszak875ebd52011-07-25 19:25:40 +00001//=======-------- BlockFrequencyInfo.cpp - Block Frequency Analysis -------=======//
Jakub Staszak668c6fa2011-06-23 21:56:59 +00002//
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
Jakub Staszak875ebd52011-07-25 19:25:40 +000014#include "llvm/Analysis/BlockFrequencyInfo.h"
Chandler Carruthed0881b2012-12-03 16:50:05 +000015#include "llvm/Analysis/BlockFrequencyImpl.h"
16#include "llvm/Analysis/BranchProbabilityInfo.h"
Jakub Staszak668c6fa2011-06-23 21:56:59 +000017#include "llvm/Analysis/LoopInfo.h"
18#include "llvm/Analysis/Passes.h"
Chandler Carruthed0881b2012-12-03 16:50:05 +000019#include "llvm/InitializePasses.h"
Jakub Staszak668c6fa2011-06-23 21:56:59 +000020
21using namespace llvm;
22
Jakub Staszak875ebd52011-07-25 19:25:40 +000023INITIALIZE_PASS_BEGIN(BlockFrequencyInfo, "block-freq", "Block Frequency Analysis",
Jakub Staszak668c6fa2011-06-23 21:56:59 +000024 true, true)
25INITIALIZE_PASS_DEPENDENCY(BranchProbabilityInfo)
Jakub Staszak875ebd52011-07-25 19:25:40 +000026INITIALIZE_PASS_END(BlockFrequencyInfo, "block-freq", "Block Frequency Analysis",
Jakub Staszak668c6fa2011-06-23 21:56:59 +000027 true, true)
28
Jakub Staszak875ebd52011-07-25 19:25:40 +000029char BlockFrequencyInfo::ID = 0;
Jakub Staszak668c6fa2011-06-23 21:56:59 +000030
31
Jakub Staszak875ebd52011-07-25 19:25:40 +000032BlockFrequencyInfo::BlockFrequencyInfo() : FunctionPass(ID) {
33 initializeBlockFrequencyInfoPass(*PassRegistry::getPassRegistry());
Jakub Staszak668c6fa2011-06-23 21:56:59 +000034 BFI = new BlockFrequencyImpl<BasicBlock, Function, BranchProbabilityInfo>();
35}
36
Jakub Staszak875ebd52011-07-25 19:25:40 +000037BlockFrequencyInfo::~BlockFrequencyInfo() {
Jakub Staszak668c6fa2011-06-23 21:56:59 +000038 delete BFI;
39}
40
Jakub Staszak875ebd52011-07-25 19:25:40 +000041void BlockFrequencyInfo::getAnalysisUsage(AnalysisUsage &AU) const {
Jakub Staszak668c6fa2011-06-23 21:56:59 +000042 AU.addRequired<BranchProbabilityInfo>();
43 AU.setPreservesAll();
44}
45
Jakub Staszak875ebd52011-07-25 19:25:40 +000046bool BlockFrequencyInfo::runOnFunction(Function &F) {
Jakub Staszak668c6fa2011-06-23 21:56:59 +000047 BranchProbabilityInfo &BPI = getAnalysis<BranchProbabilityInfo>();
48 BFI->doFunction(&F, &BPI);
49 return false;
50}
51
Chandler Carruth343fad42011-10-19 10:12:41 +000052void BlockFrequencyInfo::print(raw_ostream &O, const Module *) const {
53 if (BFI) BFI->print(O);
54}
55
Jakub Staszakb82bbf42011-07-22 02:24:57 +000056/// 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.
Jakub Staszak668c6fa2011-06-23 21:56:59 +000060///
Jakub Staszak96f8c552011-12-20 20:03:10 +000061BlockFrequency BlockFrequencyInfo::getBlockFreq(const BasicBlock *BB) const {
Jakub Staszak668c6fa2011-06-23 21:56:59 +000062 return BFI->getBlockFreq(BB);
63}