blob: b93e9a6aa9518bd8b7127b0fe62c02bd62013906 [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
Jakub Staszak23f34f12011-07-22 02:24:57 +000052/// getblockFreq - Return block frequency. Return 0 if we don't have the
53/// information. Please note that initial frequency is equal to 1024. It means
54/// that we should not rely on the value itself, but only on the comparison to
55/// the other block frequencies. We do this to avoid using of floating points.
Jakub Staszakfd9533b2011-06-23 21:56:59 +000056///
Jakub Staszakf55c1c82011-07-25 19:25:40 +000057uint32_t BlockFrequencyInfo::getBlockFreq(BasicBlock *BB) {
Jakub Staszakfd9533b2011-06-23 21:56:59 +000058 return BFI->getBlockFreq(BB);
59}