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

login
register
mail settings
Submitter Rong Xu
Date Oct. 11, 2013, 9:10 p.m.
Message ID <CAF1bQ=Qne1ScX9q6w19nyVUGUEDKaFADY7gz46i3ox50LvLGfg@mail.gmail.com>
Download mbox | patch
Permalink /patch/282938/
State New
Headers show

Comments

Rong Xu - Oct. 11, 2013, 9:10 p.m.
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  <xur@google.com>

	* predict.c (tree_predict_by_opcode): Bump the 
        estimiated probability if builtin_expect expression is
        in loop exit test.
Xinliang David Li - Oct. 11, 2013, 9:26 p.m.
Why this 'percent += 4'  instead of taking the max?

David

On Fri, Oct 11, 2013 at 2:10 PM, Rong Xu <xur@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
Rong Xu - Oct. 11, 2013, 9:32 p.m.
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 <davidxl@google.com> wrote:
> Why this 'percent += 4'  instead of taking the max?
>
> David
>
> On Fri, Oct 11, 2013 at 2:10 PM, Rong Xu <xur@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
Xinliang David Li - Oct. 11, 2013, 9:41 p.m.
Should it be max + some_delta then?

David

On Fri, Oct 11, 2013 at 2:32 PM, Rong Xu <xur@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 <davidxl@google.com> wrote:
>> Why this 'percent += 4'  instead of taking the max?
>>
>> David
>>
>> On Fri, Oct 11, 2013 at 2:10 PM, Rong Xu <xur@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
Rong Xu - Oct. 11, 2013, 9:45 p.m.
ok. that makes sense.


On Fri, Oct 11, 2013 at 2:41 PM, Xinliang David Li <davidxl@google.com> wrote:
> Should it be max + some_delta then?
>
> David
>
> On Fri, Oct 11, 2013 at 2:32 PM, Rong Xu <xur@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 <davidxl@google.com> wrote:
>>> Why this 'percent += 4'  instead of taking the max?
>>>
>>> David
>>>
>>> On Fri, Oct 11, 2013 at 2:10 PM, Rong Xu <xur@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

Patch

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;