- // If we have block count information, print out the LLVM module with
- // frequency annotations.
- if (PI.hasAccurateBlockCounts()) {
- std::vector<std::pair<BasicBlock*, unsigned> > Counts;
- PI.getBlockCounts(Counts);
-
- TotalExecutions = 0;
- for (unsigned i = 0, e = Counts.size(); i != e; ++i)
- TotalExecutions += Counts[i].second;
-
- // Sort by the frequency, backwards.
- std::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...
- printf(" ## %%%% \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();
- printf("%3d. %5.2f%% %5u/%llu\t%s() - %s\n", i+1,
- Counts[i].second/(double)TotalExecutions*100,
- Counts[i].second, TotalExecutions,
- F->getName().c_str(), Counts[i].first->getName().c_str());
- FunctionsToPrint.insert(F);
- }
-
- BlockFreqs.insert(Counts.begin(), Counts.end());
- }