re PR gcov-profile/55551 (Revision 193999 breaks lto/profiledbootstrap)
authorTeresa Johnson <tejohnson@google.com>
Sun, 2 Dec 2012 16:40:28 +0000 (16:40 +0000)
committerTeresa Johnson <tejohnson@gcc.gnu.org>
Sun, 2 Dec 2012 16:40:28 +0000 (16:40 +0000)
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.

From-SVN: r194055

gcc/ChangeLog
gcc/lto-cgraph.c

index bada8f2acd19c8647c1538013438c41f0277b6fc..6ba71f10a137cdfe226934be040f16a5419a27dc 100644 (file)
@@ -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
index 5feaf1abc7ab8601737390c9cf4a9c87c5a9d467..85b1ea4a5f3b5d3f375cb95cac7f8bdf86cda760 100644 (file)
@@ -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.  */