On Tue, May 7, 2019 at 2:00 PM Martin Liška <mli...@suse.cz> wrote:
>
> On 5/6/19 4:02 PM, Richard Biener wrote:
> > On Mon, May 6, 2019 at 9:59 AM Martin Liška <mli...@suse.cz> wrote:
> >>
> >> On 5/2/19 2:31 PM, Richard Biener wrote:
> >>> On Mon, Apr 29, 2019 at 2:51 PM Martin Liška <mli...@suse.cz> wrote:
> >>>>
> >>>> On 4/26/19 3:18 PM, Richard Biener wrote:
> >>>>> On Wed, Apr 10, 2019 at 10:12 AM Martin Liška <mli...@suse.cz> wrote:
> >>>>>>
> >>>>>> On 4/9/19 3:19 PM, Jan Hubicka wrote:
> >>>>>>>> Hi.
> >>>>>>>>
> >>>>>>>> There's updated version that supports profile quality for both counts
> >>>>>>>> and probabilities. I'm wondering whether ENTRY and EXIT BBs needs to
> >>>>>>>> have set probability. Apparently, I haven't seen any verifier that
> >>>>>>>> would complain.
> >>>>>>>
> >>>>>>> Well, you do not need to define it but then several cases will
> >>>>>>> degenerate. In particular BB frequencies (for callgraph profile or
> >>>>>>> hot/cold decisions) are calculated as ratios of entry BB and given BB
> >>>>>>> count. If entry BB is undefined you will get those undefined and
> >>>>>>> heuristics will resort to conservative answers.
> >>>>>>>
> >>>>>>> I do not think we use exit block count.
> >>>>>>>
> >>>>>>> Honza
> >>>>>>>
> >>>>>>
> >>>>>> Thank you Honza for explanation. I'm sending version of the patch
> >>>>>> that supports entry BB count.
> >>>>>>
> >>>>>> I've been testing the patch right now.
> >>>>>
> >>>>> Can you move the GIMPLE/RTL FE specific data in c_declspecs to
> >>>>> a substructure accessed via indirection?  I guess enlarging that
> >>>>> isn't really what we should do.  You'd move gimple_or_rtl_pass
> >>>>> there and make that pointer one to a struct aux_fe_data
> >>>>> (lifetime managed by the respective RTL/GIMPLE FE, thus
> >>>>> to be freed there)?  Joseph, do you agree or is adding more
> >>>>> stuff to c_declspecs OK (I would guess it could be a few more
> >>>>> elements in the future).
> >>>>
> >>>> Let's wait here for Joseph.
> >>>
> >>> So looks like it won't matter so let's go with the current approach
> >>> for the moment.
> >>>
> >>>>>
> >>>>> -c_parser_gimple_parse_bb_spec (tree val, int *index)
> >>>>> +c_parser_gimple_parse_bb_spec (tree val, gimple_parser &parser,
> >>>>> +                              int *index, profile_probability 
> >>>>> *probablity)
> >>>>>  {
> >>>>>
> >>>>> so this will allow specifying probability in PHI node arguments.
> >>>>> I think we want to split this into the already existing part
> >>>>> and a c_parser_gimple_parse_bb_spec_with_edge_probability
> >>>>> to be used at edge sources.
> >>>>
> >>>> Yes, that's a good idea!
> >>>>
> >>>>>
> >>>>> +  if (cfun->curr_properties & PROP_cfg)
> >>>>> +    {
> >>>>> +      update_max_bb_count ();
> >>>>> +      set_hot_bb_threshold (hot_bb_threshold);
> >>>>> +      ENTRY_BLOCK_PTR_FOR_FN (cfun)->count = entry_bb_count;
> >>>>>
> >>>>> I guess the last one should be before update_max_bb_count ()?
> >>>>
> >>>> Same here.
> >>>>
> >>>>>
> >>>>> +    }
> >>>>>
> >>>>> +                 /* Parse profile: quality(value) */
> >>>>>                   else
> >>>>>                     {
> >>>>> -                     c_parser_error (parser, "unknown block 
> >>>>> specifier");
> >>>>> -                     return return_p;
> >>>>> +                     tree q;
> >>>>> +                     profile_quality quality;
> >>>>> +                     tree v = c_parser_peek_token (parser)->value;
> >>>>>
> >>>>> peek next token before the if/else and do
> >>>>>
> >>>>>    else if (!strcmp (...))
> >>>>>
> >>>>> as in the loop_header case.  I expected we can somehow share
> >>>>> parsing of profile quality and BB/edge count/frequency?  How's
> >>>>> the expected syntax btw, comments in the code should tell us.
> >>>>> I'm guessing it's quality-id '(' number ')' and thus it should be
> >>>>> really shareable between edge and BB count and also __GIMPLE
> >>>>> header parsing?  So parse_profile_quality should be
> >>>>> parse_profile () instead, resulting in a combined value
> >>>>> (we do use the same for edge/bb?).
> >>>>
> >>>> It's problematic, there are different error messages for count/frequency.
> >>>> Moreover call to parse_profile_quality in 
> >>>> c_parser_gimple_or_rtl_pass_list
> >>>> is a way how to test that next 'token' is a profile count.
> >>>
> >>> Who cares about error messages...  But sure, I'm just proposing to
> >>> merge testing for next token and actual parsing.
> >>
> >> After I've done removal of hot_bb_threshold parsing, there are just 2 
> >> usages
> >> of parse_profile_quality. I would like to leave it as it, not introducing 
> >> a wrappers.
> >>
> >>>
> >>>>>
> >>>>> +      else if (!strcmp (op, "hot_bb_threshold"))
> >>>>> +       {
> >>>>>
> >>>>> I'm not sure about this - it doesn't make sense to specify this
> >>>>> on a per-function base since it seems to control a global
> >>>>> variable (booo!)?
> >>>>
> >>>> Yep, shame on me!
> >>>>
> >>>>> Isn't this instead computed on-demand
> >>>>> based on profile_info->sum_max?
> >>>>
> >>>> No it's a global value shared among functions.
> >>>>
> >>>>> If not then I think
> >>>>> we need an alternate way of funneling in global state into
> >>>>> the GIMPLE FE.
> >>>>
> >>>> What about --param gimple-fe-hot-bb-threshold ?
> >>>
> >>> I thought about that, yes ...  in absence can it actually be
> >>> "computed"?
> >>
> >> Renamed to it.
> >>
> >> Patch can bootstrap on x86_64-linux-gnu and survives regression tests.
> >>
> >> Ready to be installed?
> >
> > @@ -470,7 +576,8 @@ c_parser_gimple_compound_statement (gimple_parser
> > &parser, gimple_seq *seq)
> >                 last_basic_block_for_fn (cfun) = index + 1;
> >               n_basic_blocks_for_fn (cfun)++;
> >               if (!parser.current_bb)
> > -               parser.push_edge (ENTRY_BLOCK, bb->index, EDGE_FALLTHRU);
> > +               parser.push_edge (ENTRY_BLOCK, bb->index, EDGE_FALLTHRU,
> > +                                 profile_probability::uninitialized ());
> >
> >               /* We leave the proper setting to fixup.  */
> >               struct loop *loop_father = loops_for_fn (cfun)->tree_root;
> >
> > the fallthru edge from ENTRY to the single-succ of ENTRY should have
> > 100% probability and be "known", no?  Or do we actually use uninitialized
> > for fallthru edges?
>
> Fixed by setting to ::always ().
>
> >
> > diff --git a/gcc/params.def b/gcc/params.def
> > index 3c9c5fc0f13..840b81f43cc 100644
> > --- a/gcc/params.def
> > +++ b/gcc/params.def
> > @@ -1414,6 +1414,12 @@ DEFPARAM(PARAM_LOOP_VERSIONING_MAX_OUTER_INSNS,
> >          " loops.",
> >          100, 0, 0)
> >
> > +DEFPARAM(PARAM_GIMPLE_FE_COMPUTED_HOT_BB_THRESHOLD,
> > +        "gimple-fe-computed-hot-bb-threshold",
> > +        "The number of executions of a basic block which is considered 
> > hot."
> > +        " The parameters is used only in GIMPLE FE.",
> > +        0, 0, 0)
> > +
> >  /*
> >
> >  Local variables:
> > diff --git a/gcc/predict.c b/gcc/predict.c
> > index b010c20ff7d..12a484a799a 100644
> > --- a/gcc/predict.c
> > +++ b/gcc/predict.c
> > @@ -132,8 +132,11 @@ get_hot_bb_threshold ()
> >  {
> >    if (min_count == -1)
> >      {
> > -      min_count
> > -       = profile_info->sum_max / PARAM_VALUE (HOT_BB_COUNT_FRACTION);
> > +      if (flag_gimple)
> > +       min_count = PARAM_VALUE (PARAM_GIMPLE_FE_COMPUTED_HOT_BB_THRESHOLD);
> > +      else
> > +       min_count
> > +         = profile_info->sum_max / PARAM_VALUE (HOT_BB_COUNT_FRACTION);
> >        if (dump_file)
> >         fprintf (dump_file, "Setting hotness threshold to %" PRId64 ".\n",
> >                  min_count);
> >
> > Ick.  I'd rather do this somewhere in the frontend where PARAM_VALUE
> > is initialized
> > via set_hot_bb_threshold.  Even redundantly for each parsed GIMPLE
> > function would
> > be OK and better IMHO.
>
> I've done that in c_parser_parse_gimple_body.
>
> >  That way you don't need get_current_hot_bb_threshold(?).
>
> We still want it for dump_function_to_file that prints the value in a comment.

But that can use the existing get_hot_bb_threshold since we never want
to dump -1 in case min_count was never initialized.

> >
> > OK with that changes.
> >
> > We need to think about switch stmt parsing where we currently have
> >
> >   switch (argc_2(D)) {default: L2; case 0: L0; case 1: L0; case 2: L1; }
> >
> >   __BB(3):
> > L0:
> >   a_4 = 0;
> >   goto __BB6;
> > ...
> >
> > extending this to
> >
> >  switch (argc_2(D)) { default: L2 (guessed(10)); ...
> >
> > might be possible so we have profile on the edges.
>
> I can work on that during this stage1.
>
> Martin
>
> >
> > After the patch all -gimple dumps have profile - probably good
> > but also visually disturbing.  Ah well.
> >
> > Hope to do loop flags as followup soon.
> >
> > Thanks,
> > Richard.
> >
> >> Thanks,
> >> Martin
> >>
> >>>
> >>> Richard.
> >>>
> >>>> Thanks,
> >>>> Martin
> >>>>
> >>>>>
> >>>>> Thanks,
> >>>>> Richard.
> >>>>>
> >>>>>
> >>>>>>
> >>>>>> Martin
> >>>>
> >>
>

Reply via email to