[google gcc-4_8] increase builtin_expect probability in loop exit test

2013-10-11 Thread Rong Xu
The trunk version of this patch is submitted for review.

David: can we have this patch for google/gcc-4_8 branch first?
It tested with regression and google internal benchmarks.

Thanks,

-Rong
2013-10-11  Rong Xu  x...@google.com

* predict.c (tree_predict_by_opcode): Bump the 
estimiated probability if builtin_expect expression is
in loop exit test.

Index: predict.c
===
--- predict.c   (revision 203462)
+++ predict.c   (working copy)
@@ -1951,7 +1951,31 @@ tree_predict_by_opcode (basic_block bb)
   if (val)
 {
   int percent = PARAM_VALUE (BUILTIN_EXPECT_PROBABILITY);
+  void **preds;
 
+  /* This handles the cases like
+   while (__builtin_expect (exp, 1)) { ... }
+ W/o builtin_expect, the default HITRATE is 91%.
+It does not make sense to estimate a lower probability of 90%
+(current default for builtin_expect) with the annotation.
+So here, we bump the probability by a small amount.  */
+  preds = pointer_map_contains (bb_predictions, bb);
+  if (preds)
+{
+  struct edge_prediction *pred;
+
+  for (pred = (struct edge_prediction *) *preds; pred;
+  pred = pred-ep_next)
+   {
+ if (pred-ep_predictor == PRED_LOOP_EXIT
+  predictor_info [(int) PRED_LOOP_EXIT].hitrate
+ HITRATE (percent))
+   percent += 4;
+ if (percent  100)
+   percent = 100;
+   }
+   }
+
   gcc_assert (percent = 0  percent = 100);
   if (integer_zerop (val))
 percent = 100 - percent;


Re: [google gcc-4_8] increase builtin_expect probability in loop exit test

2013-10-11 Thread Xinliang David Li
Why this 'percent += 4'  instead of taking the max?

David

On Fri, Oct 11, 2013 at 2:10 PM, Rong Xu x...@google.com wrote:
 The trunk version of this patch is submitted for review.

 David: can we have this patch for google/gcc-4_8 branch first?
 It tested with regression and google internal benchmarks.

 Thanks,

 -Rong


Re: [google gcc-4_8] increase builtin_expect probability in loop exit test

2013-10-11 Thread Rong Xu
I want to differentiate the cases w/o and w/ builtin.
If I take the max, they will be the same (91%).

-Rong

On Fri, Oct 11, 2013 at 2:26 PM, Xinliang David Li davi...@google.com wrote:
 Why this 'percent += 4'  instead of taking the max?

 David

 On Fri, Oct 11, 2013 at 2:10 PM, Rong Xu x...@google.com wrote:
 The trunk version of this patch is submitted for review.

 David: can we have this patch for google/gcc-4_8 branch first?
 It tested with regression and google internal benchmarks.

 Thanks,

 -Rong


Re: [google gcc-4_8] increase builtin_expect probability in loop exit test

2013-10-11 Thread Xinliang David Li
Should it be max + some_delta then?

David

On Fri, Oct 11, 2013 at 2:32 PM, Rong Xu x...@google.com wrote:
 I want to differentiate the cases w/o and w/ builtin.
 If I take the max, they will be the same (91%).

 -Rong

 On Fri, Oct 11, 2013 at 2:26 PM, Xinliang David Li davi...@google.com wrote:
 Why this 'percent += 4'  instead of taking the max?

 David

 On Fri, Oct 11, 2013 at 2:10 PM, Rong Xu x...@google.com wrote:
 The trunk version of this patch is submitted for review.

 David: can we have this patch for google/gcc-4_8 branch first?
 It tested with regression and google internal benchmarks.

 Thanks,

 -Rong


Re: [google gcc-4_8] increase builtin_expect probability in loop exit test

2013-10-11 Thread Rong Xu
ok. that makes sense.


On Fri, Oct 11, 2013 at 2:41 PM, Xinliang David Li davi...@google.com wrote:
 Should it be max + some_delta then?

 David

 On Fri, Oct 11, 2013 at 2:32 PM, Rong Xu x...@google.com wrote:
 I want to differentiate the cases w/o and w/ builtin.
 If I take the max, they will be the same (91%).

 -Rong

 On Fri, Oct 11, 2013 at 2:26 PM, Xinliang David Li davi...@google.com 
 wrote:
 Why this 'percent += 4'  instead of taking the max?

 David

 On Fri, Oct 11, 2013 at 2:10 PM, Rong Xu x...@google.com wrote:
 The trunk version of this patch is submitted for review.

 David: can we have this patch for google/gcc-4_8 branch first?
 It tested with regression and google internal benchmarks.

 Thanks,

 -Rong


Re: [google gcc-4_8] increase builtin_expect probability in loop exit test

2013-10-11 Thread Rong Xu
here is the new patch. Note that the hitrate won't change by this
patch for the case of
  while (__builtin_expect (exp, 0))

Index: predict.c
===
--- predict.c   (revision 203462)
+++ predict.c   (working copy)
@@ -1951,11 +1951,42 @@ tree_predict_by_opcode (basic_block bb)
   if (val)
 {
   int percent = PARAM_VALUE (BUILTIN_EXPECT_PROBABILITY);
+  int hitrate;

   gcc_assert (percent = 0  percent = 100);
   if (integer_zerop (val))
-percent = 100 - percent;
-  predict_edge (then_edge, PRED_BUILTIN_EXPECT, HITRATE (percent));
+hitrate = HITRATE (100 - percent);
+  else
+{
+  /* This handles the cases like
+   while (__builtin_expect (exp, 1)) { ... }
+ W/o builtin_expect, the default HITRATE is 91%.
+ It does not make sense to estimate a lower probability of 90%
+ (current default for builtin_expect) with the annotation.
+ So here, we bump the probability by a small amount.  */
+  void **preds = pointer_map_contains (bb_predictions, bb);
+
+  hitrate = HITRATE (percent);
+  if (preds)
+{
+  struct edge_prediction *pred;
+  int exit_hitrate = predictor_info [(int) PRED_LOOP_EXIT].hitrate;
+
+  for (pred = (struct edge_prediction *) *preds; pred;
+   pred = pred-ep_next)
+{
+  if (pred-ep_predictor == PRED_LOOP_EXIT
+   exit_hitrate  hitrate)
+{
+  hitrate = exit_hitrate + HITRATE (4);
+  if (hitrate  REG_BR_PROB_BASE)
+hitrate = REG_BR_PROB_BASE;
+  break;
+}
+}
+}
+}
+  predict_edge (then_edge, PRED_BUILTIN_EXPECT, hitrate);
 }
   /* Try pointer heuristic.
  A comparison ptr == 0 is predicted as false.

On Fri, Oct 11, 2013 at 2:45 PM, Rong Xu x...@google.com wrote:
 ok. that makes sense.


 On Fri, Oct 11, 2013 at 2:41 PM, Xinliang David Li davi...@google.com wrote:
 Should it be max + some_delta then?

 David

 On Fri, Oct 11, 2013 at 2:32 PM, Rong Xu x...@google.com wrote:
 I want to differentiate the cases w/o and w/ builtin.
 If I take the max, they will be the same (91%).

 -Rong

 On Fri, Oct 11, 2013 at 2:26 PM, Xinliang David Li davi...@google.com 
 wrote:
 Why this 'percent += 4'  instead of taking the max?

 David

 On Fri, Oct 11, 2013 at 2:10 PM, Rong Xu x...@google.com wrote:
 The trunk version of this patch is submitted for review.

 David: can we have this patch for google/gcc-4_8 branch first?
 It tested with regression and google internal benchmarks.

 Thanks,

 -Rong


Re: [google gcc-4_8] increase builtin_expect probability in loop exit test

2013-10-11 Thread Xinliang David Li
ok for google branch.

David

On Fri, Oct 11, 2013 at 3:17 PM, Rong Xu x...@google.com wrote:
 here is the new patch. Note that the hitrate won't change by this
 patch for the case of
   while (__builtin_expect (exp, 0))

 Index: predict.c
 ===
 --- predict.c   (revision 203462)
 +++ predict.c   (working copy)
 @@ -1951,11 +1951,42 @@ tree_predict_by_opcode (basic_block bb)
if (val)
  {
int percent = PARAM_VALUE (BUILTIN_EXPECT_PROBABILITY);
 +  int hitrate;

gcc_assert (percent = 0  percent = 100);
if (integer_zerop (val))
 -percent = 100 - percent;
 -  predict_edge (then_edge, PRED_BUILTIN_EXPECT, HITRATE (percent));
 +hitrate = HITRATE (100 - percent);
 +  else
 +{
 +  /* This handles the cases like
 +   while (__builtin_expect (exp, 1)) { ... }
 + W/o builtin_expect, the default HITRATE is 91%.
 + It does not make sense to estimate a lower probability of 90%
 + (current default for builtin_expect) with the annotation.
 + So here, we bump the probability by a small amount.  */
 +  void **preds = pointer_map_contains (bb_predictions, bb);
 +
 +  hitrate = HITRATE (percent);
 +  if (preds)
 +{
 +  struct edge_prediction *pred;
 +  int exit_hitrate = predictor_info [(int) 
 PRED_LOOP_EXIT].hitrate;
 +
 +  for (pred = (struct edge_prediction *) *preds; pred;
 +   pred = pred-ep_next)
 +{
 +  if (pred-ep_predictor == PRED_LOOP_EXIT
 +   exit_hitrate  hitrate)
 +{
 +  hitrate = exit_hitrate + HITRATE (4);
 +  if (hitrate  REG_BR_PROB_BASE)
 +hitrate = REG_BR_PROB_BASE;
 +  break;
 +}
 +}
 +}
 +}
 +  predict_edge (then_edge, PRED_BUILTIN_EXPECT, hitrate);
  }
/* Try pointer heuristic.
   A comparison ptr == 0 is predicted as false.

 On Fri, Oct 11, 2013 at 2:45 PM, Rong Xu x...@google.com wrote:
 ok. that makes sense.


 On Fri, Oct 11, 2013 at 2:41 PM, Xinliang David Li davi...@google.com 
 wrote:
 Should it be max + some_delta then?

 David

 On Fri, Oct 11, 2013 at 2:32 PM, Rong Xu x...@google.com wrote:
 I want to differentiate the cases w/o and w/ builtin.
 If I take the max, they will be the same (91%).

 -Rong

 On Fri, Oct 11, 2013 at 2:26 PM, Xinliang David Li davi...@google.com 
 wrote:
 Why this 'percent += 4'  instead of taking the max?

 David

 On Fri, Oct 11, 2013 at 2:10 PM, Rong Xu x...@google.com wrote:
 The trunk version of this patch is submitted for review.

 David: can we have this patch for google/gcc-4_8 branch first?
 It tested with regression and google internal benchmarks.

 Thanks,

 -Rong