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