d7fc2c39875f5e9bd5e754514a489f1a3657c532
[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   Value *RHS = CI->getOperand(1);
175
176   if (!LHS->getType()->isPointerTy())
177     return;
178
179   assert(RHS->getType()->isPointerTy());
180
181   BasicBlock *Taken = BI->getSuccessor(0);
182   BasicBlock *NonTaken = BI->getSuccessor(1);
183
184   // p != 0   ->   isProb = true
185   // p == 0   ->   isProb = false
186   // p != q   ->   isProb = true
187   // p == q   ->   isProb = false;
188   bool isProb = !CI->isEquality();
189   if (!isProb)
190     std::swap(Taken, NonTaken);
191
192   incEdgeWeight(BB, Taken);
193   decEdgeWeight(BB, NonTaken);
194 }
195
196 // Calculate Edge Weights using "Loop Branch Heuristics". Predict backedges
197 // as taken, exiting edges as not-taken.
198 void BranchProbabilityAnalysis::calcLoopBranchHeuristics(BasicBlock *BB) {
199   unsigned numSuccs = BB->getTerminator()->getNumSuccessors();
200
201   Loop *L = LI->getLoopFor(BB);
202   if (!L)
203     return;
204
205   SmallVector<BasicBlock *, 8> BackEdges;
206   SmallVector<BasicBlock *, 8> ExitingEdges;
207
208   for (succ_iterator I = succ_begin(BB), E = succ_end(BB); I != E; ++I) {
209     BasicBlock *Succ = *I;
210     Loop *SuccL = LI->getLoopFor(Succ);
211     if (SuccL != L)
212       ExitingEdges.push_back(Succ);
213     else if (Succ == L->getHeader())
214       BackEdges.push_back(Succ);
215   }
216
217   if (unsigned numBackEdges = BackEdges.size()) {
218     unsigned backWeight = LBH_TAKEN_WEIGHT / numBackEdges;
219     if (backWeight < NORMAL_WEIGHT)
220       backWeight = NORMAL_WEIGHT;
221
222     for (SmallVector<BasicBlock *, 8>::iterator EI = BackEdges.begin(),
223          EE = BackEdges.end(); EI != EE; ++EI) {
224       BasicBlock *Back = *EI;
225       BP->setEdgeWeight(BB, Back, backWeight);
226     }
227   }
228
229   unsigned numExitingEdges = ExitingEdges.size();
230   if (unsigned numNonExitingEdges = numSuccs - numExitingEdges) {
231     unsigned exitWeight = LBH_NONTAKEN_WEIGHT / numNonExitingEdges;
232     if (exitWeight < MIN_WEIGHT)
233       exitWeight = MIN_WEIGHT;
234
235     for (SmallVector<BasicBlock *, 8>::iterator EI = ExitingEdges.begin(),
236          EE = ExitingEdges.end(); EI != EE; ++EI) {
237       BasicBlock *Exiting = *EI;
238       BP->setEdgeWeight(BB, Exiting, exitWeight);
239     }
240   }
241 }
242
243 bool BranchProbabilityAnalysis::runOnFunction(Function &F) {
244
245   for (Function::iterator I = F.begin(), E = F.end(); I != E; ) {
246     BasicBlock *BB = I++;
247
248     // Only LBH uses setEdgeWeight method.
249     calcLoopBranchHeuristics(BB);
250
251     // PH and RH use only incEdgeWeight and decEwdgeWeight methods to
252     // not efface LBH results.
253     calcPointerHeuristics(BB);
254     calcReturnHeuristics(BB);
255   }
256
257   return false;
258 }
259
260
261 bool BranchProbabilityInfo::runOnFunction(Function &F) {
262   LoopInfo &LI = getAnalysis<LoopInfo>();
263   BranchProbabilityAnalysis BPA(&Weights, this, &LI);
264   bool ret = BPA.runOnFunction(F);
265   return ret;
266 }
267
268 // TODO: This currently hardcodes 80% as a fraction 4/5. We will soon add a
269 // BranchProbability class to encapsulate the fractional probability and
270 // define a few static instances of the class for use as predefined thresholds.
271 bool BranchProbabilityInfo::isEdgeHot(BasicBlock *Src, BasicBlock *Dst) const {
272   unsigned Sum = 0;
273   for (succ_iterator I = succ_begin(Src), E = succ_end(Src); I != E; ++I) {
274     BasicBlock *Succ = *I;
275     unsigned Weight = getEdgeWeight(Src, Succ);
276     unsigned PrevSum = Sum;
277
278     Sum += Weight;
279     assert(Sum > PrevSum); (void) PrevSum;
280   }
281
282   return getEdgeWeight(Src, Dst) * 5 > Sum * 4;
283 }
284
285 BasicBlock *BranchProbabilityInfo::getHotSucc(BasicBlock *BB) const {
286   unsigned Sum = 0;
287   unsigned MaxWeight = 0;
288   BasicBlock *MaxSucc = 0;
289
290   for (succ_iterator I = succ_begin(BB), E = succ_end(BB); I != E; ++I) {
291     BasicBlock *Succ = *I;
292     unsigned Weight = getEdgeWeight(BB, Succ);
293     unsigned PrevSum = Sum;
294
295     Sum += Weight;
296     assert(Sum > PrevSum); (void) PrevSum;
297
298     if (Weight > MaxWeight) {
299       MaxWeight = Weight;
300       MaxSucc = Succ;
301     }
302   }
303
304   if (MaxWeight * 5 > Sum * 4)
305     return MaxSucc;
306
307   return 0;
308 }
309
310 // Return edge's weight. If can't find it, return DEFAULT_WEIGHT value.
311 unsigned
312 BranchProbabilityInfo::getEdgeWeight(BasicBlock *Src, BasicBlock *Dst) const {
313   Edge E(Src, Dst);
314   DenseMap<Edge, unsigned>::const_iterator I = Weights.find(E);
315
316   if (I != Weights.end())
317     return I->second;
318
319   return DEFAULT_WEIGHT;
320 }
321
322 void BranchProbabilityInfo::setEdgeWeight(BasicBlock *Src, BasicBlock *Dst,
323                                      unsigned Weight) {
324   Weights[std::make_pair(Src, Dst)] = Weight;
325   DEBUG(dbgs() << "setEdgeWeight: " << Src->getNameStr() << " -> "
326         << Dst->getNameStr() << " to " << Weight
327         << (isEdgeHot(Src, Dst) ? " [is HOT now]\n" : "\n"));
328 }
329
330 raw_ostream &
331 BranchProbabilityInfo::printEdgeProbability(raw_ostream &OS, BasicBlock *Src,
332                                         BasicBlock *Dst) const {
333
334   unsigned Sum = 0;
335   for (succ_iterator I = succ_begin(Src), E = succ_end(Src); I != E; ++I) {
336     BasicBlock *Succ = *I;
337     unsigned Weight = getEdgeWeight(Src, Succ);
338     unsigned PrevSum = Sum;
339
340     Sum += Weight;
341     assert(Sum > PrevSum); (void) PrevSum;
342   }
343
344   double Prob = (double)getEdgeWeight(Src, Dst) / Sum;
345   OS << "probability (" << Src->getNameStr() << " --> " << Dst->getNameStr()
346      << ") = " << Prob << "\n";
347
348   return OS;
349 }