1//===- PathProfileInfo.h --------------------------------------*- 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 file outlines the interface used by optimizers to load path profiles.
11//
12//===----------------------------------------------------------------------===//
13
14#ifndef LLVM_PATHPROFILEINFO_H
15#define LLVM_PATHPROFILEINFO_H
16
17#include "llvm/BasicBlock.h"
18#include "llvm/Analysis/PathNumbering.h"
19
20namespace llvm {
21
22class ProfilePath;
23class ProfilePathEdge;
24class PathProfileInfo;
25
26typedef std::vector<ProfilePathEdge> ProfilePathEdgeVector;
27typedef std::vector<ProfilePathEdge>::iterator ProfilePathEdgeIterator;
28
29typedef std::vector<BasicBlock*> ProfilePathBlockVector;
30typedef std::vector<BasicBlock*>::iterator ProfilePathBlockIterator;
31
32typedef std::map<unsigned int,ProfilePath*> ProfilePathMap;
33typedef std::map<unsigned int,ProfilePath*>::iterator ProfilePathIterator;
34
35typedef std::map<Function*,unsigned int> FunctionPathCountMap;
36typedef std::map<Function*,ProfilePathMap> FunctionPathMap;
37typedef std::map<Function*,ProfilePathMap>::iterator FunctionPathIterator;
38
39class ProfilePathEdge {
40public:
41  ProfilePathEdge(BasicBlock* source, BasicBlock* target,
42                  unsigned duplicateNumber);
43
44  inline unsigned getDuplicateNumber() { return _duplicateNumber; }
45  inline BasicBlock* getSource() { return _source; }
46  inline BasicBlock* getTarget() { return _target; }
47
48protected:
49  BasicBlock* _source;
50  BasicBlock* _target;
51  unsigned _duplicateNumber;
52};
53
54class ProfilePath {
55public:
56  ProfilePath(unsigned int number, unsigned int count,
57              double countStdDev, PathProfileInfo* ppi);
58
59  double getFrequency() const;
60
61  inline unsigned int getNumber() const { return _number; }
62  inline unsigned int getCount() const { return _count; }
63  inline double getCountStdDev() const { return _countStdDev; }
64
65  ProfilePathEdgeVector* getPathEdges() const;
66  ProfilePathBlockVector* getPathBlocks() const;
67
68  BasicBlock* getFirstBlockInPath() const;
69
70private:
71  unsigned int _number;
72  unsigned int _count;
73  double _countStdDev;
74
75  // double pointer back to the profiling info
76  PathProfileInfo* _ppi;
77};
78
79// TODO: overload [] operator for getting path
80// Add: getFunctionCallCount()
81class PathProfileInfo {
82  public:
83  PathProfileInfo();
84  ~PathProfileInfo();
85
86  void setCurrentFunction(Function* F);
87  Function* getCurrentFunction() const;
88  BasicBlock* getCurrentFunctionEntry();
89
90  ProfilePath* getPath(unsigned int number);
91  unsigned int getPotentialPathCount();
92
93  ProfilePathIterator pathBegin();
94  ProfilePathIterator pathEnd();
95  unsigned int pathsRun();
96
97  static char ID; // Pass identification
98  std::string argList;
99
100protected:
101  FunctionPathMap _functionPaths;
102  FunctionPathCountMap _functionPathCounts;
103
104private:
105  BallLarusDag* _currentDag;
106  Function* _currentFunction;
107
108  friend class ProfilePath;
109};
110} // end namespace llvm
111
112#endif
113