> 
> gcc/ChangeLog:
> 
> 2018-04-24  Martin Liska  <mli...@suse.cz>
> 
>       * ipa-fnsummary.c (dump_ipa_call_summary): Use ::get method.
>       (analyze_function_body): Extract multiple calls of get_create.
>       * ipa-inline-analysis.c (simple_edge_hints): Likewise.
>       * ipa-inline.c (recursive_inlining): Use ::get method.
>       * ipa-inline.h (estimate_edge_growth): Likewise.
> ---
>  gcc/ipa-fnsummary.c       | 14 +++++++-------
>  gcc/ipa-inline-analysis.c |  2 +-
>  gcc/ipa-inline.c          |  8 ++++----
>  gcc/ipa-inline.h          |  7 +++----
>  4 files changed, 15 insertions(+), 16 deletions(-)
> 

> diff --git a/gcc/ipa-fnsummary.c b/gcc/ipa-fnsummary.c
> index 8a6c5d0b5d8..e40b537bf61 100644
> --- a/gcc/ipa-fnsummary.c
> +++ b/gcc/ipa-fnsummary.c
> @@ -850,7 +850,7 @@ dump_ipa_call_summary (FILE *f, int indent, struct 
> cgraph_node *node,
>         }
>        if (!edge->inline_failed)
>       {
> -       ipa_fn_summary *s = ipa_fn_summaries->get_create (callee);
> +       ipa_fn_summary *s = ipa_fn_summaries->get (callee);
>         fprintf (f, "%*sStack frame offset %i, callee self size %i,"
>                  " callee size %i\n",
>                  indent + 2, "",
> @@ -2363,10 +2363,9 @@ analyze_function_body (struct cgraph_node *node, bool 
> early)
>           }
>         free (body);
>       }
> -      set_hint_predicate (&ipa_fn_summaries->get_create 
> (node)->loop_iterations,
> -                       loop_iterations);
> -      set_hint_predicate (&ipa_fn_summaries->get_create (node)->loop_stride,
> -                       loop_stride);
> +      ipa_fn_summary *s = ipa_fn_summaries->get_create (node);
> +      set_hint_predicate (&s->loop_iterations, loop_iterations);
> +      set_hint_predicate (&s->loop_stride, loop_stride);

I think you already have pointer info initialized to ipa_fn_summaries->get 
(node), so just
replace all uses pf ipa_fn_summaries in this function by that. It seems like 
not very careful
transition (done pehraps by me :)

We may consider modifying our getters to make them pure for gcc so it will
optimize some of those issues for us.  That would require some code refactoring
as you have internal getter with bool parameter that also creates nodes (and
thus is no longer pure)
> diff --git a/gcc/ipa-inline-analysis.c b/gcc/ipa-inline-analysis.c
> index c4f904730e6..2e30a6d15ba 100644
> --- a/gcc/ipa-inline-analysis.c
> +++ b/gcc/ipa-inline-analysis.c
> @@ -126,7 +126,7 @@ simple_edge_hints (struct cgraph_edge *edge)
>                           ? edge->caller->global.inlined_to : edge->caller);
>    struct cgraph_node *callee = edge->callee->ultimate_alias_target ();
>    if (ipa_fn_summaries->get_create (to)->scc_no
> -      && ipa_fn_summaries->get_create (to)->scc_no
> +      && ipa_fn_summaries->get (to)->scc_no
>        == ipa_fn_summaries->get_create (callee)->scc_no

Please move ipa_fn_summaries->get_create (to)->scc_no out of the
conditional and store the result, so we don't need to call it multiple times.
I think it would be bug if summaries was not ready here, so it should be ->get
only.
> diff --git a/gcc/ipa-inline.h b/gcc/ipa-inline.h
> index e8ae206d7b7..06bd38e551e 100644
> --- a/gcc/ipa-inline.h
> +++ b/gcc/ipa-inline.h
> @@ -81,10 +81,9 @@ estimate_edge_size (struct cgraph_edge *edge)
>  static inline int
>  estimate_edge_growth (struct cgraph_edge *edge)
>  {
> -  gcc_checking_assert (ipa_call_summaries->get_create (edge)->call_stmt_size
> -                    || !edge->callee->analyzed);
> -  return (estimate_edge_size (edge)
> -       - ipa_call_summaries->get_create (edge)->call_stmt_size);
> +  ipa_call_summary *s = ipa_call_summaries->get_create (edge);
> +  gcc_checking_assert (s->call_stmt_size || !edge->callee->analyzed);
> +  return (estimate_edge_size (edge) - s->call_stmt_size);

Also if get_create ever created new summary here, it would not have right sizes,
so plase turn it into get here.

OK with those changes. (and if any of those trap, just add FIXME and we can 
deal with
it incrementally).

Honza

Reply via email to