This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH] Fix PR gcov-profile/55551 (issue6868045)
- From: tejohnson at google dot com (Teresa Johnson)
- To: reply at codereview dot appspotmail dot com,hubicka at ucw dot cz,markus at trippelsdorf dot de,gcc-patches at gcc dot gnu dot org
- Date: Sat, 1 Dec 2012 23:10:38 -0800 (PST)
- Subject: [PATCH] Fix PR gcov-profile/55551 (issue6868045)
2012-12-01 Teresa Johnson <tejohnson@google.com>
PR gcov-profile/55551
* lto-cgraph.c (merge_profile_summaries): Handle scaled histogram
entries that map to the same index.
Index: lto-cgraph.c
===================================================================
--- lto-cgraph.c (revision 193999)
+++ lto-cgraph.c (working copy)
@@ -1345,7 +1345,8 @@ merge_profile_summaries (struct lto_file_decl_data
/* Save a pointer to the profile_info with the largest
scaled sum_all and the scale for use in merging the
histogram. */
- if (lto_gcov_summary.sum_all > saved_sum_all)
+ if (!saved_profile_info
+ || lto_gcov_summary.sum_all > saved_sum_all)
{
saved_profile_info = &file_data->profile_info;
saved_sum_all = lto_gcov_summary.sum_all;
@@ -1363,17 +1364,20 @@ merge_profile_summaries (struct lto_file_decl_data
above. Use that to find the new histogram index. */
int scaled_min = RDIV (saved_profile_info->histogram[h_ix].min_value
* saved_scale, REG_BR_PROB_BASE);
+ /* The new index may be shared with another scaled histogram entry,
+ so we need to account for a non-zero histogram entry at new_ix. */
unsigned new_ix = gcov_histo_index (scaled_min);
- lto_gcov_summary.histogram[new_ix].min_value = scaled_min;
+ lto_gcov_summary.histogram[new_ix].min_value
+ = MIN (lto_gcov_summary.histogram[new_ix].min_value, scaled_min);
/* Some of the scaled counter values would ostensibly need to be placed
into different (larger) histogram buckets, but we keep things simple
here and place the scaled cumulative counter value in the bucket
corresponding to the scaled minimum counter value. */
lto_gcov_summary.histogram[new_ix].cum_value
- = RDIV (saved_profile_info->histogram[h_ix].cum_value
- * saved_scale, REG_BR_PROB_BASE);
+ += RDIV (saved_profile_info->histogram[h_ix].cum_value
+ * saved_scale, REG_BR_PROB_BASE);
lto_gcov_summary.histogram[new_ix].num_counters
- = saved_profile_info->histogram[h_ix].num_counters;
+ += saved_profile_info->histogram[h_ix].num_counters;
}
/* Watch roundoff errors. */
--
This patch is available for review at 5