mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-15 07:34:33 +00:00
Make block and function count available via ProfileInfo.
- Part of optimal static profiling patch sequence by Andreas Neustifter. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@78247 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
b341577401
commit
c9008c5cc7
@ -42,6 +42,12 @@ namespace llvm {
|
||||
// BasicBlock to the entry block to indicate how many times the function was
|
||||
// entered.
|
||||
std::map<Edge, unsigned> EdgeCounts;
|
||||
|
||||
// BlockCounts - Count the number of times a block is executed.
|
||||
std::map<const BasicBlock*, unsigned> BlockCounts;
|
||||
|
||||
// FunctionCounts - Count the number of times a function is executed.
|
||||
std::map<const Function*, unsigned> FunctionCounts;
|
||||
public:
|
||||
static char ID; // Class identification, replacement for typeinfo
|
||||
virtual ~ProfileInfo(); // We want to be subclassed
|
||||
|
@ -27,6 +27,9 @@ char ProfileInfo::ID = 0;
|
||||
ProfileInfo::~ProfileInfo() {}
|
||||
|
||||
unsigned ProfileInfo::getExecutionCount(const BasicBlock *BB) const {
|
||||
if (BlockCounts.find(BB) != BlockCounts.end())
|
||||
return BlockCounts.find(BB)->second;
|
||||
|
||||
pred_const_iterator PI = pred_begin(BB), PE = pred_end(BB);
|
||||
|
||||
// Are there zero predecessors of this block?
|
||||
@ -76,7 +79,9 @@ unsigned ProfileInfo::getExecutionCount(const BasicBlock *BB) const {
|
||||
}
|
||||
|
||||
unsigned ProfileInfo::getExecutionCount(const Function *F) const {
|
||||
if (F->isDeclaration()) return -1;
|
||||
if (FunctionCounts.find(F) != FunctionCounts.end())
|
||||
return FunctionCounts.find(F)->second;
|
||||
|
||||
return getExecutionCount(&F->getEntryBlock());
|
||||
}
|
||||
|
||||
|
@ -72,21 +72,29 @@ bool LoaderPass::runOnModule(Module &M) {
|
||||
EdgeCounts.clear();
|
||||
|
||||
std::vector<unsigned> ECs = PIL.getRawEdgeCounts();
|
||||
std::vector<unsigned> BCs = PIL.getRawBlockCounts();
|
||||
std::vector<unsigned> FCs = PIL.getRawFunctionCounts();
|
||||
// Instrument all of the edges...
|
||||
unsigned i = 0;
|
||||
for (Module::iterator F = M.begin(), E = M.end(); F != E; ++F)
|
||||
unsigned ei = 0;
|
||||
unsigned bi = 0;
|
||||
unsigned fi = 0;
|
||||
for (Module::iterator F = M.begin(), E = M.end(); F != E; ++F) {
|
||||
if (F->isDeclaration()) continue;
|
||||
if (fi<FCs.size()) FunctionCounts[F] = FCs[fi++];
|
||||
for (Function::iterator BB = F->begin(), E = F->end(); BB != E; ++BB) {
|
||||
if (bi<BCs.size()) BlockCounts[BB] = BCs[bi++];
|
||||
// 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 (i < ECs.size())
|
||||
EdgeCounts[std::make_pair(BB, TI->getSuccessor(s))]+= ECs[i++];
|
||||
if (ei < ECs.size())
|
||||
EdgeCounts[std::make_pair(BB, TI->getSuccessor(s))]+= ECs[ei++];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (i != ECs.size()) {
|
||||
if (ei != ECs.size()) {
|
||||
cerr << "WARNING: profile information is inconsistent with "
|
||||
<< "the current program!\n";
|
||||
}
|
||||
|
@ -142,9 +142,8 @@ bool ProfileInfoPrinterPass::runOnModule(Module &M) {
|
||||
std::vector<std::pair<Function*, unsigned> > FunctionCounts;
|
||||
std::vector<std::pair<BasicBlock*, unsigned> > Counts;
|
||||
for (Module::iterator FI = M.begin(), FE = M.end(); FI != FE; ++FI) {
|
||||
unsigned w = PI.getExecutionCount(FI);
|
||||
if (w != (unsigned) -1)
|
||||
FunctionCounts.push_back(std::make_pair(FI,PI.getExecutionCount(FI)));
|
||||
if (FI->isDeclaration()) continue;
|
||||
FunctionCounts.push_back(std::make_pair(FI,PI.getExecutionCount(FI)));
|
||||
for (Function::iterator BB = FI->begin(), BBE = FI->end();
|
||||
BB != BBE; ++BB) {
|
||||
Counts.push_back(std::make_pair(BB,PI.getExecutionCount(BB)));
|
||||
@ -209,7 +208,7 @@ bool ProfileInfoPrinterPass::runOnModule(Module &M) {
|
||||
if (Counts[i].second == 0) break;
|
||||
Function *F = Counts[i].first->getParent();
|
||||
std::cout << std::setw(3) << i+1 << ". "
|
||||
<< std::setw(5) << std::setprecision(2)
|
||||
<< std::setw(5) << std::setprecision(3)
|
||||
<< Counts[i].second/(double)TotalExecutions*100 << "% "
|
||||
<< std::setw(5) << Counts[i].second << "/"
|
||||
<< TotalExecutions << "\t"
|
||||
|
Loading…
x
Reference in New Issue
Block a user