1dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines//===- BlockFrequencyInfo.h - Block Frequency Analysis ----------*- C++ -*-===//
2fd9533b4a35983d38804349efca8116788b311d9Jakub Staszak//
3fd9533b4a35983d38804349efca8116788b311d9Jakub Staszak//                     The LLVM Compiler Infrastructure
4fd9533b4a35983d38804349efca8116788b311d9Jakub Staszak//
5fd9533b4a35983d38804349efca8116788b311d9Jakub Staszak// This file is distributed under the University of Illinois Open Source
6fd9533b4a35983d38804349efca8116788b311d9Jakub Staszak// License. See LICENSE.TXT for details.
7fd9533b4a35983d38804349efca8116788b311d9Jakub Staszak//
8fd9533b4a35983d38804349efca8116788b311d9Jakub Staszak//===----------------------------------------------------------------------===//
9fd9533b4a35983d38804349efca8116788b311d9Jakub Staszak//
10fd9533b4a35983d38804349efca8116788b311d9Jakub Staszak// Loops should be simplified before this analysis.
11fd9533b4a35983d38804349efca8116788b311d9Jakub Staszak//
12fd9533b4a35983d38804349efca8116788b311d9Jakub Staszak//===----------------------------------------------------------------------===//
13fd9533b4a35983d38804349efca8116788b311d9Jakub Staszak
14f55c1c85881afd65647bde5346f64d9685235c7cJakub Staszak#ifndef LLVM_ANALYSIS_BLOCKFREQUENCYINFO_H
15f55c1c85881afd65647bde5346f64d9685235c7cJakub Staszak#define LLVM_ANALYSIS_BLOCKFREQUENCYINFO_H
16fd9533b4a35983d38804349efca8116788b311d9Jakub Staszak
17fd9533b4a35983d38804349efca8116788b311d9Jakub Staszak#include "llvm/Pass.h"
189a24f1f070f7a9e18f7fc46214c2f2d0a38ab0f9Jakub Staszak#include "llvm/Support/BlockFrequency.h"
19fd9533b4a35983d38804349efca8116788b311d9Jakub Staszak#include <climits>
20fd9533b4a35983d38804349efca8116788b311d9Jakub Staszak
21fd9533b4a35983d38804349efca8116788b311d9Jakub Staszaknamespace llvm {
22fd9533b4a35983d38804349efca8116788b311d9Jakub Staszak
23fd9533b4a35983d38804349efca8116788b311d9Jakub Staszakclass BranchProbabilityInfo;
24dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinestemplate <class BlockT> class BlockFrequencyInfoImpl;
25fd9533b4a35983d38804349efca8116788b311d9Jakub Staszak
26dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines/// BlockFrequencyInfo pass uses BlockFrequencyInfoImpl implementation to
27dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines/// estimate IR basic block frequencies.
28f55c1c85881afd65647bde5346f64d9685235c7cJakub Staszakclass BlockFrequencyInfo : public FunctionPass {
29dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  typedef BlockFrequencyInfoImpl<BasicBlock> ImplType;
3036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  std::unique_ptr<ImplType> BFI;
31fd9533b4a35983d38804349efca8116788b311d9Jakub Staszak
32fd9533b4a35983d38804349efca8116788b311d9Jakub Staszakpublic:
33fd9533b4a35983d38804349efca8116788b311d9Jakub Staszak  static char ID;
34fd9533b4a35983d38804349efca8116788b311d9Jakub Staszak
35f55c1c85881afd65647bde5346f64d9685235c7cJakub Staszak  BlockFrequencyInfo();
36fd9533b4a35983d38804349efca8116788b311d9Jakub Staszak
37f55c1c85881afd65647bde5346f64d9685235c7cJakub Staszak  ~BlockFrequencyInfo();
38fd9533b4a35983d38804349efca8116788b311d9Jakub Staszak
3936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  void getAnalysisUsage(AnalysisUsage &AU) const override;
40fd9533b4a35983d38804349efca8116788b311d9Jakub Staszak
4136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  bool runOnFunction(Function &F) override;
4236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  void releaseMemory() override;
4336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  void print(raw_ostream &O, const Module *M) const override;
44e2058ff5bd4fa0397b57f6bdd84e5a5aa2343433Michael Gottesman  const Function *getFunction() const;
45e2058ff5bd4fa0397b57f6bdd84e5a5aa2343433Michael Gottesman  void view() const;
46fd9533b4a35983d38804349efca8116788b311d9Jakub Staszak
4723f34f1c22db8df6e767a29365d668ac9ede112cJakub Staszak  /// getblockFreq - Return block frequency. Return 0 if we don't have the
4875b51621540c23ddfc1e9ef6b4dc803453d9d122Benjamin Kramer  /// information. Please note that initial frequency is equal to ENTRY_FREQ. It
4975b51621540c23ddfc1e9ef6b4dc803453d9d122Benjamin Kramer  /// means that we should not rely on the value itself, but only on the
5075b51621540c23ddfc1e9ef6b4dc803453d9d122Benjamin Kramer  /// comparison to the other block frequencies. We do this to avoid using of
5175b51621540c23ddfc1e9ef6b4dc803453d9d122Benjamin Kramer  /// floating points.
5225101bb2a799a36be9f077ee2fc2dcf0df2b6efbJakub Staszak  BlockFrequency getBlockFreq(const BasicBlock *BB) const;
5336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
5436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  // Print the block frequency Freq to OS using the current functions entry
5536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  // frequency to convert freq into a relative decimal form.
5636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  raw_ostream &printBlockFreq(raw_ostream &OS, const BlockFrequency Freq) const;
5736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
5836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  // Convenience method that attempts to look up the frequency associated with
5936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  // BB and print it to OS.
6036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  raw_ostream &printBlockFreq(raw_ostream &OS, const BasicBlock *BB) const;
6136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
6236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  uint64_t getEntryFreq() const;
6336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
64fd9533b4a35983d38804349efca8116788b311d9Jakub Staszak};
65fd9533b4a35983d38804349efca8116788b311d9Jakub Staszak
66fd9533b4a35983d38804349efca8116788b311d9Jakub Staszak}
67fd9533b4a35983d38804349efca8116788b311d9Jakub Staszak
68fd9533b4a35983d38804349efca8116788b311d9Jakub Staszak#endif
69