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