1 //=- MachineBranchProbabilityInfo.h - Branch Probability Analysis -*- C++ -*-=// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 // 9 // This pass is used to evaluate branch probabilties on machine basic blocks. 10 // 11 //===----------------------------------------------------------------------===// 12 13 #ifndef LLVM_CODEGEN_MACHINEBRANCHPROBABILITYINFO_H 14 #define LLVM_CODEGEN_MACHINEBRANCHPROBABILITYINFO_H 15 16 #include "llvm/CodeGen/MachineBasicBlock.h" 17 #include "llvm/Pass.h" 18 #include "llvm/Support/BranchProbability.h" 19 #include <climits> 20 #include <numeric> 21 22 namespace llvm { 23 24 class MachineBranchProbabilityInfo : public ImmutablePass { 25 virtual void anchor(); 26 27 // Default weight value. Used when we don't have information about the edge. 28 // TODO: DEFAULT_WEIGHT makes sense during static predication, when none of 29 // the successors have a weight yet. But it doesn't make sense when providing 30 // weight to an edge that may have siblings with non-zero weights. This can 31 // be handled various ways, but it's probably fine for an edge with unknown 32 // weight to just "inherit" the non-zero weight of an adjacent successor. 33 static const uint32_t DEFAULT_WEIGHT = 16; 34 35 public: 36 static char ID; 37 38 MachineBranchProbabilityInfo(); 39 getAnalysisUsage(AnalysisUsage & AU)40 void getAnalysisUsage(AnalysisUsage &AU) const override { 41 AU.setPreservesAll(); 42 } 43 44 // Return edge probability. 45 BranchProbability getEdgeProbability(const MachineBasicBlock *Src, 46 const MachineBasicBlock *Dst) const; 47 48 // Same as above, but using a const_succ_iterator from Src. This is faster 49 // when the iterator is already available. 50 BranchProbability 51 getEdgeProbability(const MachineBasicBlock *Src, 52 MachineBasicBlock::const_succ_iterator Dst) const; 53 54 // A 'Hot' edge is an edge which probability is >= 80%. 55 bool isEdgeHot(const MachineBasicBlock *Src, 56 const MachineBasicBlock *Dst) const; 57 58 // Return a hot successor for the block BB or null if there isn't one. 59 // NB: This routine's complexity is linear on the number of successors. 60 MachineBasicBlock *getHotSucc(MachineBasicBlock *MBB) const; 61 62 // Print value between 0 (0% probability) and 1 (100% probability), 63 // however the value is never equal to 0, and can be 1 only iff SRC block 64 // has only one successor. 65 raw_ostream &printEdgeProbability(raw_ostream &OS, 66 const MachineBasicBlock *Src, 67 const MachineBasicBlock *Dst) const; 68 }; 69 70 } 71 72 73 #endif 74