diff options
Diffstat (limited to 'include/llvm/Analysis/ProfileInfo.h')
-rw-r--r-- | include/llvm/Analysis/ProfileInfo.h | 48 |
1 files changed, 35 insertions, 13 deletions
diff --git a/include/llvm/Analysis/ProfileInfo.h b/include/llvm/Analysis/ProfileInfo.h index 7c36975843..3b76ef9456 100644 --- a/include/llvm/Analysis/ProfileInfo.h +++ b/include/llvm/Analysis/ProfileInfo.h @@ -14,56 +14,78 @@ // // Note that to be useful, all profile-based optimizations should preserve // ProfileInfo, which requires that they notify it when changes to the CFG are -// made. +// made. (This is not implemented yet.) // //===----------------------------------------------------------------------===// #ifndef LLVM_ANALYSIS_PROFILEINFO_H #define LLVM_ANALYSIS_PROFILEINFO_H +#include "llvm/BasicBlock.h" +#include <cassert> #include <string> #include <map> namespace llvm { - class BasicBlock; class Function; class Pass; - /// ProfileInfo Class - This class holds and maintains edge profiling + /// ProfileInfo Class - This class holds and maintains profiling /// information for some unit of code. class ProfileInfo { public: // Types for handling profiling information. typedef std::pair<const BasicBlock*, const BasicBlock*> Edge; + typedef std::map<Edge, double> EdgeCounts; + typedef std::map<const BasicBlock*, double> BlockCounts; protected: // EdgeCounts - Count the number of times a transition between two blocks is // executed. As a special case, we also hold an edge from the null // BasicBlock to the entry block to indicate how many times the function was // entered. - std::map<Edge, unsigned> EdgeCounts; + std::map<const Function*, EdgeCounts> EdgeInformation; // BlockCounts - Count the number of times a block is executed. - std::map<const BasicBlock*, unsigned> BlockCounts; + std::map<const Function*, BlockCounts> BlockInformation; // FunctionCounts - Count the number of times a function is executed. - std::map<const Function*, unsigned> FunctionCounts; + std::map<const Function*, double> FunctionInformation; public: static char ID; // Class identification, replacement for typeinfo virtual ~ProfileInfo(); // We want to be subclassed + // MissingValue - The value that is returned for execution counts in case + // no value is available. + static const int MissingValue = -1; + + // getFunction() - Returns the Function for an Edge, checking for validity. + static const Function* getFunction(Edge e) { + assert(e.second && "Invalid ProfileInfo::Edge"); + return e.second->getParent(); + } + + // getEdge() - Creates an Edge from two BasicBlocks. + static Edge getEdge(const BasicBlock* Src, const BasicBlock* Dest) { + return std::make_pair(Src,Dest); + } + //===------------------------------------------------------------------===// /// Profile Information Queries /// - unsigned getExecutionCount(const Function *F) const; + double getExecutionCount(const Function *F); + + double getExecutionCount(const BasicBlock *BB); + + double getEdgeWeight(Edge e) const { + std::map<const Function*, EdgeCounts>::const_iterator J = + EdgeInformation.find(getFunction(e)); + if (J == EdgeInformation.end()) return MissingValue; - unsigned getExecutionCount(const BasicBlock *BB) const; + EdgeCounts::const_iterator I = J->second.find(e); + if (I == J->second.end()) return MissingValue; - unsigned getEdgeWeight(const BasicBlock *Src, - const BasicBlock *Dest) const { - std::map<Edge, unsigned>::const_iterator I = - EdgeCounts.find(std::make_pair(Src, Dest)); - return I != EdgeCounts.end() ? I->second : 0; + return I->second; } //===------------------------------------------------------------------===// |