1263508Sdim//===------- BlockFrequencyInfo.h - Block Frequency Analysis --*- C++ -*---===//
2226584Sdim//
3226584Sdim//                     The LLVM Compiler Infrastructure
4226584Sdim//
5226584Sdim// This file is distributed under the University of Illinois Open Source
6226584Sdim// License. See LICENSE.TXT for details.
7226584Sdim//
8226584Sdim//===----------------------------------------------------------------------===//
9226584Sdim//
10226584Sdim// Loops should be simplified before this analysis.
11226584Sdim//
12226584Sdim//===----------------------------------------------------------------------===//
13226584Sdim
14226584Sdim#ifndef LLVM_ANALYSIS_BLOCKFREQUENCYINFO_H
15226584Sdim#define LLVM_ANALYSIS_BLOCKFREQUENCYINFO_H
16226584Sdim
17226584Sdim#include "llvm/Pass.h"
18226584Sdim#include "llvm/Support/BlockFrequency.h"
19226584Sdim#include <climits>
20226584Sdim
21226584Sdimnamespace llvm {
22226584Sdim
23226584Sdimclass BranchProbabilityInfo;
24226584Sdimtemplate<class BlockT, class FunctionT, class BranchProbInfoT>
25226584Sdimclass BlockFrequencyImpl;
26226584Sdim
27226584Sdim/// BlockFrequencyInfo pass uses BlockFrequencyImpl implementation to estimate
28226584Sdim/// IR basic block frequencies.
29226584Sdimclass BlockFrequencyInfo : public FunctionPass {
30226584Sdim
31226584Sdim  BlockFrequencyImpl<BasicBlock, Function, BranchProbabilityInfo> *BFI;
32226584Sdim
33226584Sdimpublic:
34226584Sdim  static char ID;
35226584Sdim
36226584Sdim  BlockFrequencyInfo();
37226584Sdim
38226584Sdim  ~BlockFrequencyInfo();
39226584Sdim
40226584Sdim  void getAnalysisUsage(AnalysisUsage &AU) const;
41226584Sdim
42226584Sdim  bool runOnFunction(Function &F);
43226584Sdim  void print(raw_ostream &O, const Module *M) const;
44263508Sdim  const Function *getFunction() const;
45263508Sdim  void view() const;
46226584Sdim
47226584Sdim  /// getblockFreq - Return block frequency. Return 0 if we don't have the
48263508Sdim  /// information. Please note that initial frequency is equal to ENTRY_FREQ. It
49263508Sdim  /// means that we should not rely on the value itself, but only on the
50263508Sdim  /// comparison to the other block frequencies. We do this to avoid using of
51263508Sdim  /// floating points.
52234353Sdim  BlockFrequency getBlockFreq(const BasicBlock *BB) const;
53226584Sdim};
54226584Sdim
55226584Sdim}
56226584Sdim
57226584Sdim#endif
58