1 //===-- BranchProbabilityInfo.cpp - 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 // Loops should be simplified before this analysis. 11 // 12 //===----------------------------------------------------------------------===// 13 14 #include "llvm/Instructions.h" 15 #include "llvm/Analysis/BranchProbabilityInfo.h" 16 #include "llvm/Analysis/LoopInfo.h" 17 #include "llvm/Support/Debug.h" 18 19 using namespace llvm; 20 21 INITIALIZE_PASS_BEGIN(BranchProbabilityInfo, "branch-prob", 22 "Branch Probability Analysis", false, true) 23 INITIALIZE_PASS_DEPENDENCY(LoopInfo) 24 INITIALIZE_PASS_END(BranchProbabilityInfo, "branch-prob", 25 "Branch Probability Analysis", false, true) 26 27 char BranchProbabilityInfo::ID = 0; 28 29 namespace { 30 // Please note that BranchProbabilityAnalysis is not a FunctionPass. 31 // It is created by BranchProbabilityInfo (which is a FunctionPass), which 32 // provides a clear interface. Thanks to that, all heuristics and other 33 // private methods are hidden in the .cpp file. 34 class BranchProbabilityAnalysis { 35 36 typedef std::pair<BasicBlock *, BasicBlock *> Edge; 37 38 DenseMap<Edge, uint32_t> *Weights; 39 40 BranchProbabilityInfo *BP; 41 42 LoopInfo *LI; 43 44 45 // Weights are for internal use only. They are used by heuristics to help to 46 // estimate edges' probability. Example: 47 // 48 // Using "Loop Branch Heuristics" we predict weights of edges for the 49 // block BB2. 50 // ... 51 // | 52 // V 53 // BB1<-+ 54 // | | 55 // | | (Weight = 128) 56 // V | 57 // BB2--+ 58 // | 59 // | (Weight = 4) 60 // V 61 // BB3 62 // 63 // Probability of the edge BB2->BB1 = 128 / (128 + 4) = 0.9696.. 64 // Probability of the edge BB2->BB3 = 4 / (128 + 4) = 0.0303.. 65 66 static const uint32_t LBH_TAKEN_WEIGHT = 128; 67 static const uint32_t LBH_NONTAKEN_WEIGHT = 4; 68 69 // Standard weight value. Used when none of the heuristics set weight for 70 // the edge. 71 static const uint32_t NORMAL_WEIGHT = 16; 72 73 // Minimum weight of an edge. Please note, that weight is NEVER 0. 74 static const uint32_t MIN_WEIGHT = 1; 75 76 // Return TRUE if BB leads directly to a Return Instruction. 77 static bool isReturningBlock(BasicBlock *BB) { 78 SmallPtrSet<BasicBlock *, 8> Visited; 79 80 while (true) { 81 TerminatorInst *TI = BB->getTerminator(); 82 if (isa<ReturnInst>(TI)) 83 return true; 84 85 if (TI->getNumSuccessors() > 1) 86 break; 87 88 // It is unreachable block which we can consider as a return instruction. 89 if (TI->getNumSuccessors() == 0) 90 return true; 91 92 Visited.insert(BB); 93 BB = TI->getSuccessor(0); 94 95 // Stop if cycle is detected. 96 if (Visited.count(BB)) 97 return false; 98 } 99 100 return false; 101 } 102 103 // Multiply Edge Weight by two. 104 void incEdgeWeight(BasicBlock *Src, BasicBlock *Dst) { 105 uint32_t Weight = BP->getEdgeWeight(Src, Dst); 106 uint32_t MaxWeight = getMaxWeightFor(Src); 107 108 if (Weight * 2 > MaxWeight) 109 BP->setEdgeWeight(Src, Dst, MaxWeight); 110 else 111 BP->setEdgeWeight(Src, Dst, Weight * 2); 112 } 113 114 // Divide Edge Weight by two. 115 void decEdgeWeight(BasicBlock *Src, BasicBlock *Dst) { 116 uint32_t Weight = BP->getEdgeWeight(Src, Dst); 117 118 assert(Weight > 0); 119 if (Weight / 2 < MIN_WEIGHT) 120 BP->setEdgeWeight(Src, Dst, MIN_WEIGHT); 121 else 122 BP->setEdgeWeight(Src, Dst, Weight / 2); 123 } 124 125 126 uint32_t getMaxWeightFor(BasicBlock *BB) const { 127 return UINT32_MAX / BB->getTerminator()->getNumSuccessors(); 128 } 129 130 public: 131 BranchProbabilityAnalysis(DenseMap<Edge, uint32_t> *W, 132 BranchProbabilityInfo *BP, LoopInfo *LI) 133 : Weights(W), BP(BP), LI(LI) { 134 } 135 136 // Return Heuristics 137 void calcReturnHeuristics(BasicBlock *BB); 138 139 // Pointer Heuristics 140 void calcPointerHeuristics(BasicBlock *BB); 141 142 // Loop Branch Heuristics 143 void calcLoopBranchHeuristics(BasicBlock *BB); 144 145 bool runOnFunction(Function &F); 146 }; 147 } // end anonymous namespace 148 149 // Calculate Edge Weights using "Return Heuristics". Predict a successor which 150 // leads directly to Return Instruction will not be taken. 151 void BranchProbabilityAnalysis::calcReturnHeuristics(BasicBlock *BB){ 152 if (BB->getTerminator()->getNumSuccessors() == 1) 153 return; 154 155 for (succ_iterator I = succ_begin(BB), E = succ_end(BB); I != E; ++I) { 156 BasicBlock *Succ = *I; 157 if (isReturningBlock(Succ)) { 158 decEdgeWeight(BB, Succ); 159 } 160 } 161 } 162 163 // Calculate Edge Weights using "Pointer Heuristics". Predict a comparsion 164 // between two pointer or pointer and NULL will fail. 165 void BranchProbabilityAnalysis::calcPointerHeuristics(BasicBlock *BB) { 166 BranchInst * BI = dyn_cast<BranchInst>(BB->getTerminator()); 167 if (!BI || !BI->isConditional()) 168 return; 169 170 Value *Cond = BI->getCondition(); 171 ICmpInst *CI = dyn_cast<ICmpInst>(Cond); 172 if (!CI || !CI->isEquality()) 173 return; 174 175 Value *LHS = CI->getOperand(0); 176 177 if (!LHS->getType()->isPointerTy()) 178 return; 179 180 assert(CI->getOperand(1)->getType()->isPointerTy()); 181 182 BasicBlock *Taken = BI->getSuccessor(0); 183 BasicBlock *NonTaken = BI->getSuccessor(1); 184 185 // p != 0 -> isProb = true 186 // p == 0 -> isProb = false 187 // p != q -> isProb = true 188 // p == q -> isProb = false; 189 bool isProb = CI->getPredicate() == ICmpInst::ICMP_NE; 190 if (!isProb) 191 std::swap(Taken, NonTaken); 192 193 incEdgeWeight(BB, Taken); 194 decEdgeWeight(BB, NonTaken); 195 } 196 197 // Calculate Edge Weights using "Loop Branch Heuristics". Predict backedges 198 // as taken, exiting edges as not-taken. 199 void BranchProbabilityAnalysis::calcLoopBranchHeuristics(BasicBlock *BB) { 200 uint32_t numSuccs = BB->getTerminator()->getNumSuccessors(); 201 202 Loop *L = LI->getLoopFor(BB); 203 if (!L) 204 return; 205 206 SmallVector<BasicBlock *, 8> BackEdges; 207 SmallVector<BasicBlock *, 8> ExitingEdges; 208 209 for (succ_iterator I = succ_begin(BB), E = succ_end(BB); I != E; ++I) { 210 BasicBlock *Succ = *I; 211 Loop *SuccL = LI->getLoopFor(Succ); 212 if (SuccL != L) 213 ExitingEdges.push_back(Succ); 214 else if (Succ == L->getHeader()) 215 BackEdges.push_back(Succ); 216 } 217 218 if (uint32_t numBackEdges = BackEdges.size()) { 219 uint32_t backWeight = LBH_TAKEN_WEIGHT / numBackEdges; 220 if (backWeight < NORMAL_WEIGHT) 221 backWeight = NORMAL_WEIGHT; 222 223 for (SmallVector<BasicBlock *, 8>::iterator EI = BackEdges.begin(), 224 EE = BackEdges.end(); EI != EE; ++EI) { 225 BasicBlock *Back = *EI; 226 BP->setEdgeWeight(BB, Back, backWeight); 227 } 228 } 229 230 uint32_t numExitingEdges = ExitingEdges.size(); 231 if (uint32_t numNonExitingEdges = numSuccs - numExitingEdges) { 232 uint32_t exitWeight = LBH_NONTAKEN_WEIGHT / numNonExitingEdges; 233 if (exitWeight < MIN_WEIGHT) 234 exitWeight = MIN_WEIGHT; 235 236 for (SmallVector<BasicBlock *, 8>::iterator EI = ExitingEdges.begin(), 237 EE = ExitingEdges.end(); EI != EE; ++EI) { 238 BasicBlock *Exiting = *EI; 239 BP->setEdgeWeight(BB, Exiting, exitWeight); 240 } 241 } 242 } 243 244 bool BranchProbabilityAnalysis::runOnFunction(Function &F) { 245 246 for (Function::iterator I = F.begin(), E = F.end(); I != E; ) { 247 BasicBlock *BB = I++; 248 249 // Only LBH uses setEdgeWeight method. 250 calcLoopBranchHeuristics(BB); 251 252 // PH and RH use only incEdgeWeight and decEwdgeWeight methods to 253 // not efface LBH results. 254 calcPointerHeuristics(BB); 255 calcReturnHeuristics(BB); 256 } 257 258 return false; 259 } 260 261 void BranchProbabilityInfo::getAnalysisUsage(AnalysisUsage &AU) const { 262 AU.addRequired<LoopInfo>(); 263 AU.setPreservesAll(); 264 } 265 266 bool BranchProbabilityInfo::runOnFunction(Function &F) { 267 LoopInfo &LI = getAnalysis<LoopInfo>(); 268 BranchProbabilityAnalysis BPA(&Weights, this, &LI); 269 return BPA.runOnFunction(F); 270 } 271 272 uint32_t BranchProbabilityInfo::getSumForBlock(BasicBlock *BB) const { 273 uint32_t Sum = 0; 274 275 for (succ_iterator I = succ_begin(BB), E = succ_end(BB); I != E; ++I) { 276 BasicBlock *Succ = *I; 277 uint32_t Weight = getEdgeWeight(BB, Succ); 278 uint32_t PrevSum = Sum; 279 280 Sum += Weight; 281 assert(Sum > PrevSum); (void) PrevSum; 282 } 283 284 return Sum; 285 } 286 287 bool BranchProbabilityInfo::isEdgeHot(BasicBlock *Src, BasicBlock *Dst) const { 288 // Hot probability is at least 4/5 = 80% 289 uint32_t Weight = getEdgeWeight(Src, Dst); 290 uint32_t Sum = getSumForBlock(Src); 291 292 // FIXME: Implement BranchProbability::compare then change this code to 293 // compare this BranchProbability against a static "hot" BranchProbability. 294 return (uint64_t)Weight * 5 > (uint64_t)Sum * 4; 295 } 296 297 BasicBlock *BranchProbabilityInfo::getHotSucc(BasicBlock *BB) const { 298 uint32_t Sum = 0; 299 uint32_t MaxWeight = 0; 300 BasicBlock *MaxSucc = 0; 301 302 for (succ_iterator I = succ_begin(BB), E = succ_end(BB); I != E; ++I) { 303 BasicBlock *Succ = *I; 304 uint32_t Weight = getEdgeWeight(BB, Succ); 305 uint32_t PrevSum = Sum; 306 307 Sum += Weight; 308 assert(Sum > PrevSum); (void) PrevSum; 309 310 if (Weight > MaxWeight) { 311 MaxWeight = Weight; 312 MaxSucc = Succ; 313 } 314 } 315 316 // FIXME: Use BranchProbability::compare. 317 if ((uint64_t)MaxWeight * 5 > (uint64_t)Sum * 4) 318 return MaxSucc; 319 320 return 0; 321 } 322 323 // Return edge's weight. If can't find it, return DEFAULT_WEIGHT value. 324 uint32_t 325 BranchProbabilityInfo::getEdgeWeight(BasicBlock *Src, BasicBlock *Dst) const { 326 Edge E(Src, Dst); 327 DenseMap<Edge, uint32_t>::const_iterator I = Weights.find(E); 328 329 if (I != Weights.end()) 330 return I->second; 331 332 return DEFAULT_WEIGHT; 333 } 334 335 void BranchProbabilityInfo::setEdgeWeight(BasicBlock *Src, BasicBlock *Dst, 336 uint32_t Weight) { 337 Weights[std::make_pair(Src, Dst)] = Weight; 338 DEBUG(dbgs() << "set edge " << Src->getNameStr() << " -> " 339 << Dst->getNameStr() << " weight to " << Weight 340 << (isEdgeHot(Src, Dst) ? " [is HOT now]\n" : "\n")); 341 } 342 343 344 BranchProbability BranchProbabilityInfo:: 345 getEdgeProbability(BasicBlock *Src, BasicBlock *Dst) const { 346 347 uint32_t N = getEdgeWeight(Src, Dst); 348 uint32_t D = getSumForBlock(Src); 349 350 return BranchProbability(N, D); 351 } 352 353 raw_ostream & 354 BranchProbabilityInfo::printEdgeProbability(raw_ostream &OS, BasicBlock *Src, 355 BasicBlock *Dst) const { 356 357 const BranchProbability Prob = getEdgeProbability(Src, Dst); 358 OS << "edge " << Src->getNameStr() << " -> " << Dst->getNameStr() 359 << " probability is " << Prob 360 << (isEdgeHot(Src, Dst) ? " [HOT edge]\n" : "\n"); 361 362 return OS; 363 } 364