summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/llvm/Analysis/ProfileInfo.h29
-rw-r--r--lib/Analysis/ProfileInfo.cpp6
2 files changed, 21 insertions, 14 deletions
diff --git a/include/llvm/Analysis/ProfileInfo.h b/include/llvm/Analysis/ProfileInfo.h
index 9b692515f3..6025e9f9fe 100644
--- a/include/llvm/Analysis/ProfileInfo.h
+++ b/include/llvm/Analysis/ProfileInfo.h
@@ -36,20 +36,21 @@ namespace llvm {
public:
// Types for handling profiling information.
typedef std::pair<const BasicBlock*, const BasicBlock*> Edge;
- typedef std::map<Edge, double> EdgeCounts;
+ typedef std::pair<Edge, double> EdgeWeight;
+ typedef std::map<Edge, double> EdgeWeights;
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<const Function*, EdgeCounts> EdgeInformation;
+ // EdgeInformation - 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<const Function*, EdgeWeights> EdgeInformation;
- // BlockCounts - Count the number of times a block is executed.
+ // BlockInformation - Count the number of times a block is executed.
std::map<const Function*, BlockCounts> BlockInformation;
- // FunctionCounts - Count the number of times a function is executed.
+ // FunctionInformation - Count the number of times a function is executed.
std::map<const Function*, double> FunctionInformation;
public:
static char ID; // Class identification, replacement for typeinfo
@@ -57,7 +58,7 @@ namespace llvm {
// MissingValue - The value that is returned for execution counts in case
// no value is available.
- static const int MissingValue = -1;
+ static const double MissingValue;
// getFunction() - Returns the Function for an Edge, checking for validity.
static const Function* getFunction(Edge e) {
@@ -66,7 +67,7 @@ namespace llvm {
}
// getEdge() - Creates an Edge from two BasicBlocks.
- static Edge getEdge(const BasicBlock* Src, const BasicBlock* Dest) {
+ static Edge getEdge(const BasicBlock *Src, const BasicBlock *Dest) {
return std::make_pair(Src, Dest);
}
@@ -78,16 +79,20 @@ namespace llvm {
double getExecutionCount(const BasicBlock *BB);
double getEdgeWeight(Edge e) const {
- std::map<const Function*, EdgeCounts>::const_iterator J =
+ std::map<const Function*, EdgeWeights>::const_iterator J =
EdgeInformation.find(getFunction(e));
if (J == EdgeInformation.end()) return MissingValue;
- EdgeCounts::const_iterator I = J->second.find(e);
+ EdgeWeights::const_iterator I = J->second.find(e);
if (I == J->second.end()) return MissingValue;
return I->second;
}
+ EdgeWeights &getEdgeWeights (const Function *F) {
+ return EdgeInformation[F];
+ }
+
//===------------------------------------------------------------------===//
/// Analysis Update Methods
///
diff --git a/lib/Analysis/ProfileInfo.cpp b/lib/Analysis/ProfileInfo.cpp
index 98ea25199b..a7fc4c49d5 100644
--- a/lib/Analysis/ProfileInfo.cpp
+++ b/lib/Analysis/ProfileInfo.cpp
@@ -26,6 +26,8 @@ char ProfileInfo::ID = 0;
ProfileInfo::~ProfileInfo() {}
+const double ProfileInfo::MissingValue = -1;
+
double ProfileInfo::getExecutionCount(const BasicBlock *BB) {
std::map<const Function*, BlockCounts>::iterator J =
BlockInformation.find(BB->getParent());
@@ -60,7 +62,7 @@ double ProfileInfo::getExecutionCount(const BasicBlock *BB) {
Count += w;
}
- BlockInformation[BB->getParent()][BB] = Count;
+ if (Count != MissingValue) BlockInformation[BB->getParent()][BB] = Count;
return Count;
}
@@ -72,7 +74,7 @@ double ProfileInfo::getExecutionCount(const Function *F) {
return J->second;
double Count = getExecutionCount(&F->getEntryBlock());
- FunctionInformation[F] = Count;
+ if (Count != MissingValue) FunctionInformation[F] = Count;
return Count;
}