Use ProfileInfo-API in ProfileInfo Loader and do more assertions.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@90446 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Andreas Neustifter 2009-12-03 11:00:37 +00:00
parent e2baf6b455
commit 44299c9507
2 changed files with 11 additions and 46 deletions

View File

@ -92,6 +92,7 @@ namespace llvm {
// file.
//
ModulePass *createProfileLoaderPass();
extern const PassInfo *ProfileLoaderPassID;
//===--------------------------------------------------------------------===//
//

View File

@ -74,6 +74,8 @@ X("profile-loader", "Load profile information from llvmprof.out", false, true);
static RegisterAnalysisGroup<ProfileInfo> Y(X);
const PassInfo *llvm::ProfileLoaderPassID = &X;
ModulePass *llvm::createProfileLoaderPass() { return new LoaderPass(); }
/// createProfileLoaderPass - This function returns a Pass that loads the
@ -112,46 +114,9 @@ void LoaderPass::recurseBasicBlock(const BasicBlock *BB) {
recurseBasicBlock(*bbi);
}
Edge edgetocalc;
unsigned uncalculated = 0;
// collect weights of all incoming and outgoing edges, rememer edges that
// have no value
double incount = 0;
SmallSet<const BasicBlock*,8> pred_visited;
pred_const_iterator bbi = pred_begin(BB), bbe = pred_end(BB);
if (bbi==bbe) {
readEdgeOrRemember(getEdge(0, BB),edgetocalc,uncalculated,incount);
}
for (;bbi != bbe; ++bbi) {
if (pred_visited.insert(*bbi)) {
readEdgeOrRemember(getEdge(*bbi, BB),edgetocalc,uncalculated,incount);
}
}
double outcount = 0;
SmallSet<const BasicBlock*,8> succ_visited;
succ_const_iterator sbbi = succ_begin(BB), sbbe = succ_end(BB);
if (sbbi==sbbe) {
readEdgeOrRemember(getEdge(BB, 0),edgetocalc,uncalculated,outcount);
}
for (;sbbi != sbbe; ++sbbi) {
if (succ_visited.insert(*sbbi)) {
readEdgeOrRemember(getEdge(BB, *sbbi),edgetocalc,uncalculated,outcount);
}
}
// if exactly one edge weight was missing, calculate it and remove it from
// spanning tree
if (uncalculated == 1) {
if (incount < outcount) {
EdgeInformation[BB->getParent()][edgetocalc] = outcount-incount;
} else {
EdgeInformation[BB->getParent()][edgetocalc] = incount-outcount;
}
DEBUG(errs() << "--Calc Edge Counter for " << edgetocalc << ": "
<< format("%g", getEdgeWeight(edgetocalc)) << "\n");
SpanningTree.erase(edgetocalc);
Edge tocalc;
if (CalculateMissingEdge(BB, tocalc)) {
SpanningTree.erase(tocalc);
}
}
@ -219,9 +184,9 @@ bool LoaderPass::runOnModule(Module &M) {
}
}
while (SpanningTree.size() > 0) {
#if 0
unsigned size = SpanningTree.size();
#endif
BBisUnvisited.clear();
for (std::set<Edge>::iterator ei = SpanningTree.begin(),
ee = SpanningTree.end(); ei != ee; ++ei) {
@ -231,17 +196,16 @@ bool LoaderPass::runOnModule(Module &M) {
while (BBisUnvisited.size() > 0) {
recurseBasicBlock(*BBisUnvisited.begin());
}
#if 0
if (SpanningTree.size() == size) {
DEBUG(errs()<<"{");
for (std::set<Edge>::iterator ei = SpanningTree.begin(),
ee = SpanningTree.end(); ei != ee; ++ei) {
DEBUG(errs()<<"("<<(ei->first?ei->first->getName():"0")<<","
<<(ei->second?ei->second->getName():"0")<<"),");
DEBUG(errs()<< *ei <<",");
}
assert(0 && "No edge calculated!");
}
#endif
}
}
if (ReadCount != Counters.size()) {