1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-10-20 03:23:01 +02:00

Cleaned up code by factoring out common portions of edge loading into funcion.

llvm-svn: 81358
This commit is contained in:
Andreas Neustifter 2009-09-09 17:51:39 +00:00
parent 2cbc3ef1e9
commit e97b505f2d

View File

@ -61,8 +61,8 @@ namespace {
// blocks as possbile.
virtual void recurseBasicBlock(const BasicBlock *BB);
virtual void readEdgeOrRemember(Edge, Edge&, unsigned &, unsigned &);
virtual void readOrRememberEdge(ProfileInfo::Edge, unsigned,
unsigned, Function*);
virtual unsigned readEdge(ProfileInfo::Edge, std::vector<unsigned>,
unsigned, Function*);
/// run - Load the profile information from the specified file.
virtual bool runOnModule(Module &M);
@ -156,15 +156,21 @@ void LoaderPass::recurseBasicBlock(const BasicBlock *BB) {
}
}
void LoaderPass::readOrRememberEdge(ProfileInfo::Edge e,
unsigned weight, unsigned ei,
Function *F) {
if (weight != ~0U) {
EdgeInformation[F][e] += weight;
DEBUG(errs()<<"--Read Edge Counter for " << e
<<" (# "<<ei<<"): "<<(unsigned)getEdgeWeight(e)<<"\n");
unsigned LoaderPass::readEdge(ProfileInfo::Edge e, std::vector<unsigned> ECs,
unsigned ei, Function *F) {
if (ei < ECs.size()) {
double weight = ECs[ei];
if (weight != ~0U) {
EdgeInformation[F][e] += weight;
DEBUG(errs()<<"--Read Edge Counter for " << e
<<" (# "<<ei<<"): "<<(unsigned)getEdgeWeight(e)<<"\n");
} else {
// This happens only when loading edges for optimal edge profiling.
SpanningTree.insert(e);
}
return ei++
} else {
SpanningTree.insert(e);
return ei;
}
}
@ -177,18 +183,15 @@ bool LoaderPass::runOnModule(Module &M) {
unsigned ei = 0;
for (Module::iterator F = M.begin(), E = M.end(); F != E; ++F) {
if (F->isDeclaration()) continue;
if (ei < ECs.size())
EdgeInformation[F][ProfileInfo::getEdge(0, &F->getEntryBlock())] +=
ECs[ei++];
DEBUG(errs()<<"Working on "<<F->getNameStr()<<"\n");
ei = readEdge(getEdge(0,&F->getEntryBlock()), ECs, ei, F);
for (Function::iterator BB = F->begin(), E = F->end(); BB != E; ++BB) {
// Okay, we have to add a counter of each outgoing edge. If the
// outgoing edge is not critical don't split it, just insert the counter
// in the source or destination of the edge.
TerminatorInst *TI = BB->getTerminator();
for (unsigned s = 0, e = TI->getNumSuccessors(); s != e; ++s) {
if (ei < ECs.size())
EdgeInformation[F][ProfileInfo::getEdge(BB, TI->getSuccessor(s))] +=
ECs[ei++];
ei = readEdge(getEdge(BB,TI->getSuccessor(s)), ECs, ei, F);
}
}
}
@ -205,22 +208,14 @@ bool LoaderPass::runOnModule(Module &M) {
for (Module::iterator F = M.begin(), E = M.end(); F != E; ++F) {
if (F->isDeclaration()) continue;
DEBUG(errs()<<"Working on "<<F->getNameStr()<<"\n");
if (ei < ECs.size()) {
readOrRememberEdge(getEdge(0,&F->getEntryBlock()), ECs[ei], ei, F);
ei++;
}
ei = readEdge(getEdge(0,&F->getEntryBlock()), ECs, ei, F);
for (Function::iterator BB = F->begin(), E = F->end(); BB != E; ++BB) {
TerminatorInst *TI = BB->getTerminator();
if (TI->getNumSuccessors() == 0) {
if (ei < ECs.size()) {
readOrRememberEdge(getEdge(BB,0), ECs[ei], ei, F); ei++;
}
ei = readEdge(getEdge(BB,0), ECs, ei, F);
}
for (unsigned s = 0, e = TI->getNumSuccessors(); s != e; ++s) {
if (ei < ECs.size()) {
readOrRememberEdge(getEdge(BB,TI->getSuccessor(s)), ECs[ei], ei, F);
ei++;
}
ei = readEdge(getEdge(BB,TI->getSuccessor(s)), ECs, ei, F);
}
}
while (SpanningTree.size() > 0) {