Hello! During performance tuning, it's useful to know if the static profile is accurate. This patch compares static profiles to instrumentation profiles, and uses "degree of overlap" to measure its accuracy. Degree of overlap is a number between 0 and 1, representing the correlation between two profiles, and 1 means two profiles are identical. This number is dumped if the instrumentation based profile is available and -fdump-ipa-profile is specified.
Ok for mainline? Thanks, Dehao 2011-09-20 Dehao Chen <de...@google.com> * profile.c (compute_branch_probabilities): Compute and dump the overlap between the static estimation and the instrumentation profile. (OVERLAP_BASE): New macro. (compute_frequency_overlap): New function Index: gcc/profile.c =================================================================== --- gcc/profile.c (revision 179073) +++ gcc/profile.c (working copy) @@ -437,6 +437,39 @@ read_profile_edge_counts (gcov_type *exe return num_edges; } +#define OVERLAP_BASE 10000 + +/* Compare the static estimated profile to the actual profile, and + return the "degree of overlap" measure between them. + + Degree of overlap is a number between 0 and OVERLAP_BASE. It is + the sum of each basic block's minimum relative weights between + two profiles. And overlap of OVERLAP_BASE means two profiles are + identical. */ + +static int +compute_frequency_overlap (void) +{ + gcov_type count_total = 0, freq_total = 0; + int overlap = 0; + basic_block bb; + + FOR_BB_BETWEEN (bb, ENTRY_BLOCK_PTR, NULL, next_bb) + { + count_total += bb->count; + freq_total += bb->frequency; + } + + if (count_total == 0 || freq_total == 0) + return 0; + + FOR_BB_BETWEEN (bb, ENTRY_BLOCK_PTR, NULL, next_bb) + overlap += MIN (bb->count * OVERLAP_BASE / count_total, + bb->frequency * OVERLAP_BASE / freq_total); + + return overlap; +} + /* Compute the branch probabilities for the various branches. Annotate them accordingly. @@ -607,7 +640,13 @@ compute_branch_probabilities (unsigned c } } if (dump_file) - dump_flow_info (dump_file, dump_flags); + { + int overlap = compute_frequency_overlap (); + dump_flow_info (dump_file, dump_flags); + fprintf (dump_file, "Static profile overlap: %d.%d%%\n", + overlap / (OVERLAP_BASE / 100), + overlap % (OVERLAP_BASE / 100)); + } total_num_passes += passes; if (dump_file)