BranchProbabilityInfo.h revision 66dddd1da3e036d05f94df82221a97b7d26e3498
1//===--- BranchProbabilityInfo.h - Branch Probability Analysis --*- C++ -*-===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9// 10// This pass is used to evaluate branch probabilties. 11// 12//===----------------------------------------------------------------------===// 13 14#ifndef LLVM_ANALYSIS_BRANCHPROBABILITYINFO_H 15#define LLVM_ANALYSIS_BRANCHPROBABILITYINFO_H 16 17#include "llvm/InitializePasses.h" 18#include "llvm/Support/BranchProbability.h" 19#include "llvm/Analysis/LoopInfo.h" 20 21namespace llvm { 22 23class raw_ostream; 24 25class BranchProbabilityInfo : public FunctionPass { 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 typedef std::pair<BasicBlock *, BasicBlock *> Edge; 36 37 DenseMap<Edge, uint32_t> Weights; 38 39 // Get sum of the block successors' weights. 40 uint32_t getSumForBlock(BasicBlock *BB) const; 41 42public: 43 static char ID; 44 45 BranchProbabilityInfo() : FunctionPass(ID) { 46 initializeBranchProbabilityInfoPass(*PassRegistry::getPassRegistry()); 47 } 48 49 void getAnalysisUsage(AnalysisUsage &AU) const { 50 AU.addRequired<LoopInfo>(); 51 AU.setPreservesAll(); 52 } 53 54 bool runOnFunction(Function &F); 55 56 // Returned value is between 1 and UINT32_MAX. Look at 57 // BranchProbabilityInfo.cpp for details. 58 uint32_t getEdgeWeight(BasicBlock *Src, BasicBlock *Dst) const; 59 60 // Look at BranchProbabilityInfo.cpp for details. Use it with caution! 61 void setEdgeWeight(BasicBlock *Src, BasicBlock *Dst, uint32_t Weight); 62 63 // A 'Hot' edge is an edge which probability is >= 80%. 64 bool isEdgeHot(BasicBlock *Src, BasicBlock *Dst) const; 65 66 // Return a hot successor for the block BB or null if there isn't one. 67 BasicBlock *getHotSucc(BasicBlock *BB) const; 68 69 // Return a probability as a fraction between 0 (0% probability) and 70 // 1 (100% probability), however the value is never equal to 0, and can be 1 71 // only iff SRC block has only one successor. 72 BranchProbability getEdgeProbability(BasicBlock *Src, BasicBlock *Dst) const; 73 74 // Print value between 0 (0% probability) and 1 (100% probability), 75 // however the value is never equal to 0, and can be 1 only iff SRC block 76 // has only one successor. 77 raw_ostream &printEdgeProbability(raw_ostream &OS, BasicBlock *Src, 78 BasicBlock *Dst) const; 79}; 80 81} 82 83#endif 84