diff options
author | Daniel Dunbar <daniel@zuster.org> | 2009-07-14 06:58:59 +0000 |
---|---|---|
committer | Daniel Dunbar <daniel@zuster.org> | 2009-07-14 06:58:59 +0000 |
commit | 9afad0888db17aebbe5ee9084c186970be71a13f (patch) | |
tree | a1fd582e651ab39affda516dfdfbe719fcf13428 | |
parent | a9ad47d94c9a11535b924a55cbfb256c51583d07 (diff) | |
download | bcm5719-llvm-9afad0888db17aebbe5ee9084c186970be71a13f.tar.gz bcm5719-llvm-9afad0888db17aebbe5ee9084c186970be71a13f.zip |
ProfileInfo interface tweaks.
- Add getExecutionCount(const Function).
- Add helper Edge type.
- constify.
- No functionality change.
llvm-svn: 75623
-rw-r--r-- | llvm/include/llvm/Analysis/ProfileInfo.h | 16 | ||||
-rw-r--r-- | llvm/lib/Analysis/ProfileInfo.cpp | 16 |
2 files changed, 22 insertions, 10 deletions
diff --git a/llvm/include/llvm/Analysis/ProfileInfo.h b/llvm/include/llvm/Analysis/ProfileInfo.h index ff83f97ee04..47b437c1b25 100644 --- a/llvm/include/llvm/Analysis/ProfileInfo.h +++ b/llvm/include/llvm/Analysis/ProfileInfo.h @@ -26,17 +26,22 @@ namespace llvm { class BasicBlock; + class Function; class Pass; /// ProfileInfo Class - This class holds and maintains edge profiling /// information for some unit of code. class ProfileInfo { + public: + // Types for handling profiling information. + typedef std::pair<const BasicBlock*, const BasicBlock*> Edge; + 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<std::pair<BasicBlock*, BasicBlock*>, unsigned> EdgeCounts; + std::map<Edge, unsigned> EdgeCounts; public: static char ID; // Class identification, replacement for typeinfo virtual ~ProfileInfo(); // We want to be subclassed @@ -44,10 +49,13 @@ namespace llvm { //===------------------------------------------------------------------===// /// Profile Information Queries /// - unsigned getExecutionCount(BasicBlock *BB) const; + unsigned getExecutionCount(const Function *F) const; + + unsigned getExecutionCount(const BasicBlock *BB) const; - unsigned getEdgeWeight(BasicBlock *Src, BasicBlock *Dest) const { - std::map<std::pair<BasicBlock*, BasicBlock*>, unsigned>::const_iterator I= + 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; } diff --git a/llvm/lib/Analysis/ProfileInfo.cpp b/llvm/lib/Analysis/ProfileInfo.cpp index a0965b66da8..26328d073cf 100644 --- a/llvm/lib/Analysis/ProfileInfo.cpp +++ b/llvm/lib/Analysis/ProfileInfo.cpp @@ -26,8 +26,8 @@ char ProfileInfo::ID = 0; ProfileInfo::~ProfileInfo() {} -unsigned ProfileInfo::getExecutionCount(BasicBlock *BB) const { - pred_iterator PI = pred_begin(BB), PE = pred_end(BB); +unsigned ProfileInfo::getExecutionCount(const BasicBlock *BB) const { + pred_const_iterator PI = pred_begin(BB), PE = pred_end(BB); // Are there zero predecessors of this block? if (PI == PE) { @@ -49,23 +49,23 @@ unsigned ProfileInfo::getExecutionCount(BasicBlock *BB) const { // has a LARGE number of in-edges. Handle the common case of having only a // few in-edges with special code. // - BasicBlock *FirstPred = *PI; + const BasicBlock *FirstPred = *PI; unsigned Count = getEdgeWeight(FirstPred, BB); ++PI; if (PI == PE) return Count; // Quick exit for single predecessor blocks - BasicBlock *SecondPred = *PI; + const BasicBlock *SecondPred = *PI; if (SecondPred != FirstPred) Count += getEdgeWeight(SecondPred, BB); ++PI; if (PI == PE) return Count; // Quick exit for two predecessor blocks - BasicBlock *ThirdPred = *PI; + const BasicBlock *ThirdPred = *PI; if (ThirdPred != FirstPred && ThirdPred != SecondPred) Count += getEdgeWeight(ThirdPred, BB); ++PI; if (PI == PE) return Count; // Quick exit for three predecessor blocks - std::set<BasicBlock*> ProcessedPreds; + std::set<const BasicBlock*> ProcessedPreds; ProcessedPreds.insert(FirstPred); ProcessedPreds.insert(SecondPred); ProcessedPreds.insert(ThirdPred); @@ -75,6 +75,10 @@ unsigned ProfileInfo::getExecutionCount(BasicBlock *BB) const { return Count; } +unsigned ProfileInfo::getExecutionCount(const Function *F) const { + if (F->isDeclaration()) return -1; + return getExecutionCount(&F->getEntryBlock()); +} //===----------------------------------------------------------------------===// |