aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/llvm/Analysis/ProfileInfo.h9
-rw-r--r--lib/Analysis/ProfileEstimatorPass.cpp9
2 files changed, 15 insertions, 3 deletions
diff --git a/include/llvm/Analysis/ProfileInfo.h b/include/llvm/Analysis/ProfileInfo.h
index 16bfc1351c..94a8666850 100644
--- a/include/llvm/Analysis/ProfileInfo.h
+++ b/include/llvm/Analysis/ProfileInfo.h
@@ -63,8 +63,13 @@ namespace llvm {
// 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();
+ if (e.first) {
+ return e.first->getParent();
+ } else if (e.second) {
+ return e.second->getParent();
+ }
+ assert(0 && "Invalid ProfileInfo::Edge");
+ return (const Function*)0;
}
// getEdge() - Creates an Edge from two BasicBlocks.
diff --git a/lib/Analysis/ProfileEstimatorPass.cpp b/lib/Analysis/ProfileEstimatorPass.cpp
index 8f5313fda7..3af7eba94e 100644
--- a/lib/Analysis/ProfileEstimatorPass.cpp
+++ b/lib/Analysis/ProfileEstimatorPass.cpp
@@ -168,7 +168,14 @@ void ProfileEstimatorPass::recurseBasicBlock(BasicBlock *BB) {
std::set<BasicBlock*> ProcessedSuccs;
// Otherwise consider weight of outgoing edges and store them for
- // distribution of remaining weight.
+ // distribution of remaining weight. In case the block has no successors
+ // create a (BB,0) edge.
+ succ_iterator bbi = succ_begin(BB), bbe = succ_end(BB);
+ if (bbi == bbe) {
+ Edge edge = getEdge(BB,0);
+ EdgeInformation[BB->getParent()][edge] = BBWeight;
+ printEdgeWeight(edge);
+ }
for ( succ_iterator bbi = succ_begin(BB), bbe = succ_end(BB);
bbi != bbe; ++bbi ) {
if (ProcessedSuccs.insert(*bbi).second) {