aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authortejohnson <tejohnson@138bc75d-0d04-0410-961f-82ee72b054a4>2012-12-02 16:40:28 +0000
committertejohnson <tejohnson@138bc75d-0d04-0410-961f-82ee72b054a4>2012-12-02 16:40:28 +0000
commit3672a36aeb5a2b2d7503b7c768de6e336ab3f9f6 (patch)
treece378886902417d4864119e07084c1c6bcc9de84 /gcc
parent44433d3b0feeabc2871f72d1edba81522eeb8c48 (diff)
2012-12-02 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@194055 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/lto-cgraph.c14
2 files changed, 15 insertions, 5 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index bada8f2acd1..6ba71f10a13 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2012-12-02 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.
+
2012-12-02 Steven Bosscher <steven@gcc.gnu.org>
* optabs.c (add_equal_note): Do not create self-referencing REG_EQUAL
diff --git a/gcc/lto-cgraph.c b/gcc/lto-cgraph.c
index 5feaf1abc7a..85b1ea4a5f3 100644
--- a/gcc/lto-cgraph.c
+++ b/gcc/lto-cgraph.c
@@ -1345,7 +1345,8 @@ merge_profile_summaries (struct lto_file_decl_data **file_data_vec)
/* 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 **file_data_vec)
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. */