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).

-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.

+  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 ()?

+    }

+                 /* 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?).

+      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!)?  Isn't this instead computed on-demand
based on profile_info->sum_max?  If not then I think
we need an alternate way of funneling in global state into
the GIMPLE FE.

Thanks,
Richard.


>
> Martin

Reply via email to