mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-01 16:33:37 +01:00
72f17d97f3
Modified patch by Adam Preuss. This builds on the existing framework for block tracing, edge profiling and optimal edge profiling. See -help-hidden for new flags. For documentation, see the technical report "Implementation of Path Profiling..." in llvm.org/pubs. llvm-svn: 124515
114 lines
3.1 KiB
C++
114 lines
3.1 KiB
C++
//===- PathProfileInfo.h --------------------------------------*- C++ -*---===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// This file outlines the interface used by optimizers to load path profiles.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef LLVM_PATHPROFILEINFO_H
|
|
#define LLVM_PATHPROFILEINFO_H
|
|
|
|
#include "llvm/BasicBlock.h"
|
|
#include "llvm/Analysis/PathNumbering.h"
|
|
#include <stack>
|
|
|
|
namespace llvm {
|
|
|
|
class ProfilePath;
|
|
class ProfilePathEdge;
|
|
class PathProfileInfo;
|
|
|
|
typedef std::vector<ProfilePathEdge> ProfilePathEdgeVector;
|
|
typedef std::vector<ProfilePathEdge>::iterator ProfilePathEdgeIterator;
|
|
|
|
typedef std::vector<BasicBlock*> ProfilePathBlockVector;
|
|
typedef std::vector<BasicBlock*>::iterator ProfilePathBlockIterator;
|
|
|
|
typedef std::map<unsigned int,ProfilePath*> ProfilePathMap;
|
|
typedef std::map<unsigned int,ProfilePath*>::iterator ProfilePathIterator;
|
|
|
|
typedef std::map<Function*,unsigned int> FunctionPathCountMap;
|
|
typedef std::map<Function*,ProfilePathMap> FunctionPathMap;
|
|
typedef std::map<Function*,ProfilePathMap>::iterator FunctionPathIterator;
|
|
|
|
class ProfilePathEdge {
|
|
public:
|
|
ProfilePathEdge(BasicBlock* source, BasicBlock* target,
|
|
unsigned duplicateNumber);
|
|
|
|
inline unsigned getDuplicateNumber() { return _duplicateNumber; }
|
|
inline BasicBlock* getSource() { return _source; }
|
|
inline BasicBlock* getTarget() { return _target; }
|
|
|
|
protected:
|
|
BasicBlock* _source;
|
|
BasicBlock* _target;
|
|
unsigned _duplicateNumber;
|
|
};
|
|
|
|
class ProfilePath {
|
|
public:
|
|
ProfilePath(unsigned int number, unsigned int count,
|
|
double countStdDev, PathProfileInfo* ppi);
|
|
|
|
double getFrequency() const;
|
|
|
|
inline unsigned int getNumber() const { return _number; }
|
|
inline unsigned int getCount() const { return _count; }
|
|
inline double getCountStdDev() const { return _countStdDev; }
|
|
|
|
ProfilePathEdgeVector* getPathEdges() const;
|
|
ProfilePathBlockVector* getPathBlocks() const;
|
|
|
|
BasicBlock* getFirstBlockInPath() const;
|
|
|
|
private:
|
|
unsigned int _number;
|
|
unsigned int _count;
|
|
double _countStdDev;
|
|
|
|
// double pointer back to the profiling info
|
|
PathProfileInfo* _ppi;
|
|
};
|
|
|
|
// TODO: overload [] operator for getting path
|
|
// Add: getFunctionCallCount()
|
|
class PathProfileInfo {
|
|
public:
|
|
PathProfileInfo();
|
|
~PathProfileInfo();
|
|
|
|
void setCurrentFunction(Function* F);
|
|
Function* getCurrentFunction() const;
|
|
BasicBlock* getCurrentFunctionEntry();
|
|
|
|
ProfilePath* getPath(unsigned int number);
|
|
unsigned int getPotentialPathCount();
|
|
|
|
ProfilePathIterator pathBegin();
|
|
ProfilePathIterator pathEnd();
|
|
unsigned int pathsRun();
|
|
|
|
static char ID; // Pass identification
|
|
std::string argList;
|
|
|
|
protected:
|
|
FunctionPathMap _functionPaths;
|
|
FunctionPathCountMap _functionPathCounts;
|
|
|
|
private:
|
|
BallLarusDag* _currentDag;
|
|
Function* _currentFunction;
|
|
|
|
friend class ProfilePath;
|
|
};
|
|
} // end namespace llvm
|
|
|
|
#endif
|