[google] [4.6] fix a bug in capping bb count scaling (issue5786054)

2012-03-08 Thread Rong Xu
Hi,

This patch is for google-4_6 branch only.

It fixes a bug in r184378 which makes some capping escape (like
stale max_bb_count in cgraph node).

Tested with the internal benchmark that exposes this issue.
Tested with gcc bootstrap.

-Rong

2012-03-08   Rong Xu  x...@google.com

* gcc/tree-inline.c (copy_cfg_body): fix the bug in r184378.
  Google ref b/6105259.

Index: gcc/tree-inline.c
===
--- gcc/tree-inline.c   (revision 185095)
+++ gcc/tree-inline.c   (working copy)
@@ -2210,7 +2210,7 @@
   struct cgraph_node *node = cgraph_node (callee_fndecl);
   double f_max;
   gcov_type max_count_scale;
-  gcov_type max_src_bb_cnt;
+  gcov_type max_src_bb_cnt = 0;
   gcov_type max_value = ((gcov_type) 1  ((sizeof(gcov_type) * 8) - 1));
   max_value = ~max_value;
   count_scale = (REG_BR_PROB_BASE * (double)count
@@ -2220,14 +2220,13 @@
  This can happen for comdat functions where the counters are split.
  It's more likely for recursive inlines.  */
   gcc_assert (node);
-  max_src_bb_cnt = node-max_bb_count;
 
   /* Find the maximum count value to that will be copied.  */
   FOR_EACH_BB_FN (bb, cfun_to_copy)
 if (!blocks_to_copy || bitmap_bit_p (blocks_to_copy, bb-index))
   {
-if (bb-count  node-max_bb_count)
-  max_src_bb_cnt = node-max_bb_count;
+if (bb-count  max_src_bb_cnt)
+  max_src_bb_cnt = bb-count;
   }
 
   f_max = (double) max_value * REG_BR_PROB_BASE / max_src_bb_cnt - 1;

--
This patch is available for review at http://codereview.appspot.com/5786054


Re: [google] [4.6] fix a bug in capping bb count scaling (issue5786054)

2012-03-08 Thread Xinliang David Li
ok.

David

On Thu, Mar 8, 2012 at 10:04 AM, Rong Xu x...@google.com wrote:
 Hi,

 This patch is for google-4_6 branch only.

 It fixes a bug in r184378 which makes some capping escape (like
 stale max_bb_count in cgraph node).

 Tested with the internal benchmark that exposes this issue.
 Tested with gcc bootstrap.

 -Rong

 2012-03-08   Rong Xu  x...@google.com

        * gcc/tree-inline.c (copy_cfg_body): fix the bug in r184378.
          Google ref b/6105259.

 Index: gcc/tree-inline.c
 ===
 --- gcc/tree-inline.c   (revision 185095)
 +++ gcc/tree-inline.c   (working copy)
 @@ -2210,7 +2210,7 @@
       struct cgraph_node *node = cgraph_node (callee_fndecl);
       double f_max;
       gcov_type max_count_scale;
 -      gcov_type max_src_bb_cnt;
 +      gcov_type max_src_bb_cnt = 0;
       gcov_type max_value = ((gcov_type) 1  ((sizeof(gcov_type) * 8) - 1));
       max_value = ~max_value;
       count_scale = (REG_BR_PROB_BASE * (double)count
 @@ -2220,14 +2220,13 @@
          This can happen for comdat functions where the counters are split.
          It's more likely for recursive inlines.  */
       gcc_assert (node);
 -      max_src_bb_cnt = node-max_bb_count;

       /* Find the maximum count value to that will be copied.  */
       FOR_EACH_BB_FN (bb, cfun_to_copy)
         if (!blocks_to_copy || bitmap_bit_p (blocks_to_copy, bb-index))
           {
 -            if (bb-count  node-max_bb_count)
 -              max_src_bb_cnt = node-max_bb_count;
 +            if (bb-count  max_src_bb_cnt)
 +              max_src_bb_cnt = bb-count;
           }

       f_max = (double) max_value * REG_BR_PROB_BASE / max_src_bb_cnt - 1;

 --
 This patch is available for review at http://codereview.appspot.com/5786054