[GOOGLE] Unrestrict early inline restrictions for AutoFDO

Xinliang David Li davidxl@google.com
Mon Jun 3 04:08:00 GMT 2013


If the purpose of the fix is to filter early inlinings with code
growth in autoFDO, the proposed fix is the wrong way to do -- it
changes the meaning of cgraph_maybe_hot_edge_p.

David

On Sun, Jun 2, 2013 at 7:25 PM, Dehao Chen <dehao@google.com> wrote:
> On Sun, Jun 2, 2013 at 7:14 PM, Xinliang David Li <davidxl@google.com> wrote:
>>
>> auto profile info is not available yet in early inlining, why would
>> this change make any difference?
>
> Because the check of PARAM_EARLY_INLINING_INSNS is after the check of
> cgraph_maybe_hot_edge_p in early inline. If
> cgraph_maybe_hot_edge_p fails, the early inline will not happen even
> if growth is less than PARAM_EARLY_INLINING_INSNS.
>
>>
>> Can you just reset the max_iters to a
>> higher value for autoFDO?
>
> We could do that, but it could still lead to some code bloat because
> recursive inlines can happen for at most, say 10, iterations.
>
> Dehao
>
>>
>> David
>>
>> On Sun, Jun 2, 2013 at 6:21 PM, Dehao Chen <dehao@google.com> wrote:
>> > The patch was committed to google-4_8, but it causes problem because
>> > einline sets PARAM_EARLY_INLINING_INSNS = 11. This will cause
>> > recursive inlining at einline stage (e.g. main->foo, foo->bar,
>> > bar->foo) when autofdo is enabled.
>> >
>> > The following patch can fix the problem by doing more targetted early inlining:
>> >
>> > Index: gcc/predict.c
>> > ===================================================================
>> > --- gcc/predict.c (revision 199593)
>> > +++ gcc/predict.c (working copy)
>> > @@ -175,6 +175,8 @@ cgraph_maybe_hot_edge_p (struct cgraph_edge *edge)
>> >        && !maybe_hot_count_p (NULL,
>> >                               edge->count))
>> >      return false;
>> > +  if (flag_auto_profile)
>> > +    return false;
>> >    if (edge->caller->frequency == NODE_FREQUENCY_UNLIKELY_EXECUTED
>> >        || (edge->callee
>> >    && edge->callee->frequency == NODE_FREQUENCY_UNLIKELY_EXECUTED))
>> >
>> > Performance testing on-going...
>> >
>> > Dehao
>> >
>> > On Wed, May 29, 2013 at 3:44 PM, Dehao Chen <dehao@google.com> wrote:
>> >> OK, I'll commit the early inline part.
>> >>
>> >> Dehao
>> >>
>> >> On Wed, May 29, 2013 at 10:00 AM, Xinliang David Li <davidxl@google.com> wrote:
>> >>> The early inlining part is ok. The tracer optimization should be
>> >>> revisited -- we should have more fine grain control on it (for
>> >>> instance, based on FDO summary -- but that should be common to
>> >>> FDO/LIPO).
>> >>>
>> >>> David
>> >>>
>> >>> On Wed, May 29, 2013 at 9:39 AM, Dehao Chen <dehao@google.com> wrote:
>> >>>> In gcc4-8, the max einline iterations are restricted to 1. For
>> >>>> AutoFDO, this is bad because early inline is not size restricted. This
>> >>>> patch allows einline to do multiple iterations in AutoFDO. It also
>> >>>> enables tracer optimization in AutoFDO.
>> >>>>
>> >>>> Bootstrapped and passed regression test.
>> >>>>
>> >>>> OK for googel-4_8?
>> >>>>
>> >>>> Thanks,
>> >>>> Dehao
>> >>>>
>> >>>> Index: gcc/ipa-inline.c
>> >>>> ===================================================================
>> >>>> --- gcc/ipa-inline.c (revision 199416)
>> >>>> +++ gcc/ipa-inline.c (working copy)
>> >>>> @@ -2161,7 +2161,8 @@ early_inliner (void)
>> >>>>      {
>> >>>>        /* We iterate incremental inlining to get trivial cases of indirect
>> >>>>   inlining.  */
>> >>>> -      while (iterations < PARAM_VALUE (PARAM_EARLY_INLINER_MAX_ITERATIONS)
>> >>>> +      while ((flag_auto_profile
>> >>>> +      || iterations < PARAM_VALUE (PARAM_EARLY_INLINER_MAX_ITERATIONS))
>> >>>>       && early_inline_small_functions (node))
>> >>>>   {
>> >>>>    timevar_push (TV_INTEGRATION);
>> >>>> Index: gcc/opts.c
>> >>>> ===================================================================
>> >>>> --- gcc/opts.c (revision 199416)
>> >>>> +++ gcc/opts.c (working copy)
>> >>>> @@ -1644,6 +1644,8 @@ common_handle_option (struct gcc_options *opts,
>> >>>>   opts->x_flag_peel_loops = value;
>> >>>>        if (!opts_set->x_flag_value_profile_transformations)
>> >>>>   opts->x_flag_value_profile_transformations = value;
>> >>>> +      if (!opts_set->x_flag_tracer)
>> >>>> + opts->x_flag_tracer = value;
>> >>>>        if (!opts_set->x_flag_inline_functions)
>> >>>>   opts->x_flag_inline_functions = value;
>> >>>>        if (!opts_set->x_flag_ipa_cp)



More information about the Gcc-patches mailing list