blob: b92cda9614749f7d3b6421c30f65575cb0ef7fb4 [file] [log] [blame]
Jakub Staszakf55c1c82011-07-25 19:25:40 +00001//====----- MachineBlockFrequencyInfo.cpp - Machine Block Frequency Analysis ----====//
Jakub Staszak59a9dab2011-07-16 20:23:20 +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/CodeGen/MachineBlockFrequencyInfo.h"
Jakub Staszak59a9dab2011-07-16 20:23:20 +000017#include "llvm/CodeGen/Passes.h"
18#include "llvm/CodeGen/MachineBranchProbabilityInfo.h"
19
20using namespace llvm;
21
Jakub Staszakf55c1c82011-07-25 19:25:40 +000022INITIALIZE_PASS_BEGIN(MachineBlockFrequencyInfo, "machine-block-freq",
Jakub Staszak59a9dab2011-07-16 20:23:20 +000023 "Machine Block Frequency Analysis", true, true)
24INITIALIZE_PASS_DEPENDENCY(MachineBranchProbabilityInfo)
Jakub Staszakf55c1c82011-07-25 19:25:40 +000025INITIALIZE_PASS_END(MachineBlockFrequencyInfo, "machine-block-freq",
Jakub Staszak59a9dab2011-07-16 20:23:20 +000026 "Machine Block Frequency Analysis", true, true)
27
Jakub Staszakf55c1c82011-07-25 19:25:40 +000028char MachineBlockFrequencyInfo::ID = 0;
Jakub Staszak59a9dab2011-07-16 20:23:20 +000029
30
Jakub Staszakf55c1c82011-07-25 19:25:40 +000031MachineBlockFrequencyInfo::MachineBlockFrequencyInfo() : MachineFunctionPass(ID) {
32 initializeMachineBlockFrequencyInfoPass(*PassRegistry::getPassRegistry());
Jakub Staszak59a9dab2011-07-16 20:23:20 +000033 MBFI = new BlockFrequencyImpl<MachineBasicBlock, MachineFunction,
34 MachineBranchProbabilityInfo>();
35}
36
Jakub Staszakf55c1c82011-07-25 19:25:40 +000037MachineBlockFrequencyInfo::~MachineBlockFrequencyInfo() {
Jakub Staszak59a9dab2011-07-16 20:23:20 +000038 delete MBFI;
39}
40
Jakub Staszakf55c1c82011-07-25 19:25:40 +000041void MachineBlockFrequencyInfo::getAnalysisUsage(AnalysisUsage &AU) const {
Jakub Staszak59a9dab2011-07-16 20:23:20 +000042 AU.addRequired<MachineBranchProbabilityInfo>();
43 AU.setPreservesAll();
Jakub Staszak9d81c972011-07-21 22:59:09 +000044 MachineFunctionPass::getAnalysisUsage(AU);
Jakub Staszak59a9dab2011-07-16 20:23:20 +000045}
46
Jakub Staszakf55c1c82011-07-25 19:25:40 +000047bool MachineBlockFrequencyInfo::runOnMachineFunction(MachineFunction &F) {
Jakub Staszak59a9dab2011-07-16 20:23:20 +000048 MachineBranchProbabilityInfo &MBPI = getAnalysis<MachineBranchProbabilityInfo>();
49 MBFI->doFunction(&F, &MBPI);
50 return false;
51}
52
Jakub Staszak23f34f12011-07-22 02:24:57 +000053/// getblockFreq - Return block frequency. Return 0 if we don't have the
54/// information. Please note that initial frequency is equal to 1024. It means
55/// that we should not rely on the value itself, but only on the comparison to
56/// the other block frequencies. We do this to avoid using of floating points.
Jakub Staszak59a9dab2011-07-16 20:23:20 +000057///
Jakub Staszak8ea45232011-08-03 21:30:57 +000058BlockFrequency MachineBlockFrequencyInfo::
59getBlockFreq(MachineBasicBlock *MBB) const {
Jakub Staszak59a9dab2011-07-16 20:23:20 +000060 return MBFI->getBlockFreq(MBB);
61}