ProfileInfo.cpp revision e6717d7ba653d2bafb7ce8f1750ee58513fbabad
1//===- ProfileInfo.cpp - Profile Info Interface ---------------------------===//
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 file implements the abstract ProfileInfo interface, and the default
11// "no profile" implementation.
12//
13//===----------------------------------------------------------------------===//
14#define DEBUG_TYPE "profile-info"
15#include "llvm/Analysis/Passes.h"
16#include "llvm/Analysis/ProfileInfo.h"
17#include "llvm/CodeGen/MachineBasicBlock.h"
18#include "llvm/CodeGen/MachineFunction.h"
19#include "llvm/Pass.h"
20#include "llvm/Support/CFG.h"
21#include "llvm/ADT/SmallSet.h"
22#include <set>
23#include <queue>
24#include <limits>
25using namespace llvm;
26
27// Register the ProfileInfo interface, providing a nice name to refer to.
28static RegisterAnalysisGroup<ProfileInfo> Z("Profile Information");
29
30namespace llvm {
31
32template <>
33ProfileInfoT<MachineFunction, MachineBasicBlock>::ProfileInfoT() {}
34template <>
35ProfileInfoT<MachineFunction, MachineBasicBlock>::~ProfileInfoT() {}
36
37template <>
38ProfileInfoT<Function, BasicBlock>::ProfileInfoT() {
39  MachineProfile = 0;
40}
41template <>
42ProfileInfoT<Function, BasicBlock>::~ProfileInfoT() {
43  if (MachineProfile) delete MachineProfile;
44}
45
46template<>
47char ProfileInfoT<Function,BasicBlock>::ID = 0;
48
49template<>
50char ProfileInfoT<MachineFunction, MachineBasicBlock>::ID = 0;
51
52template<>
53const double ProfileInfoT<Function,BasicBlock>::MissingValue = -1;
54
55template<> const
56double ProfileInfoT<MachineFunction, MachineBasicBlock>::MissingValue = -1;
57
58template<> double
59ProfileInfoT<Function,BasicBlock>::getExecutionCount(const BasicBlock *BB) {
60  std::map<const Function*, BlockCounts>::iterator J =
61    BlockInformation.find(BB->getParent());
62  if (J != BlockInformation.end()) {
63    BlockCounts::iterator I = J->second.find(BB);
64    if (I != J->second.end())
65      return I->second;
66  }
67
68  double Count = MissingValue;
69
70  pred_const_iterator PI = pred_begin(BB), PE = pred_end(BB);
71
72  // Are there zero predecessors of this block?
73  if (PI == PE) {
74    Edge e = getEdge(0,BB);
75    Count = getEdgeWeight(e);
76  } else {
77    // Otherwise, if there are predecessors, the execution count of this block is
78    // the sum of the edge frequencies from the incoming edges.
79    std::set<const BasicBlock*> ProcessedPreds;
80    Count = 0;
81    for (; PI != PE; ++PI)
82      if (ProcessedPreds.insert(*PI).second) {
83        double w = getEdgeWeight(getEdge(*PI, BB));
84        if (w == MissingValue) {
85          Count = MissingValue;
86          break;
87        }
88        Count += w;
89      }
90  }
91
92  // If the predecessors did not suffice to get block weight, try successors.
93  if (Count == MissingValue) {
94
95    succ_const_iterator SI = succ_begin(BB), SE = succ_end(BB);
96
97    // Are there zero successors of this block?
98    if (SI == SE) {
99      Edge e = getEdge(BB,0);
100      Count = getEdgeWeight(e);
101    } else {
102      std::set<const BasicBlock*> ProcessedSuccs;
103      Count = 0;
104      for (; SI != SE; ++SI)
105        if (ProcessedSuccs.insert(*SI).second) {
106          double w = getEdgeWeight(getEdge(BB, *SI));
107          if (w == MissingValue) {
108            Count = MissingValue;
109            break;
110          }
111          Count += w;
112        }
113    }
114  }
115
116  if (Count != MissingValue) BlockInformation[BB->getParent()][BB] = Count;
117  return Count;
118}
119
120template<>
121double ProfileInfoT<MachineFunction, MachineBasicBlock>::
122        getExecutionCount(const MachineBasicBlock *MBB) {
123  std::map<const MachineFunction*, BlockCounts>::iterator J =
124    BlockInformation.find(MBB->getParent());
125  if (J != BlockInformation.end()) {
126    BlockCounts::iterator I = J->second.find(MBB);
127    if (I != J->second.end())
128      return I->second;
129  }
130
131  return MissingValue;
132}
133
134template<>
135double ProfileInfoT<Function,BasicBlock>::getExecutionCount(const Function *F) {
136  std::map<const Function*, double>::iterator J =
137    FunctionInformation.find(F);
138  if (J != FunctionInformation.end())
139    return J->second;
140
141  // isDeclaration() is checked here and not at start of function to allow
142  // functions without a body still to have a execution count.
143  if (F->isDeclaration()) return MissingValue;
144
145  double Count = getExecutionCount(&F->getEntryBlock());
146  if (Count != MissingValue) FunctionInformation[F] = Count;
147  return Count;
148}
149
150template<>
151double ProfileInfoT<MachineFunction, MachineBasicBlock>::
152        getExecutionCount(const MachineFunction *MF) {
153  std::map<const MachineFunction*, double>::iterator J =
154    FunctionInformation.find(MF);
155  if (J != FunctionInformation.end())
156    return J->second;
157
158  double Count = getExecutionCount(&MF->front());
159  if (Count != MissingValue) FunctionInformation[MF] = Count;
160  return Count;
161}
162
163template<>
164void ProfileInfoT<Function,BasicBlock>::
165        setExecutionCount(const BasicBlock *BB, double w) {
166  DEBUG(dbgs() << "Creating Block " << BB->getName()
167               << " (weight: " << format("%.20g",w) << ")\n");
168  BlockInformation[BB->getParent()][BB] = w;
169}
170
171template<>
172void ProfileInfoT<MachineFunction, MachineBasicBlock>::
173        setExecutionCount(const MachineBasicBlock *MBB, double w) {
174  DEBUG(dbgs() << "Creating Block " << MBB->getBasicBlock()->getName()
175               << " (weight: " << format("%.20g",w) << ")\n");
176  BlockInformation[MBB->getParent()][MBB] = w;
177}
178
179template<>
180void ProfileInfoT<Function,BasicBlock>::addEdgeWeight(Edge e, double w) {
181  double oldw = getEdgeWeight(e);
182  assert (oldw != MissingValue && "Adding weight to Edge with no previous weight");
183  DEBUG(dbgs() << "Adding to Edge " << e
184               << " (new weight: " << format("%.20g",oldw + w) << ")\n");
185  EdgeInformation[getFunction(e)][e] = oldw + w;
186}
187
188template<>
189void ProfileInfoT<Function,BasicBlock>::
190        addExecutionCount(const BasicBlock *BB, double w) {
191  double oldw = getExecutionCount(BB);
192  assert (oldw != MissingValue && "Adding weight to Block with no previous weight");
193  DEBUG(dbgs() << "Adding to Block " << BB->getName()
194               << " (new weight: " << format("%.20g",oldw + w) << ")\n");
195  BlockInformation[BB->getParent()][BB] = oldw + w;
196}
197
198template<>
199void ProfileInfoT<Function,BasicBlock>::removeBlock(const BasicBlock *BB) {
200  std::map<const Function*, BlockCounts>::iterator J =
201    BlockInformation.find(BB->getParent());
202  if (J == BlockInformation.end()) return;
203
204  DEBUG(dbgs() << "Deleting " << BB->getName() << "\n");
205  J->second.erase(BB);
206}
207
208template<>
209void ProfileInfoT<Function,BasicBlock>::removeEdge(Edge e) {
210  std::map<const Function*, EdgeWeights>::iterator J =
211    EdgeInformation.find(getFunction(e));
212  if (J == EdgeInformation.end()) return;
213
214  DEBUG(dbgs() << "Deleting" << e << "\n");
215  J->second.erase(e);
216}
217
218template<>
219void ProfileInfoT<Function,BasicBlock>::
220        replaceEdge(const Edge &oldedge, const Edge &newedge) {
221  double w;
222  if ((w = getEdgeWeight(newedge)) == MissingValue) {
223    w = getEdgeWeight(oldedge);
224    DEBUG(dbgs() << "Replacing " << oldedge << " with " << newedge  << "\n");
225  } else {
226    w += getEdgeWeight(oldedge);
227    DEBUG(dbgs() << "Adding " << oldedge << " to " << newedge  << "\n");
228  }
229  setEdgeWeight(newedge,w);
230  removeEdge(oldedge);
231}
232
233template<>
234const BasicBlock *ProfileInfoT<Function,BasicBlock>::
235        GetPath(const BasicBlock *Src, const BasicBlock *Dest,
236                Path &P, unsigned Mode) {
237  const BasicBlock *BB = 0;
238  bool hasFoundPath = false;
239
240  std::queue<const BasicBlock *> BFS;
241  BFS.push(Src);
242
243  while(BFS.size() && !hasFoundPath) {
244    BB = BFS.front();
245    BFS.pop();
246
247    succ_const_iterator Succ = succ_begin(BB), End = succ_end(BB);
248    if (Succ == End) {
249      P[0] = BB;
250      if (Mode & GetPathToExit) {
251        hasFoundPath = true;
252        BB = 0;
253      }
254    }
255    for(;Succ != End; ++Succ) {
256      if (P.find(*Succ) != P.end()) continue;
257      Edge e = getEdge(BB,*Succ);
258      if ((Mode & GetPathWithNewEdges) && (getEdgeWeight(e) != MissingValue)) continue;
259      P[*Succ] = BB;
260      BFS.push(*Succ);
261      if ((Mode & GetPathToDest) && *Succ == Dest) {
262        hasFoundPath = true;
263        BB = *Succ;
264        break;
265      }
266      if ((Mode & GetPathToValue) && (getExecutionCount(*Succ) != MissingValue)) {
267        hasFoundPath = true;
268        BB = *Succ;
269        break;
270      }
271    }
272  }
273
274  return BB;
275}
276
277template<>
278void ProfileInfoT<Function,BasicBlock>::
279        divertFlow(const Edge &oldedge, const Edge &newedge) {
280  DEBUG(dbgs() << "Diverting " << oldedge << " via " << newedge );
281
282  // First check if the old edge was taken, if not, just delete it...
283  if (getEdgeWeight(oldedge) == 0) {
284    removeEdge(oldedge);
285    return;
286  }
287
288  Path P;
289  P[newedge.first] = 0;
290  P[newedge.second] = newedge.first;
291  const BasicBlock *BB = GetPath(newedge.second,oldedge.second,P,GetPathToExit | GetPathToDest);
292
293  double w = getEdgeWeight (oldedge);
294  DEBUG(dbgs() << ", Weight: " << format("%.20g",w) << "\n");
295  do {
296    const BasicBlock *Parent = P.find(BB)->second;
297    Edge e = getEdge(Parent,BB);
298    double oldw = getEdgeWeight(e);
299    double oldc = getExecutionCount(e.first);
300    setEdgeWeight(e, w+oldw);
301    if (Parent != oldedge.first) {
302      setExecutionCount(e.first, w+oldc);
303    }
304    BB = Parent;
305  } while (BB != newedge.first);
306  removeEdge(oldedge);
307}
308
309/// Replaces all occurences of RmBB in the ProfilingInfo with DestBB.
310/// This checks all edges of the function the blocks reside in and replaces the
311/// occurences of RmBB with DestBB.
312template<>
313void ProfileInfoT<Function,BasicBlock>::
314        replaceAllUses(const BasicBlock *RmBB, const BasicBlock *DestBB) {
315  DEBUG(dbgs() << "Replacing " << RmBB->getName()
316               << " with " << DestBB->getName() << "\n");
317  const Function *F = DestBB->getParent();
318  std::map<const Function*, EdgeWeights>::iterator J =
319    EdgeInformation.find(F);
320  if (J == EdgeInformation.end()) return;
321
322  Edge e, newedge;
323  bool erasededge = false;
324  EdgeWeights::iterator I = J->second.begin(), E = J->second.end();
325  while(I != E) {
326    e = (I++)->first;
327    bool foundedge = false; bool eraseedge = false;
328    if (e.first == RmBB) {
329      if (e.second == DestBB) {
330        eraseedge = true;
331      } else {
332        newedge = getEdge(DestBB, e.second);
333        foundedge = true;
334      }
335    }
336    if (e.second == RmBB) {
337      if (e.first == DestBB) {
338        eraseedge = true;
339      } else {
340        newedge = getEdge(e.first, DestBB);
341        foundedge = true;
342      }
343    }
344    if (foundedge) {
345      replaceEdge(e, newedge);
346    }
347    if (eraseedge) {
348      if (erasededge) {
349        Edge newedge = getEdge(DestBB, DestBB);
350        replaceEdge(e, newedge);
351      } else {
352        removeEdge(e);
353        erasededge = true;
354      }
355    }
356  }
357}
358
359/// Splits an edge in the ProfileInfo and redirects flow over NewBB.
360/// Since its possible that there is more than one edge in the CFG from FristBB
361/// to SecondBB its necessary to redirect the flow proporionally.
362template<>
363void ProfileInfoT<Function,BasicBlock>::splitEdge(const BasicBlock *FirstBB,
364                                                  const BasicBlock *SecondBB,
365                                                  const BasicBlock *NewBB,
366                                                  bool MergeIdenticalEdges) {
367  const Function *F = FirstBB->getParent();
368  std::map<const Function*, EdgeWeights>::iterator J =
369    EdgeInformation.find(F);
370  if (J == EdgeInformation.end()) return;
371
372  // Generate edges and read current weight.
373  Edge e  = getEdge(FirstBB, SecondBB);
374  Edge n1 = getEdge(FirstBB, NewBB);
375  Edge n2 = getEdge(NewBB, SecondBB);
376  EdgeWeights &ECs = J->second;
377  double w = ECs[e];
378
379  int succ_count = 0;
380  if (!MergeIdenticalEdges) {
381    // First count the edges from FristBB to SecondBB, if there is more than
382    // one, only slice out a proporional part for NewBB.
383    for(succ_const_iterator BBI = succ_begin(FirstBB), BBE = succ_end(FirstBB);
384        BBI != BBE; ++BBI) {
385      if (*BBI == SecondBB) succ_count++;
386    }
387    // When the NewBB is completely new, increment the count by one so that
388    // the counts are properly distributed.
389    if (getExecutionCount(NewBB) == ProfileInfo::MissingValue) succ_count++;
390  } else {
391    // When the edges are merged anyway, then redirect all flow.
392    succ_count = 1;
393  }
394
395  // We know now how many edges there are from FirstBB to SecondBB, reroute a
396  // proportional part of the edge weight over NewBB.
397  double neww = floor(w / succ_count);
398  ECs[n1] += neww;
399  ECs[n2] += neww;
400  BlockInformation[F][NewBB] += neww;
401  if (succ_count == 1) {
402    ECs.erase(e);
403  } else {
404    ECs[e] -= neww;
405  }
406}
407
408template<>
409void ProfileInfoT<Function,BasicBlock>::splitBlock(const BasicBlock *Old,
410                                                   const BasicBlock* New) {
411  const Function *F = Old->getParent();
412  std::map<const Function*, EdgeWeights>::iterator J =
413    EdgeInformation.find(F);
414  if (J == EdgeInformation.end()) return;
415
416  DEBUG(dbgs() << "Splitting " << Old->getName() << " to " << New->getName() << "\n");
417
418  std::set<Edge> Edges;
419  for (EdgeWeights::iterator ewi = J->second.begin(), ewe = J->second.end();
420       ewi != ewe; ++ewi) {
421    Edge old = ewi->first;
422    if (old.first == Old) {
423      Edges.insert(old);
424    }
425  }
426  for (std::set<Edge>::iterator EI = Edges.begin(), EE = Edges.end();
427       EI != EE; ++EI) {
428    Edge newedge = getEdge(New, EI->second);
429    replaceEdge(*EI, newedge);
430  }
431
432  double w = getExecutionCount(Old);
433  setEdgeWeight(getEdge(Old, New), w);
434  setExecutionCount(New, w);
435}
436
437template<>
438void ProfileInfoT<Function,BasicBlock>::splitBlock(const BasicBlock *BB,
439                                                   const BasicBlock* NewBB,
440                                                   BasicBlock *const *Preds,
441                                                   unsigned NumPreds) {
442  const Function *F = BB->getParent();
443  std::map<const Function*, EdgeWeights>::iterator J =
444    EdgeInformation.find(F);
445  if (J == EdgeInformation.end()) return;
446
447  DEBUG(dbgs() << "Splitting " << NumPreds << " Edges from " << BB->getName()
448               << " to " << NewBB->getName() << "\n");
449
450  // Collect weight that was redirected over NewBB.
451  double newweight = 0;
452
453  std::set<const BasicBlock *> ProcessedPreds;
454  // For all requestes Predecessors.
455  for (unsigned pred = 0; pred < NumPreds; ++pred) {
456    const BasicBlock * Pred = Preds[pred];
457    if (ProcessedPreds.insert(Pred).second) {
458      // Create edges and read old weight.
459      Edge oldedge = getEdge(Pred, BB);
460      Edge newedge = getEdge(Pred, NewBB);
461
462      // Remember how much weight was redirected.
463      newweight += getEdgeWeight(oldedge);
464
465      replaceEdge(oldedge,newedge);
466    }
467  }
468
469  Edge newedge = getEdge(NewBB,BB);
470  setEdgeWeight(newedge, newweight);
471  setExecutionCount(NewBB, newweight);
472}
473
474template<>
475void ProfileInfoT<Function,BasicBlock>::transfer(const Function *Old,
476                                                 const Function *New) {
477  DEBUG(dbgs() << "Replacing Function " << Old->getName() << " with "
478               << New->getName() << "\n");
479  std::map<const Function*, EdgeWeights>::iterator J =
480    EdgeInformation.find(Old);
481  if(J != EdgeInformation.end()) {
482    EdgeInformation[New] = J->second;
483  }
484  EdgeInformation.erase(Old);
485  BlockInformation.erase(Old);
486  FunctionInformation.erase(Old);
487}
488
489static double readEdgeOrRemember(ProfileInfo::Edge edge, double w,
490                                 ProfileInfo::Edge &tocalc, unsigned &uncalc) {
491  if (w == ProfileInfo::MissingValue) {
492    tocalc = edge;
493    uncalc++;
494    return 0;
495  } else {
496    return w;
497  }
498}
499
500template<>
501bool ProfileInfoT<Function,BasicBlock>::
502        CalculateMissingEdge(const BasicBlock *BB, Edge &removed,
503                             bool assumeEmptySelf) {
504  Edge edgetocalc;
505  unsigned uncalculated = 0;
506
507  // collect weights of all incoming and outgoing edges, rememer edges that
508  // have no value
509  double incount = 0;
510  SmallSet<const BasicBlock*,8> pred_visited;
511  pred_const_iterator bbi = pred_begin(BB), bbe = pred_end(BB);
512  if (bbi==bbe) {
513    Edge e = getEdge(0,BB);
514    incount += readEdgeOrRemember(e, getEdgeWeight(e) ,edgetocalc,uncalculated);
515  }
516  for (;bbi != bbe; ++bbi) {
517    if (pred_visited.insert(*bbi)) {
518      Edge e = getEdge(*bbi,BB);
519      incount += readEdgeOrRemember(e, getEdgeWeight(e) ,edgetocalc,uncalculated);
520    }
521  }
522
523  double outcount = 0;
524  SmallSet<const BasicBlock*,8> succ_visited;
525  succ_const_iterator sbbi = succ_begin(BB), sbbe = succ_end(BB);
526  if (sbbi==sbbe) {
527    Edge e = getEdge(BB,0);
528    if (getEdgeWeight(e) == MissingValue) {
529      double w = getExecutionCount(BB);
530      if (w != MissingValue) {
531        setEdgeWeight(e,w);
532        removed = e;
533      }
534    }
535    outcount += readEdgeOrRemember(e, getEdgeWeight(e), edgetocalc, uncalculated);
536  }
537  for (;sbbi != sbbe; ++sbbi) {
538    if (succ_visited.insert(*sbbi)) {
539      Edge e = getEdge(BB,*sbbi);
540      outcount += readEdgeOrRemember(e, getEdgeWeight(e), edgetocalc, uncalculated);
541    }
542  }
543
544  // if exactly one edge weight was missing, calculate it and remove it from
545  // spanning tree
546  if (uncalculated == 0 ) {
547    return true;
548  } else
549  if (uncalculated == 1) {
550    if (incount < outcount) {
551      EdgeInformation[BB->getParent()][edgetocalc] = outcount-incount;
552    } else {
553      EdgeInformation[BB->getParent()][edgetocalc] = incount-outcount;
554    }
555    DEBUG(dbgs() << "--Calc Edge Counter for " << edgetocalc << ": "
556                 << format("%.20g", getEdgeWeight(edgetocalc)) << "\n");
557    removed = edgetocalc;
558    return true;
559  } else
560  if (uncalculated == 2 && assumeEmptySelf && edgetocalc.first == edgetocalc.second && incount == outcount) {
561    setEdgeWeight(edgetocalc, incount * 10);
562    removed = edgetocalc;
563    return true;
564  } else {
565    return false;
566  }
567}
568
569static void readEdge(ProfileInfo *PI, ProfileInfo::Edge e, double &calcw, std::set<ProfileInfo::Edge> &misscount) {
570  double w = PI->getEdgeWeight(e);
571  if (w != ProfileInfo::MissingValue) {
572    calcw += w;
573  } else {
574    misscount.insert(e);
575  }
576}
577
578template<>
579bool ProfileInfoT<Function,BasicBlock>::EstimateMissingEdges(const BasicBlock *BB) {
580  bool hasNoSuccessors = false;
581
582  double inWeight = 0;
583  std::set<Edge> inMissing;
584  std::set<const BasicBlock*> ProcessedPreds;
585  pred_const_iterator bbi = pred_begin(BB), bbe = pred_end(BB);
586  if (bbi == bbe) {
587    readEdge(this,getEdge(0,BB),inWeight,inMissing);
588  }
589  for( ; bbi != bbe; ++bbi ) {
590    if (ProcessedPreds.insert(*bbi).second) {
591      readEdge(this,getEdge(*bbi,BB),inWeight,inMissing);
592    }
593  }
594
595  double outWeight = 0;
596  std::set<Edge> outMissing;
597  std::set<const BasicBlock*> ProcessedSuccs;
598  succ_const_iterator sbbi = succ_begin(BB), sbbe = succ_end(BB);
599  if (sbbi == sbbe) {
600    readEdge(this,getEdge(BB,0),outWeight,outMissing);
601    hasNoSuccessors = true;
602  }
603  for ( ; sbbi != sbbe; ++sbbi ) {
604    if (ProcessedSuccs.insert(*sbbi).second) {
605      readEdge(this,getEdge(BB,*sbbi),outWeight,outMissing);
606    }
607  }
608
609  double share;
610  std::set<Edge>::iterator ei,ee;
611  if (inMissing.size() == 0 && outMissing.size() > 0) {
612    ei = outMissing.begin();
613    ee = outMissing.end();
614    share = inWeight/outMissing.size();
615    setExecutionCount(BB,inWeight);
616  } else
617  if (inMissing.size() > 0 && outMissing.size() == 0 && outWeight == 0) {
618    ei = inMissing.begin();
619    ee = inMissing.end();
620    share = 0;
621    setExecutionCount(BB,0);
622  } else
623  if (inMissing.size() == 0 && outMissing.size() == 0) {
624    setExecutionCount(BB,outWeight);
625    return true;
626  } else {
627    return false;
628  }
629  for ( ; ei != ee; ++ei ) {
630    setEdgeWeight(*ei,share);
631  }
632  return true;
633}
634
635template<>
636void ProfileInfoT<Function,BasicBlock>::repair(const Function *F) {
637//  if (getExecutionCount(&(F->getEntryBlock())) == 0) {
638//    for (Function::const_iterator FI = F->begin(), FE = F->end();
639//         FI != FE; ++FI) {
640//      const BasicBlock* BB = &(*FI);
641//      {
642//        pred_const_iterator NBB = pred_begin(BB), End = pred_end(BB);
643//        if (NBB == End) {
644//          setEdgeWeight(getEdge(0,BB),0);
645//        }
646//        for(;NBB != End; ++NBB) {
647//          setEdgeWeight(getEdge(*NBB,BB),0);
648//        }
649//      }
650//      {
651//        succ_const_iterator NBB = succ_begin(BB), End = succ_end(BB);
652//        if (NBB == End) {
653//          setEdgeWeight(getEdge(0,BB),0);
654//        }
655//        for(;NBB != End; ++NBB) {
656//          setEdgeWeight(getEdge(*NBB,BB),0);
657//        }
658//      }
659//    }
660//    return;
661//  }
662  // The set of BasicBlocks that are still unvisited.
663  std::set<const BasicBlock*> Unvisited;
664
665  // The set of return edges (Edges with no successors).
666  std::set<Edge> ReturnEdges;
667  double ReturnWeight = 0;
668
669  // First iterate over the whole function and collect:
670  // 1) The blocks in this function in the Unvisited set.
671  // 2) The return edges in the ReturnEdges set.
672  // 3) The flow that is leaving the function already via return edges.
673
674  // Data structure for searching the function.
675  std::queue<const BasicBlock *> BFS;
676  const BasicBlock *BB = &(F->getEntryBlock());
677  BFS.push(BB);
678  Unvisited.insert(BB);
679
680  while (BFS.size()) {
681    BB = BFS.front(); BFS.pop();
682    succ_const_iterator NBB = succ_begin(BB), End = succ_end(BB);
683    if (NBB == End) {
684      Edge e = getEdge(BB,0);
685      double w = getEdgeWeight(e);
686      if (w == MissingValue) {
687        // If the return edge has no value, try to read value from block.
688        double bw = getExecutionCount(BB);
689        if (bw != MissingValue) {
690          setEdgeWeight(e,bw);
691          ReturnWeight += bw;
692        } else {
693          // If both return edge and block provide no value, collect edge.
694          ReturnEdges.insert(e);
695        }
696      } else {
697        // If the return edge has a proper value, collect it.
698        ReturnWeight += w;
699      }
700    }
701    for (;NBB != End; ++NBB) {
702      if (Unvisited.insert(*NBB).second) {
703        BFS.push(*NBB);
704      }
705    }
706  }
707
708  while (Unvisited.size() > 0) {
709    unsigned oldUnvisitedCount = Unvisited.size();
710    bool FoundPath = false;
711
712    // If there is only one edge left, calculate it.
713    if (ReturnEdges.size() == 1) {
714      ReturnWeight = getExecutionCount(&(F->getEntryBlock())) - ReturnWeight;
715
716      Edge e = *ReturnEdges.begin();
717      setEdgeWeight(e,ReturnWeight);
718      setExecutionCount(e.first,ReturnWeight);
719
720      Unvisited.erase(e.first);
721      ReturnEdges.erase(e);
722      continue;
723    }
724
725    // Calculate all blocks where only one edge is missing, this may also
726    // resolve furhter return edges.
727    std::set<const BasicBlock *>::iterator FI = Unvisited.begin(), FE = Unvisited.end();
728    while(FI != FE) {
729      const BasicBlock *BB = *FI; ++FI;
730      Edge e;
731      if(CalculateMissingEdge(BB,e,true)) {
732        if (BlockInformation[F].find(BB) == BlockInformation[F].end()) {
733          setExecutionCount(BB,getExecutionCount(BB));
734        }
735        Unvisited.erase(BB);
736        if (e.first != 0 && e.second == 0) {
737          ReturnEdges.erase(e);
738          ReturnWeight += getEdgeWeight(e);
739        }
740      }
741    }
742    if (oldUnvisitedCount > Unvisited.size()) continue;
743
744    // Estimate edge weights by dividing the flow proportionally.
745    FI = Unvisited.begin(), FE = Unvisited.end();
746    while(FI != FE) {
747      const BasicBlock *BB = *FI; ++FI;
748      const BasicBlock *Dest = 0;
749      bool AllEdgesHaveSameReturn = true;
750      // Check each Successor, these must all end up in the same or an empty
751      // return block otherwise its dangerous to do an estimation on them.
752      for (succ_const_iterator Succ = succ_begin(BB), End = succ_end(BB);
753           Succ != End; ++Succ) {
754        Path P;
755        GetPath(*Succ, 0, P, GetPathToExit);
756        if (Dest && Dest != P[0]) {
757          AllEdgesHaveSameReturn = false;
758        }
759        Dest = P[0];
760      }
761      if (AllEdgesHaveSameReturn) {
762        if(EstimateMissingEdges(BB)) {
763          Unvisited.erase(BB);
764          break;
765        }
766      }
767    }
768    if (oldUnvisitedCount > Unvisited.size()) continue;
769
770    // Check if there is a path to an block that has a known value and redirect
771    // flow accordingly.
772    FI = Unvisited.begin(), FE = Unvisited.end();
773    while(FI != FE && !FoundPath) {
774      // Fetch path.
775      const BasicBlock *BB = *FI; ++FI;
776      Path P;
777      const BasicBlock *Dest = GetPath(BB, 0, P, GetPathToValue);
778
779      // Calculate incoming flow.
780      double iw = 0; unsigned inmissing = 0; unsigned incount = 0; unsigned invalid = 0;
781      std::set<const BasicBlock *> Processed;
782      for (pred_const_iterator NBB = pred_begin(BB), End = pred_end(BB);
783           NBB != End; ++NBB) {
784        if (Processed.insert(*NBB).second) {
785          Edge e = getEdge(*NBB, BB);
786          double ew = getEdgeWeight(e);
787          if (ew != MissingValue) {
788            iw += ew;
789            invalid++;
790          } else {
791            // If the path contains the successor, this means its a backedge,
792            // do not count as missing.
793            if (P.find(*NBB) == P.end())
794              inmissing++;
795          }
796          incount++;
797        }
798      }
799      if (inmissing == incount) continue;
800      if (invalid == 0) continue;
801
802      // Subtract (already) outgoing flow.
803      Processed.clear();
804      for (succ_const_iterator NBB = succ_begin(BB), End = succ_end(BB);
805           NBB != End; ++NBB) {
806        if (Processed.insert(*NBB).second) {
807          Edge e = getEdge(BB, *NBB);
808          double ew = getEdgeWeight(e);
809          if (ew != MissingValue) {
810            iw -= ew;
811          }
812        }
813      }
814      if (iw < 0) continue;
815
816      // Check the recieving end of the path if it can handle the flow.
817      double ow = getExecutionCount(Dest);
818      Processed.clear();
819      for (succ_const_iterator NBB = succ_begin(BB), End = succ_end(BB);
820           NBB != End; ++NBB) {
821        if (Processed.insert(*NBB).second) {
822          Edge e = getEdge(BB, *NBB);
823          double ew = getEdgeWeight(e);
824          if (ew != MissingValue) {
825            ow -= ew;
826          }
827        }
828      }
829      if (ow < 0) continue;
830
831      // Determine how much flow shall be used.
832      double ew = getEdgeWeight(getEdge(P[Dest],Dest));
833      if (ew != MissingValue) {
834        ew = ew<ow?ew:ow;
835        ew = ew<iw?ew:iw;
836      } else {
837        if (inmissing == 0)
838          ew = iw;
839      }
840
841      // Create flow.
842      if (ew != MissingValue) {
843        do {
844          Edge e = getEdge(P[Dest],Dest);
845          if (getEdgeWeight(e) == MissingValue) {
846            setEdgeWeight(e,ew);
847            FoundPath = true;
848          }
849          Dest = P[Dest];
850        } while (Dest != BB);
851      }
852    }
853    if (FoundPath) continue;
854
855    // Calculate a block with self loop.
856    FI = Unvisited.begin(), FE = Unvisited.end();
857    while(FI != FE && !FoundPath) {
858      const BasicBlock *BB = *FI; ++FI;
859      bool SelfEdgeFound = false;
860      for (succ_const_iterator NBB = succ_begin(BB), End = succ_end(BB);
861           NBB != End; ++NBB) {
862        if (*NBB == BB) {
863          SelfEdgeFound = true;
864          break;
865        }
866      }
867      if (SelfEdgeFound) {
868        Edge e = getEdge(BB,BB);
869        if (getEdgeWeight(e) == MissingValue) {
870          double iw = 0;
871          std::set<const BasicBlock *> Processed;
872          for (pred_const_iterator NBB = pred_begin(BB), End = pred_end(BB);
873               NBB != End; ++NBB) {
874            if (Processed.insert(*NBB).second) {
875              Edge e = getEdge(*NBB, BB);
876              double ew = getEdgeWeight(e);
877              if (ew != MissingValue) {
878                iw += ew;
879              }
880            }
881          }
882          setEdgeWeight(e,iw * 10);
883          FoundPath = true;
884        }
885      }
886    }
887    if (FoundPath) continue;
888
889    // Determine backedges, set them to zero.
890    FI = Unvisited.begin(), FE = Unvisited.end();
891    while(FI != FE && !FoundPath) {
892      const BasicBlock *BB = *FI; ++FI;
893      const BasicBlock *Dest;
894      Path P;
895      bool BackEdgeFound = false;
896      for (pred_const_iterator NBB = pred_begin(BB), End = pred_end(BB);
897           NBB != End; ++NBB) {
898        Dest = GetPath(BB, *NBB, P, GetPathToDest | GetPathWithNewEdges);
899        if (Dest == *NBB) {
900          BackEdgeFound = true;
901          break;
902        }
903      }
904      if (BackEdgeFound) {
905        Edge e = getEdge(Dest,BB);
906        double w = getEdgeWeight(e);
907        if (w == MissingValue) {
908          setEdgeWeight(e,0);
909          FoundPath = true;
910        }
911        do {
912          Edge e = getEdge(P[Dest], Dest);
913          double w = getEdgeWeight(e);
914          if (w == MissingValue) {
915            setEdgeWeight(e,0);
916            FoundPath = true;
917          }
918          Dest = P[Dest];
919        } while (Dest != BB);
920      }
921    }
922    if (FoundPath) continue;
923
924    // Channel flow to return block.
925    FI = Unvisited.begin(), FE = Unvisited.end();
926    while(FI != FE && !FoundPath) {
927      const BasicBlock *BB = *FI; ++FI;
928
929      Path P;
930      const BasicBlock *Dest = GetPath(BB, 0, P, GetPathToExit | GetPathWithNewEdges);
931      Dest = P[0];
932      if (!Dest) continue;
933
934      if (getEdgeWeight(getEdge(Dest,0)) == MissingValue) {
935        // Calculate incoming flow.
936        double iw = 0;
937        std::set<const BasicBlock *> Processed;
938        for (pred_const_iterator NBB = pred_begin(BB), End = pred_end(BB);
939             NBB != End; ++NBB) {
940          if (Processed.insert(*NBB).second) {
941            Edge e = getEdge(*NBB, BB);
942            double ew = getEdgeWeight(e);
943            if (ew != MissingValue) {
944              iw += ew;
945            }
946          }
947        }
948        do {
949          Edge e = getEdge(P[Dest], Dest);
950          double w = getEdgeWeight(e);
951          if (w == MissingValue) {
952            setEdgeWeight(e,iw);
953            FoundPath = true;
954          } else {
955            assert(0 && "Edge should not have value already!");
956          }
957          Dest = P[Dest];
958        } while (Dest != BB);
959      }
960    }
961    if (FoundPath) continue;
962
963    // Speculatively set edges to zero.
964    FI = Unvisited.begin(), FE = Unvisited.end();
965    while(FI != FE && !FoundPath) {
966      const BasicBlock *BB = *FI; ++FI;
967
968      for (pred_const_iterator NBB = pred_begin(BB), End = pred_end(BB);
969           NBB != End; ++NBB) {
970        Edge e = getEdge(*NBB,BB);
971        double w = getEdgeWeight(e);
972        if (w == MissingValue) {
973          setEdgeWeight(e,0);
974          FoundPath = true;
975          break;
976        }
977      }
978    }
979    if (FoundPath) continue;
980
981    errs() << "{";
982    FI = Unvisited.begin(), FE = Unvisited.end();
983    while(FI != FE) {
984      const BasicBlock *BB = *FI; ++FI;
985      dbgs() << BB->getName();
986      if (FI != FE)
987        dbgs() << ",";
988    }
989    errs() << "}";
990
991    errs() << "ASSERT: could not repair function";
992    assert(0 && "could not repair function");
993  }
994
995  EdgeWeights J = EdgeInformation[F];
996  for (EdgeWeights::iterator EI = J.begin(), EE = J.end(); EI != EE; ++EI) {
997    Edge e = EI->first;
998
999    bool SuccFound = false;
1000    if (e.first != 0) {
1001      succ_const_iterator NBB = succ_begin(e.first), End = succ_end(e.first);
1002      if (NBB == End) {
1003        if (0 == e.second) {
1004          SuccFound = true;
1005        }
1006      }
1007      for (;NBB != End; ++NBB) {
1008        if (*NBB == e.second) {
1009          SuccFound = true;
1010          break;
1011        }
1012      }
1013      if (!SuccFound) {
1014        removeEdge(e);
1015      }
1016    }
1017  }
1018}
1019
1020raw_ostream& operator<<(raw_ostream &O, const Function *F) {
1021  return O << F->getName();
1022}
1023
1024raw_ostream& operator<<(raw_ostream &O, const MachineFunction *MF) {
1025  return O << MF->getFunction()->getName() << "(MF)";
1026}
1027
1028raw_ostream& operator<<(raw_ostream &O, const BasicBlock *BB) {
1029  return O << BB->getName();
1030}
1031
1032raw_ostream& operator<<(raw_ostream &O, const MachineBasicBlock *MBB) {
1033  return O << MBB->getBasicBlock()->getName() << "(MB)";
1034}
1035
1036raw_ostream& operator<<(raw_ostream &O, std::pair<const BasicBlock *, const BasicBlock *> E) {
1037  O << "(";
1038
1039  if (E.first)
1040    O << E.first;
1041  else
1042    O << "0";
1043
1044  O << ",";
1045
1046  if (E.second)
1047    O << E.second;
1048  else
1049    O << "0";
1050
1051  return O << ")";
1052}
1053
1054raw_ostream& operator<<(raw_ostream &O, std::pair<const MachineBasicBlock *, const MachineBasicBlock *> E) {
1055  O << "(";
1056
1057  if (E.first)
1058    O << E.first;
1059  else
1060    O << "0";
1061
1062  O << ",";
1063
1064  if (E.second)
1065    O << E.second;
1066  else
1067    O << "0";
1068
1069  return O << ")";
1070}
1071
1072} // namespace llvm
1073
1074//===----------------------------------------------------------------------===//
1075//  NoProfile ProfileInfo implementation
1076//
1077
1078namespace {
1079  struct NoProfileInfo : public ImmutablePass, public ProfileInfo {
1080    static char ID; // Class identification, replacement for typeinfo
1081    NoProfileInfo() : ImmutablePass(&ID) {}
1082  };
1083}  // End of anonymous namespace
1084
1085char NoProfileInfo::ID = 0;
1086// Register this pass...
1087static RegisterPass<NoProfileInfo>
1088X("no-profile", "No Profile Information", false, true);
1089
1090// Declare that we implement the ProfileInfo interface
1091static RegisterAnalysisGroup<ProfileInfo, true> Y(X);
1092
1093ImmutablePass *llvm::createNoProfileInfoPass() { return new NoProfileInfo(); }
1094