119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//====----- MachineBlockFrequencyInfo.h - MachineBlock Frequency Analysis ----====//
219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//
319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//                     The LLVM Compiler Infrastructure
419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//
519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// This file is distributed under the University of Illinois Open Source
619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// License. See LICENSE.TXT for details.
719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//
819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//===----------------------------------------------------------------------===//
919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//
1019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// Loops should be simplified before this analysis.
1119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//
1219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//===----------------------------------------------------------------------===//
1319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
1419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#ifndef LLVM_CODEGEN_MACHINEBLOCKFREQUENCYINFO_H
1519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#define LLVM_CODEGEN_MACHINEBLOCKFREQUENCYINFO_H
1619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
1719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/CodeGen/MachineFunctionPass.h"
1819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/Support/BlockFrequency.h"
1919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include <climits>
2019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
2119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumannamespace llvm {
2219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
2319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanclass MachineBranchProbabilityInfo;
2419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumantemplate<class BlockT, class FunctionT, class BranchProbInfoT>
2519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanclass BlockFrequencyImpl;
2619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
2719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman/// MachineBlockFrequencyInfo pass uses BlockFrequencyImpl implementation to estimate
2819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman/// machine basic block frequencies.
2919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanclass MachineBlockFrequencyInfo : public MachineFunctionPass {
3019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
3119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  BlockFrequencyImpl<MachineBasicBlock, MachineFunction, MachineBranchProbabilityInfo> *MBFI;
3219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
3319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanpublic:
3419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  static char ID;
3519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
3619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  MachineBlockFrequencyInfo();
3719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
3819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  ~MachineBlockFrequencyInfo();
3919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
4019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  void getAnalysisUsage(AnalysisUsage &AU) const;
4119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
4219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  bool runOnMachineFunction(MachineFunction &F);
4319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
4419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  /// getblockFreq - Return block frequency. Return 0 if we don't have the
4519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  /// information. Please note that initial frequency is equal to 1024. It means
4619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  /// that we should not rely on the value itself, but only on the comparison to
4719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  /// the other block frequencies. We do this to avoid using of floating points.
4819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  ///
4919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  BlockFrequency getBlockFreq(MachineBasicBlock *MBB) const;
5019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman};
5119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
5219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
5319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
5419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#endif
55