- // If we have block count information, print out the LLVM module with
- // frequency annotations.
- if (PIL.hasAccurateBlockCounts()) {
- std::vector<std::pair<BasicBlock*, unsigned> > Counts;
- PIL.getBlockCounts(Counts);
-
- TotalExecutions = 0;
- for (unsigned i = 0, e = Counts.size(); i != e; ++i)
- TotalExecutions += Counts[i].second;
-
- // Sort by the frequency, backwards.
- sort(Counts.begin(), Counts.end(),
- PairSecondSortReverse<BasicBlock*>());
-
- std::cout << "\n===" << std::string(73, '-') << "===\n";
- std::cout << "Top 20 most frequently executed basic blocks:\n\n";
-
- // Print out the function frequencies...
- std::cout <<" ## %% \tFrequency\n";
- unsigned BlocksToPrint = Counts.size();
- if (BlocksToPrint > 20) BlocksToPrint = 20;
- for (unsigned i = 0; i != BlocksToPrint; ++i) {
- 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)
- << Counts[i].second/(double)TotalExecutions*100 << "% "
- << std::setw(5) << Counts[i].second << "/"
- << TotalExecutions << "\t"
- << F->getName() << "() - "
- << Counts[i].first->getName() << "\n";
- FunctionsToPrint.insert(F);
- }