MachineBranchProbabilityInfo.h revision 883f2fab47ca2f7f6efebb10a5e859f5804bed07
1
2//==- MachineBranchProbabilityInfo.h - Machine Branch Probability Analysis -==//
3//
4//                     The LLVM Compiler Infrastructure
5//
6// This file is distributed under the University of Illinois Open Source
7// License. See LICENSE.TXT for details.
8//
9//===----------------------------------------------------------------------===//
10//
11// This pass is used to evaluate branch probabilties on machine basic blocks.
12//
13//===----------------------------------------------------------------------===//
14
15#ifndef LLVM_CODEGEN_MACHINEBRANCHPROBABILITYINFO_H
16#define LLVM_CODEGEN_MACHINEBRANCHPROBABILITYINFO_H
17
18#include "llvm/Pass.h"
19#include "llvm/Support/BranchProbability.h"
20#include <climits>
21
22namespace llvm {
23
24class raw_ostream;
25class MachineBasicBlock;
26
27class MachineBranchProbabilityInfo : public ImmutablePass {
28
29  // Default weight value. Used when we don't have information about the edge.
30  // TODO: DEFAULT_WEIGHT makes sense during static predication, when none of
31  // the successors have a weight yet. But it doesn't make sense when providing
32  // weight to an edge that may have siblings with non-zero weights. This can
33  // be handled various ways, but it's probably fine for an edge with unknown
34  // weight to just "inherit" the non-zero weight of an adjacent successor.
35  static const uint32_t DEFAULT_WEIGHT = 16;
36
37  // Get sum of the block successors' weights.
38  uint32_t getSumForBlock(MachineBasicBlock *MBB) const;
39
40public:
41  static char ID;
42
43  MachineBranchProbabilityInfo() : ImmutablePass(ID) {
44    PassRegistry &Registry = *PassRegistry::getPassRegistry();
45    initializeMachineBranchProbabilityInfoPass(Registry);
46  }
47
48  void getAnalysisUsage(AnalysisUsage &AU) const {
49    AU.setPreservesAll();
50  }
51
52  // Return edge weight. If we don't have any informations about it - return
53  // DEFAULT_WEIGHT.
54  uint32_t getEdgeWeight(MachineBasicBlock *Src, MachineBasicBlock *Dst) const;
55
56  // A 'Hot' edge is an edge which probability is >= 80%.
57  bool isEdgeHot(MachineBasicBlock *Src, MachineBasicBlock *Dst) const;
58
59  // Return a hot successor for the block BB or null if there isn't one.
60  MachineBasicBlock *getHotSucc(MachineBasicBlock *MBB) const;
61
62  // Return a probability as a fraction between 0 (0% probability) and
63  // 1 (100% probability), however the value is never equal to 0, and can be 1
64  // only iff SRC block has only one successor.
65  // NB: This routine's complexity is linear on the number of successors of
66  // Src. Querying sequentially for each successor's probability is a quadratic
67  // query pattern.
68  BranchProbability getEdgeProbability(MachineBasicBlock *Src,
69                                       MachineBasicBlock *Dst) const;
70
71  // Print value between 0 (0% probability) and 1 (100% probability),
72  // however the value is never equal to 0, and can be 1 only iff SRC block
73  // has only one successor.
74  raw_ostream &printEdgeProbability(raw_ostream &OS, MachineBasicBlock *Src,
75                                    MachineBasicBlock *Dst) const;
76};
77
78}
79
80
81#endif
82