On 11/14/2014 05:06 PM, Jan Hubicka wrote:

In a way I would like to see these to be methods of the underlying type rather 
than
virtual methods of the summary, becuase these are operations on the data 
themselves.
I was thinking to model these by specual constructor and copy constructor
(taking the extra node pointer parameters) and standard destructor.  I am not 
sure this
would be more understandable this way?

Motivation for this implementation is:
a) it's useful to have an access to cgraph_node that is associated with a sumary

Yep, one would have node addition
  ctor (symtab_node *); (or cgraph/varpool nodes for cgraph/varpool annotations)
that would default to ctor for implementations that do not care about node.
And node duplication ctor
  ctor (summary &, symtab_node *, symtab_node *)
that would default to copy constructor for data that do not need to be copied.

Hello.

I have no problem with such construction and destruction, we can also provide
base implementation.

I would say that main advantage (in addition to have a way to provide resonable
defaults) is to make ctors/dtors of the embedded classes working well, so one 
can
for example embedd pointer_map and not care about its construction/destruction.

b) with GTY, we cannot call destructor

Everything in symbol table is expecitely memory managed (i.e. enver left
to be freed by garbage collector). It resists in GTY only to allow linking
garbage collected object from them and to get PCH working.

However GTY types need to be allocated by ggc_alloc and one can't call dtor.
This was main motivation for providing hooks instead of ctor/dtor API.
Maybe I miss something?

Thanks,
Martin


This is however quite cosmetic issue I would preffer our C++ guys to comment 
on.  We can
tweak this incrementally.
+void
+inline_summary_t::duplicate (cgraph_node *src,
+                            cgraph_node *dst,
+                            inline_summary *,
+                            inline_summary *info)

Also we should have a way to say that the annotation do not need to be 
duplicated (for example
when we do not want to annotate inline clones). Probably by adding duplicate_p 
predicate that
is called before the actual duplication happens?

The updated patch is OK, I will take a look on the main patch.

Honza
  {
-  struct inline_summary *info;
    inline_summary_alloc ();
-  info = inline_summary (dst);
-  memcpy (info, inline_summary (src), sizeof (struct inline_summary));
+  memcpy (info, inline_summary_d->get (src), sizeof (inline_summary));
    /* TODO: as an optimization, we may avoid copying conditions
       that are known to be false or true.  */
    info->conds = vec_safe_copy (info->conds);
@@ -1328,7 +1309,7 @@ free_growth_caches (void)

  static void
  dump_inline_edge_summary (FILE *f, int indent, struct cgraph_node *node,
-                         struct inline_summary *info)
+                         inline_summary *info)
  {
    struct cgraph_edge *edge;
    for (edge = node->callees; edge; edge = edge->next_callee)
@@ -1345,8 +1326,8 @@ dump_inline_edge_summary (FILE *f, int indent, struct 
cgraph_node *node,
               ? "inlined" : cgraph_inline_failed_string (edge-> inline_failed),
               indent, "", es->loop_depth, edge->frequency,
               es->call_stmt_size, es->call_stmt_time,
-              (int) inline_summary (callee)->size / INLINE_SIZE_SCALE,
-              (int) inline_summary (callee)->estimated_stack_size);
+              (int) inline_summary_d->get (callee)->size / INLINE_SIZE_SCALE,
+              (int) inline_summary_d->get (callee)->estimated_stack_size);

        if (es->predicate)
        {
@@ -1372,9 +1353,9 @@ dump_inline_edge_summary (FILE *f, int indent, struct 
cgraph_node *node,
          fprintf (f, "%*sStack frame offset %i, callee self size %i,"
                   " callee size %i\n",
                   indent + 2, "",
-                  (int) inline_summary (callee)->stack_frame_offset,
-                  (int) inline_summary (callee)->estimated_self_stack_size,
-                  (int) inline_summary (callee)->estimated_stack_size);
+                  (int) inline_summary_d->get (callee)->stack_frame_offset,
+                  (int) inline_summary_d->get 
(callee)->estimated_self_stack_size,
+                  (int) inline_summary_d->get (callee)->estimated_stack_size);
          dump_inline_edge_summary (f, indent + 2, callee, info);
        }
      }
@@ -1402,7 +1383,7 @@ dump_inline_summary (FILE *f, struct cgraph_node *node)
  {
    if (node->definition)
      {
-      struct inline_summary *s = inline_summary (node);
+      inline_summary *s = inline_summary_d->get (node);
        size_time_entry *e;
        int i;
        fprintf (f, "Inline summary for %s/%i", node->name (),
@@ -1725,7 +1706,7 @@ eliminated_by_inlining_prob (gimple stmt)

  static void
  set_cond_stmt_execution_predicate (struct ipa_node_params *info,
-                                  struct inline_summary *summary,
+                                  inline_summary *summary,
                                   basic_block bb)
  {
    gimple last;
@@ -1810,7 +1791,7 @@ set_cond_stmt_execution_predicate (struct ipa_node_params 
*info,

  static void
  set_switch_stmt_execution_predicate (struct ipa_node_params *info,
-                                    struct inline_summary *summary,
+                                    inline_summary *summary,
                                     basic_block bb)
  {
    gimple last;
@@ -1871,7 +1852,7 @@ set_switch_stmt_execution_predicate (struct 
ipa_node_params *info,
  static void
  compute_bb_predicates (struct cgraph_node *node,
                       struct ipa_node_params *parms_info,
-                      struct inline_summary *summary)
+                      inline_summary *summary)
  {
    struct function *my_function = DECL_STRUCT_FUNCTION (node->decl);
    bool done = false;
@@ -1950,7 +1931,7 @@ typedef struct predicate predicate_t;

  static struct predicate
  will_be_nonconstant_expr_predicate (struct ipa_node_params *info,
-                                   struct inline_summary *summary,
+                                   inline_summary *summary,
                                    tree expr,
                                    vec<predicate_t> nonconstant_names)
  {
@@ -2013,7 +1994,7 @@ will_be_nonconstant_expr_predicate (struct 
ipa_node_params *info,

  static struct predicate
  will_be_nonconstant_predicate (struct ipa_node_params *info,
-                              struct inline_summary *summary,
+                              inline_summary *summary,
                               gimple stmt,
                               vec<predicate_t> nonconstant_names)
  {
@@ -2215,7 +2196,7 @@ param_change_prob (gimple stmt, int i)

  static bool
  phi_result_unknown_predicate (struct ipa_node_params *info,
-                             struct inline_summary *summary, basic_block bb,
+                             inline_summary *summary, basic_block bb,
                              struct predicate *p,
                              vec<predicate_t> nonconstant_names)
  {
@@ -2274,7 +2255,7 @@ phi_result_unknown_predicate (struct ipa_node_params 
*info,
     NONCONSTANT_NAMES, if possible.  */

  static void
-predicate_for_phi_result (struct inline_summary *summary, gimple phi,
+predicate_for_phi_result (inline_summary *summary, gimple phi,
                          struct predicate *p,
                          vec<predicate_t> nonconstant_names)
  {
@@ -2304,7 +2285,7 @@ predicate_for_phi_result (struct inline_summary *summary, 
gimple phi,
  /* Return predicate specifying when array index in access OP becomes 
non-constant.  */

  static struct predicate
-array_index_predicate (struct inline_summary *info,
+array_index_predicate (inline_summary *info,
                       vec< predicate_t> nonconstant_names, tree op)
  {
    struct predicate p = false_predicate ();
@@ -2460,7 +2441,7 @@ estimate_function_body_sizes (struct cgraph_node *node, 
bool early)
    gimple_stmt_iterator bsi;
    struct function *my_function = DECL_STRUCT_FUNCTION (node->decl);
    int freq;
-  struct inline_summary *info = inline_summary (node);
+  inline_summary *info = inline_summary_d->get (node);
    struct predicate bb_predicate;
    struct ipa_node_params *parms_info = NULL;
    vec<predicate_t> nonconstant_names = vNULL;
@@ -2702,7 +2683,7 @@ estimate_function_body_sizes (struct cgraph_node *node, 
bool early)
            }
        }
      }
-  set_hint_predicate (&inline_summary (node)->array_index, array_index);
+  set_hint_predicate (&inline_summary_d->get (node)->array_index, array_index);
    time = (time + CGRAPH_FREQ_BASE / 2) / CGRAPH_FREQ_BASE;
    if (time > MAX_TIME)
      time = MAX_TIME;
@@ -2790,9 +2771,9 @@ estimate_function_body_sizes (struct cgraph_node *node, 
bool early)
            }
          free (body);
        }
-      set_hint_predicate (&inline_summary (node)->loop_iterations,
+      set_hint_predicate (&inline_summary_d->get (node)->loop_iterations,
                          loop_iterations);
-      set_hint_predicate (&inline_summary (node)->loop_stride, loop_stride);
+      set_hint_predicate (&inline_summary_d->get (node)->loop_stride, 
loop_stride);
        scev_finalize ();
      }
    FOR_ALL_BB_FN (bb, my_function)
@@ -2810,8 +2791,8 @@ estimate_function_body_sizes (struct cgraph_node *node, 
bool early)
          e->aux = NULL;
        }
      }
-  inline_summary (node)->self_time = time;
-  inline_summary (node)->self_size = size;
+  inline_summary_d->get (node)->self_time = time;
+  inline_summary_d->get (node)->self_size = size;
    nonconstant_names.release ();
    if (optimize && !early)
      {
@@ -2834,14 +2815,14 @@ compute_inline_parameters (struct cgraph_node *node, 
bool early)
  {
    HOST_WIDE_INT self_stack_size;
    struct cgraph_edge *e;
-  struct inline_summary *info;
+  inline_summary *info;

    gcc_assert (!node->global.inlined_to);

    inline_summary_alloc ();

-  info = inline_summary (node);
-  reset_inline_summary (node);
+  info = inline_summary_d->get (node);
+  reset_inline_summary (node, info);

    /* FIXME: Thunks are inlinable, but tree-inline don't know how to do that.
       Once this happen, we will need to more curefully predict call
@@ -2982,7 +2963,7 @@ estimate_edge_devirt_benefit (struct cgraph_edge *ie,
  {
    tree target;
    struct cgraph_node *callee;
-  struct inline_summary *isummary;
+  inline_summary *isummary;
    enum availability avail;

    if (!known_vals.exists () && !known_binfos.exists ())
@@ -3007,7 +2988,7 @@ estimate_edge_devirt_benefit (struct cgraph_edge *ie,
    callee = callee->function_symbol (&avail);
    if (avail < AVAIL_AVAILABLE)
      return false;
-  isummary = inline_summary (callee);
+  isummary = inline_summary_d->get (callee);
    return isummary->inlinable;
  }

@@ -3120,7 +3101,7 @@ estimate_node_size_and_time (struct cgraph_node *node,
                             vec<inline_param_summary>
                             inline_param_summary)
  {
-  struct inline_summary *info = inline_summary (node);
+  inline_summary *info = inline_summary_d->get (node);
    size_time_entry *e;
    int size = 0;
    int time = 0;
@@ -3246,8 +3227,8 @@ estimate_ipcp_clone_size_and_time (struct cgraph_node 
*node,
     for other purposes).  */

  static struct predicate
-remap_predicate (struct inline_summary *info,
-                struct inline_summary *callee_info,
+remap_predicate (inline_summary *info,
+                inline_summary *callee_info,
                 struct predicate *p,
                 vec<int> operand_map,
                 vec<int> offset_map,
@@ -3336,8 +3317,8 @@ static void
  inline_update_callee_summaries (struct cgraph_node *node, int depth)
  {
    struct cgraph_edge *e;
-  struct inline_summary *callee_info = inline_summary (node);
-  struct inline_summary *caller_info = inline_summary (node->callers->caller);
+  inline_summary *callee_info = inline_summary_d->get (node);
+  inline_summary *caller_info = inline_summary_d->get (node->callers->caller);
    HOST_WIDE_INT peak;

    callee_info->stack_frame_offset
@@ -3345,8 +3326,8 @@ inline_update_callee_summaries (struct cgraph_node *node, 
int depth)
      + caller_info->estimated_self_stack_size;
    peak = callee_info->stack_frame_offset
      + callee_info->estimated_self_stack_size;
-  if (inline_summary (node->global.inlined_to)->estimated_stack_size < peak)
-      inline_summary (node->global.inlined_to)->estimated_stack_size = peak;
+  if (inline_summary_d->get (node->global.inlined_to)->estimated_stack_size < 
peak)
+      inline_summary_d->get (node->global.inlined_to)->estimated_stack_size = 
peak;
    ipa_propagate_frequency (node);
    for (e = node->callees; e; e = e->next_callee)
      {
@@ -3407,8 +3388,8 @@ remap_edge_change_prob (struct cgraph_edge *inlined_edge,
  static void
  remap_edge_summaries (struct cgraph_edge *inlined_edge,
                      struct cgraph_node *node,
-                     struct inline_summary *info,
-                     struct inline_summary *callee_info,
+                     inline_summary *info,
+                     inline_summary *callee_info,
                      vec<int> operand_map,
                      vec<int> offset_map,
                      clause_t possible_truths,
@@ -3476,8 +3457,8 @@ remap_edge_summaries (struct cgraph_edge *inlined_edge,
  /* Same as remap_predicate, but set result into hint *HINT.  */

  static void
-remap_hint_predicate (struct inline_summary *info,
-                     struct inline_summary *callee_info,
+remap_hint_predicate (inline_summary *info,
+                     inline_summary *callee_info,
                      struct predicate **hint,
                      vec<int> operand_map,
                      vec<int> offset_map,
@@ -3506,10 +3487,10 @@ remap_hint_predicate (struct inline_summary *info,
  void
  inline_merge_summary (struct cgraph_edge *edge)
  {
-  struct inline_summary *callee_info = inline_summary (edge->callee);
+  inline_summary *callee_info = inline_summary_d->get (edge->callee);
    struct cgraph_node *to = (edge->caller->global.inlined_to
                            ? edge->caller->global.inlined_to : edge->caller);
-  struct inline_summary *info = inline_summary (to);
+  inline_summary *info = inline_summary_d->get (to);
    clause_t clause = 0;                /* not_inline is known to be false.  */
    size_time_entry *e;
    vec<int> operand_map = vNULL;
@@ -3618,7 +3599,7 @@ inline_merge_summary (struct cgraph_edge *edge)
  void
  inline_update_overall_summary (struct cgraph_node *node)
  {
-  struct inline_summary *info = inline_summary (node);
+  inline_summary *info = inline_summary_d->get (node);
    size_time_entry *e;
    int i;

@@ -3645,8 +3626,8 @@ simple_edge_hints (struct cgraph_edge *edge)
    int hints = 0;
    struct cgraph_node *to = (edge->caller->global.inlined_to
                            ? edge->caller->global.inlined_to : edge->caller);
-  if (inline_summary (to)->scc_no
-      && inline_summary (to)->scc_no == inline_summary (edge->callee)->scc_no
+  if (inline_summary_d->get (to)->scc_no
+      && inline_summary_d->get (to)->scc_no == inline_summary_d->get 
(edge->callee)->scc_no
        && !edge->recursive_p ())
      hints |= INLINE_HINT_same_scc;

@@ -3706,7 +3687,7 @@ do_estimate_edge_time (struct cgraph_edge *edge)
    /* When caching, update the cache entry.  */
    if (edge_growth_cache.exists ())
      {
-      inline_summary (edge->callee)->min_size = min_size;
+      inline_summary_d->get (edge->callee)->min_size = min_size;
        if ((int) edge_growth_cache.length () <= edge->uid)
        edge_growth_cache.safe_grow_cleared (symtab->edges_max_uid);
        edge_growth_cache[edge->uid].time = time + (time >= 0);
@@ -3808,14 +3789,14 @@ estimate_time_after_inlining (struct cgraph_node *node,
    if (!es->predicate || !false_predicate_p (es->predicate))
      {
        gcov_type time =
-       inline_summary (node)->time + estimate_edge_time (edge);
+       inline_summary_d->get (node)->time + estimate_edge_time (edge);
        if (time < 0)
        time = 0;
        if (time > MAX_TIME)
        time = MAX_TIME;
        return time;
      }
-  return inline_summary (node)->time;
+  return inline_summary_d->get (node)->time;
  }


@@ -3829,11 +3810,11 @@ estimate_size_after_inlining (struct cgraph_node *node,
    struct inline_edge_summary *es = inline_edge_summary (edge);
    if (!es->predicate || !false_predicate_p (es->predicate))
      {
-      int size = inline_summary (node)->size + estimate_edge_growth (edge);
+      int size = inline_summary_d->get (node)->size + estimate_edge_growth 
(edge);
        gcc_assert (size >= 0);
        return size;
      }
-  return inline_summary (node)->size;
+  return inline_summary_d->get (node)->size;
  }


@@ -3873,7 +3854,7 @@ int
  do_estimate_growth (struct cgraph_node *node)
  {
    struct growth_data d = { node, 0, false };
-  struct inline_summary *info = inline_summary (node);
+  inline_summary *info = inline_summary_d->get (node);

    node->call_for_symbol_thunks_and_aliases (do_estimate_growth_1, &d, true);

@@ -3946,7 +3927,7 @@ growth_likely_positive (struct cgraph_node *node, int 
edge_growth ATTRIBUTE_UNUS
        && (!DECL_COMDAT (node->decl)
          || !node->can_remove_if_no_direct_calls_p ()))
      return true;
-  max_callers = inline_summary (node)->size * 4 / edge_growth + 2;
+  max_callers = inline_summary_d->get (node)->size * 4 / edge_growth + 2;

    for (e = node->callers; e; e = e->next_caller)
      {
@@ -4009,13 +3990,12 @@ inline_analyze_function (struct cgraph_node *node)

  /* Called when new function is inserted to callgraph late.  */

-static void
-add_new_function (struct cgraph_node *node, void *data ATTRIBUTE_UNUSED)
+void
+inline_summary_t::insert (cgraph_node *node, inline_summary *)
  {
    inline_analyze_function (node);
  }

-
  /* Note function body size.  */

  void
@@ -4028,8 +4008,10 @@ inline_generate_summary (void)
    if (!optimize && !flag_lto && !flag_wpa)
      return;

-  function_insertion_hook_holder =
-    symtab->add_cgraph_insertion_hook (&add_new_function, NULL);
+  if (!inline_summary_d)
+    inline_summary_d = (inline_summary_t*) inline_summary_t::create_ggc 
(symtab);
+
+  inline_summary_d->enable_insertion_hook ();

    ipa_register_cgraph_hooks ();
    inline_free_summary ();
@@ -4113,7 +4095,7 @@ inline_read_section (struct lto_file_decl_data 
*file_data, const char *data,
      {
        unsigned int index;
        struct cgraph_node *node;
-      struct inline_summary *info;
+      inline_summary *info;
        lto_symtab_encoder_t encoder;
        struct bitpack_d bp;
        struct cgraph_edge *e;
@@ -4123,7 +4105,7 @@ inline_read_section (struct lto_file_decl_data 
*file_data, const char *data,
        encoder = file_data->symtab_node_encoder;
        node = dyn_cast<cgraph_node *> (lto_symtab_encoder_deref (encoder,
                                                                index));
-      info = inline_summary (node);
+      info = inline_summary_d->get (node);

        info->estimated_stack_size
        = info->estimated_self_stack_size = streamer_read_uhwi (&ib);
@@ -4212,8 +4194,9 @@ inline_read_summary (void)
        if (!flag_ipa_cp)
        ipa_prop_read_jump_functions ();
      }
-  function_insertion_hook_holder =
-    symtab->add_cgraph_insertion_hook (&add_new_function, NULL);
+
+  gcc_assert (inline_summary_d);
+  inline_summary_d->enable_insertion_hook ();
  }


@@ -4279,7 +4262,7 @@ inline_write_summary (void)
        cgraph_node *cnode = dyn_cast <cgraph_node *> (snode);
        if (cnode && (node = cnode)->definition && !node->alias)
        {
-         struct inline_summary *info = inline_summary (node);
+         inline_summary *info = inline_summary_d->get (node);
          struct bitpack_d bp;
          struct cgraph_edge *edge;
          int i;
@@ -4344,23 +4327,15 @@ inline_free_summary (void)
      return;
    FOR_EACH_DEFINED_FUNCTION (node)
      if (!node->alias)
-      reset_inline_summary (node);
-  if (function_insertion_hook_holder)
-    symtab->remove_cgraph_insertion_hook (function_insertion_hook_holder);
-  function_insertion_hook_holder = NULL;
-  if (node_removal_hook_holder)
-    symtab->remove_cgraph_removal_hook (node_removal_hook_holder);
-  node_removal_hook_holder = NULL;
+      reset_inline_summary (node, inline_summary_d->get (node));
    if (edge_removal_hook_holder)
      symtab->remove_edge_removal_hook (edge_removal_hook_holder);
    edge_removal_hook_holder = NULL;
-  if (node_duplication_hook_holder)
-    symtab->remove_cgraph_duplication_hook (node_duplication_hook_holder);
-  node_duplication_hook_holder = NULL;
    if (edge_duplication_hook_holder)
      symtab->remove_edge_duplication_hook (edge_duplication_hook_holder);
    edge_duplication_hook_holder = NULL;
-  vec_free (inline_summary_vec);
+  inline_summary_d->destroy ();
+  inline_summary_d = NULL;
    inline_edge_summary_vec.release ();
    if (edge_predicate_pool)
      free_alloc_pool (edge_predicate_pool);
diff --git a/gcc/ipa-inline-transform.c b/gcc/ipa-inline-transform.c
index 49c2679..841af60 100644
--- a/gcc/ipa-inline-transform.c
+++ b/gcc/ipa-inline-transform.c
@@ -200,7 +200,7 @@ clone_inlined_nodes (struct cgraph_edge *e, bool duplicate,
          if (e->callee->definition && !DECL_EXTERNAL (e->callee->decl))
            {
              if (overall_size)
-               *overall_size -= inline_summary (e->callee)->size;
+               *overall_size -= inline_summary_d->get (e->callee)->size;
              nfunctions_inlined++;
            }
          duplicate = false;
@@ -309,13 +309,13 @@ inline_call (struct cgraph_edge *e, bool update_original,

    gcc_assert (curr->callee->global.inlined_to == to);

-  old_size = inline_summary (to)->size;
+  old_size = inline_summary_d->get (to)->size;
    inline_merge_summary (e);
    if (optimize)
      new_edges_found = ipa_propagate_indirect_call_infos (curr, new_edges);
    if (update_overall_summary)
     inline_update_overall_summary (to);
-  new_size = inline_summary (to)->size;
+  new_size = inline_summary_d->get (to)->size;

    if (callee->calls_comdat_local)
      to->calls_comdat_local = true;
diff --git a/gcc/ipa-inline.c b/gcc/ipa-inline.c
index a8e94e2..73fb286 100644
--- a/gcc/ipa-inline.c
+++ b/gcc/ipa-inline.c
@@ -167,7 +167,7 @@ caller_growth_limits (struct cgraph_edge *e)
    int newsize;
    int limit = 0;
    HOST_WIDE_INT stack_size_limit = 0, inlined_stack;
-  struct inline_summary *info, *what_info, *outer_info = inline_summary (to);
+  inline_summary *info, *what_info, *outer_info = inline_summary_d->get (to);

    /* Look for function e->caller is inlined to.  While doing
       so work out the largest function body on the way.  As
@@ -179,7 +179,7 @@ caller_growth_limits (struct cgraph_edge *e)
       too much in order to prevent compiler from exploding".  */
    while (true)
      {
-      info = inline_summary (to);
+      info = inline_summary_d->get (to);
        if (limit < info->self_size)
        limit = info->self_size;
        if (stack_size_limit < info->estimated_self_stack_size)
@@ -190,7 +190,7 @@ caller_growth_limits (struct cgraph_edge *e)
        break;
      }

-  what_info = inline_summary (what);
+  what_info = inline_summary_d->get (what);

    if (limit < what_info->self_size)
      limit = what_info->self_size;
@@ -304,7 +304,7 @@ can_inline_edge_p (struct cgraph_edge *e, bool report,
        e->inline_failed = CIF_USES_COMDAT_LOCAL;
        inlinable = false;
      }
-  else if (!inline_summary (callee)->inlinable
+  else if (!inline_summary_d->get (callee)->inlinable
           || (caller_fun && fn_contains_cilk_spawn_p (caller_fun)))
      {
        e->inline_failed = CIF_FUNCTION_NOT_INLINABLE;
@@ -458,7 +458,7 @@ want_early_inline_function_p (struct cgraph_edge *e)

    if (DECL_DISREGARD_INLINE_LIMITS (callee->decl))
      ;
-  /* For AutoFDO, we need to make sure that before profile annotation, all
+  /* For AutoFDO, we need to make sure that before profile summary, all
       hot paths' IR look exactly the same as profiled binary. As a result,
       in einliner, we will disregard size limit and inline those callsites
       that are:
@@ -524,13 +524,12 @@ want_early_inline_function_p (struct cgraph_edge *e)
     does not happen.  */

  inline gcov_type
-compute_uninlined_call_time (struct inline_summary *callee_info,
-                            struct cgraph_edge *edge)
+compute_uninlined_call_time (inline_summary *callee_info, cgraph_edge *edge)
  {
    gcov_type uninlined_call_time =
      RDIV ((gcov_type)callee_info->time * MAX (edge->frequency, 1),
          CGRAPH_FREQ_BASE);
-  gcov_type caller_time = inline_summary (edge->caller->global.inlined_to
+  gcov_type caller_time = inline_summary_d->get 
(edge->caller->global.inlined_to
                                          ? edge->caller->global.inlined_to
                                          : edge->caller)->time;
    return uninlined_call_time + caller_time;
@@ -543,7 +542,7 @@ inline gcov_type
  compute_inlined_call_time (struct cgraph_edge *edge,
                           int edge_time)
  {
-  gcov_type caller_time = inline_summary (edge->caller->global.inlined_to
+  gcov_type caller_time = inline_summary_d->get 
(edge->caller->global.inlined_to
                                          ? edge->caller->global.inlined_to
                                          : edge->caller)->time;
    gcov_type time = (caller_time
@@ -563,7 +562,7 @@ compute_inlined_call_time (struct cgraph_edge *edge,
  static bool
  big_speedup_p (struct cgraph_edge *e)
  {
-  gcov_type time = compute_uninlined_call_time (inline_summary (e->callee),
+  gcov_type time = compute_uninlined_call_time (inline_summary_d->get 
(e->callee),
                                                e);
    gcov_type inlined_time = compute_inlined_call_time (e,
                                                      estimate_edge_time (e));
@@ -596,7 +595,7 @@ want_inline_small_function_p (struct cgraph_edge *e, bool 
report)
       MAX_INLINE_INSNS_SINGLE 16-fold for inline functions.  */
    else if ((!DECL_DECLARED_INLINE_P (callee->decl)
           && (!e->count || !e->maybe_hot_p ()))
-          && inline_summary (callee)->min_size
+          && inline_summary_d->get (callee)->min_size
                - inline_edge_summary (e)->call_stmt_size
              > MAX (MAX_INLINE_INSNS_SINGLE, MAX_INLINE_INSNS_AUTO))
      {
@@ -604,7 +603,7 @@ want_inline_small_function_p (struct cgraph_edge *e, bool 
report)
        want_inline = false;
      }
    else if ((DECL_DECLARED_INLINE_P (callee->decl) || e->count)
-          && inline_summary (callee)->min_size
+          && inline_summary_d->get (callee)->min_size
                - inline_edge_summary (e)->call_stmt_size
              > 16 * MAX_INLINE_INSNS_SINGLE)
      {
@@ -867,8 +866,8 @@ want_inline_function_to_all_callers_p (struct cgraph_node 
*node, bool cold)
     1...RELATIVE_TIME_BENEFIT_RANGE  */

  static inline int
-relative_time_benefit (struct inline_summary *callee_info,
-                      struct cgraph_edge *edge,
+relative_time_benefit (inline_summary *callee_info,
+                      cgraph_edge *edge,
                       int edge_time)
  {
    gcov_type relbenefit;
@@ -913,7 +912,7 @@ edge_badness (struct cgraph_edge *edge, bool dump)
    gcov_type badness;
    int growth, edge_time;
    struct cgraph_node *callee = edge->callee->ultimate_alias_target ();
-  struct inline_summary *callee_info = inline_summary (callee);
+  inline_summary *callee_info = inline_summary_d->get (callee);
    inline_hints hints;

    if (DECL_DISREGARD_INLINE_LIMITS (callee->decl))
@@ -1188,7 +1187,7 @@ update_caller_keys (fibheap_t heap, struct cgraph_node 
*node,
    struct cgraph_edge *edge;
    struct ipa_ref *ref;

-  if ((!node->alias && !inline_summary (node)->inlinable)
+  if ((!node->alias && !inline_summary_d->get (node)->inlinable)
        || node->global.inlined_to)
      return;
    if (!bitmap_set_bit (updated_nodes, node->uid))
@@ -1246,7 +1245,7 @@ update_callee_keys (fibheap_t heap, struct cgraph_node 
*node,
             don't need updating.  */
        if (e->inline_failed
            && (callee = e->callee->ultimate_alias_target (&avail))
-           && inline_summary (callee)->inlinable
+           && inline_summary_d->get (callee)->inlinable
            && avail >= AVAIL_AVAILABLE
            && !bitmap_bit_p (updated_nodes, callee->uid))
          {
@@ -1424,8 +1423,8 @@ recursive_inlining (struct cgraph_edge *edge,
      fprintf (dump_file,
             "\n   Inlined %i times, "
             "body grown from size %i to %i, time %i to %i\n", n,
-            inline_summary (master_clone)->size, inline_summary (node)->size,
-            inline_summary (master_clone)->time, inline_summary (node)->time);
+            inline_summary_d->get (master_clone)->size, inline_summary_d->get 
(node)->size,
+            inline_summary_d->get (master_clone)->time, inline_summary_d->get 
(node)->time);

    /* Remove master clone we used for inlining.  We rely that clones inlined
       into master clone gets queued just before master clone so we don't
@@ -1599,8 +1598,8 @@ inline_small_functions (void)
        if (node->has_gimple_body_p ()
            || node->thunk.thunk_p)
          {
-           struct inline_summary *info = inline_summary (node);
-           struct ipa_dfs_info *dfs = (struct ipa_dfs_info *) node->aux;
+           inline_summary *info = inline_summary_d->get (node);
+           ipa_dfs_info *dfs = (struct ipa_dfs_info *) node->aux;

            /* Do not account external functions, they will be optimized out
               if not inlined.  Also only count the non-cold portion of 
program.  */
@@ -1610,12 +1609,12 @@ inline_small_functions (void)
            info->growth = estimate_growth (node);
            if (dfs && dfs->next_cycle)
              {
-               struct cgraph_node *n2;
+               cgraph_node *n2;
                int id = dfs->scc_no + 1;
                for (n2 = node; n2;
                     n2 = ((struct ipa_dfs_info *) node->aux)->next_cycle)
                  {
-                   struct inline_summary *info2 = inline_summary (n2);
+                   inline_summary *info2 = inline_summary_d->get (n2);
                    if (info2->scc_no)
                      break;
                    info2->scc_no = id;
@@ -1735,7 +1734,7 @@ inline_small_functions (void)
          fprintf (dump_file,
                   "\nConsidering %s/%i with %i size\n",
                   callee->name (), callee->order,
-                  inline_summary (callee)->size);
+                  inline_summary_d->get (callee)->size);
          fprintf (dump_file,
                   " to be inlined into %s/%i in %s:%i\n"
                   " Estimated badness is %i, frequency %.2f.\n",
@@ -1853,8 +1852,8 @@ inline_small_functions (void)
                   " Inlined into %s which now has time %i and size %i,"
                   "net change of %+i.\n",
                   edge->caller->name (),
-                  inline_summary (edge->caller)->time,
-                  inline_summary (edge->caller)->size,
+                  inline_summary_d->get (edge->caller)->time,
+                  inline_summary_d->get (edge->caller)->size,
                   overall_size - old_size);
        }
        if (min_size > overall_size)
@@ -1992,11 +1991,11 @@ inline_to_all_callers (struct cgraph_node *node, void 
*data)
          fprintf (dump_file,
                   "\nInlining %s size %i.\n",
                   node->name (),
-                  inline_summary (node)->size);
+                  inline_summary_d->get (node)->size);
          fprintf (dump_file,
                   " Called once from %s %i insns.\n",
                   node->callers->caller->name (),
-                  inline_summary (node->callers->caller)->size);
+                  inline_summary_d->get (node->callers->caller)->size);
        }

        inline_call (node->callers, true, NULL, NULL, true, &callee_removed);
@@ -2004,7 +2003,7 @@ inline_to_all_callers (struct cgraph_node *node, void 
*data)
        fprintf (dump_file,
                 " Inlined into %s which now has %i size\n",
                 caller->name (),
-                inline_summary (caller)->size);
+                inline_summary_d->get (caller)->size);
        if (!(*num_calls)--)
        {
          if (dump_file)
@@ -2028,7 +2027,7 @@ dump_overall_stats (void)
      if (!node->global.inlined_to
        && !node->alias)
        {
-       int time = inline_summary (node)->time;
+       int time = inline_summary_d->get (node)->time;
        sum += time;
        sum_weighted += time * node->count;
        }
@@ -2345,7 +2344,7 @@ early_inline_small_functions (struct cgraph_node *node)
    for (e = node->callees; e; e = e->next_callee)
      {
        struct cgraph_node *callee = e->callee->ultimate_alias_target ();
-      if (!inline_summary (callee)->inlinable
+      if (!inline_summary_d->get (callee)->inlinable
          || !e->inline_failed)
        continue;

diff --git a/gcc/ipa-inline.h b/gcc/ipa-inline.h
index 2ac6e4e..7a939f4 100644
--- a/gcc/ipa-inline.h
+++ b/gcc/ipa-inline.h
@@ -162,10 +162,28 @@ struct GTY(()) inline_summary
    int scc_no;
  };

-/* Need a typedef for inline_summary because of inline function
-   'inline_summary' below.  */
-typedef struct inline_summary inline_summary_t;
-extern GTY(()) vec<inline_summary_t, va_gc> *inline_summary_vec;
+class GTY((user)) inline_summary_t: public function_summary <inline_summary *>
+{
+public:
+  inline_summary_t (symbol_table *symtab, bool ggc):
+    function_summary <inline_summary *> (symtab, ggc) {}
+
+  static inline_summary_t *create_ggc (symbol_table *symtab)
+  {
+    inline_summary_t *summary = new (ggc_cleared_alloc <inline_summary_t> ())
+      inline_summary_t(symtab, true);
+    summary->disable_insertion_hook ();
+    return summary;
+  }
+
+
+  virtual void insert (cgraph_node *, inline_summary *);
+  virtual void remove (cgraph_node *node, inline_summary *);
+  virtual void duplicate (cgraph_node *src, cgraph_node *dst,
+                         inline_summary *src_data, inline_summary *dst_data);
+};
+
+extern GTY(()) function_summary <inline_summary *> *inline_summary_d;

  /* Information kept about parameter of call site.  */
  struct inline_param_summary
@@ -249,12 +267,6 @@ void clone_inlined_nodes (struct cgraph_edge *e, bool, 
bool, int *,
  extern int ncalls_inlined;
  extern int nfunctions_inlined;

-static inline struct inline_summary *
-inline_summary (struct cgraph_node *node)
-{
-  return &(*inline_summary_vec)[node->uid];
-}
-
  static inline struct inline_edge_summary *
  inline_edge_summary (struct cgraph_edge *edge)
  {
diff --git a/gcc/ipa-prop.h b/gcc/ipa-prop.h
index 5e25fd8..387209b 100644
--- a/gcc/ipa-prop.h
+++ b/gcc/ipa-prop.h
@@ -514,7 +514,7 @@ ipa_get_ith_polymorhic_call_context (struct ipa_edge_args 
*args, int i)
    return &(*args->polymorphic_call_contexts)[i];
  }

-/* Callgraph summary for ipa_node_params.  */
+/* Function summary for ipa_node_params.  */
  class ipa_node_params_t: public function_summary <ipa_node_params *>
  {
  public:
@@ -537,7 +537,7 @@ extern GTY(()) vec<ipa_edge_args, va_gc> 
*ipa_edge_args_vector;

  /* Return the associated parameter/argument info corresponding to the given
     node/edge.  */
-#define IPA_NODE_REF(NODE) ((*ipa_node_params_d)[NODE])
+#define IPA_NODE_REF(NODE) (ipa_node_params_d->get (NODE))
  #define IPA_EDGE_REF(EDGE) (&(*ipa_edge_args_vector)[(EDGE)->uid])
  /* This macro checks validity of index returned by
     ipa_get_param_decl_index function.  */
diff --git a/gcc/ipa-split.c b/gcc/ipa-split.c
index 16684e2..80c3aac 100644
--- a/gcc/ipa-split.c
+++ b/gcc/ipa-split.c
@@ -1669,7 +1669,7 @@ execute_split_functions (void)
    /* This can be relaxed; function might become inlinable after splitting
       away the uninlinable part.  */
    if (inline_edge_summary_vec.exists ()
-      && !inline_summary (node)->inlinable)
+      && !inline_summary_d->get (node)->inlinable)
      {
        if (dump_file)
        fprintf (dump_file, "Not splitting: not inlinable.\n");
diff --git a/gcc/ipa.c b/gcc/ipa.c
index 80b8561..a873635 100644
--- a/gcc/ipa.c
+++ b/gcc/ipa.c
@@ -224,7 +224,7 @@ walk_polymorphic_call_targets (hash_set<void *> 
*reachable_call_targets,
                                 target->order);
            }
          edge = edge->make_direct (target);
-         if (inline_summary_vec)
+         if (inline_summary_d)
            inline_update_overall_summary (node);
          else if (edge->call_stmt)
            {
diff --git a/gcc/lto/lto-partition.c b/gcc/lto/lto-partition.c
index 3a2f9ed..343cd83 100644
--- a/gcc/lto/lto-partition.c
+++ b/gcc/lto/lto-partition.c
@@ -165,7 +165,7 @@ add_symbol_to_partition_1 (ltrans_partition part, 
symtab_node *node)
      {
        struct cgraph_edge *e;
        if (!node->alias)
-        part->insns += inline_summary (cnode)->self_size;
+        part->insns += inline_summary_d->get (cnode)->self_size;

        /* Add all inline clones and callees that are duplicated.  */
        for (e = cnode->callees; e; e = e->next_callee)
@@ -274,7 +274,7 @@ undo_partition (ltrans_partition partition, unsigned int 
n_nodes)
        partition->initializers_visited = NULL;

        if (!node->alias && (cnode = dyn_cast <cgraph_node *> (node)))
-        partition->insns -= inline_summary (cnode)->self_size;
+        partition->insns -= inline_summary_d->get (cnode)->self_size;
        lto_symtab_encoder_delete_node (partition->encoder, node);
        node->aux = (void *)((size_t)node->aux - 1);
      }
@@ -477,7 +477,7 @@ lto_balanced_map (int n_lto_partitions)
        else
          order[n_nodes++] = node;
        if (!node->alias)
-         total_size += inline_summary (node)->size;
+         total_size += inline_summary_d->get (node)->size;
        }

    /* Streaming works best when the source units do not cross partition
@@ -534,14 +534,14 @@ lto_balanced_map (int n_lto_partitions)
             && noreorder[noreorder_pos]->order < current_order)
        {
          if (!noreorder[noreorder_pos]->alias)
-           total_size -= inline_summary (noreorder[noreorder_pos])->size;
+           total_size -= inline_summary_d->get 
(noreorder[noreorder_pos])->size;
          next_nodes.safe_push (noreorder[noreorder_pos++]);
        }
        add_sorted_nodes (next_nodes, partition);

        add_symbol_to_partition (partition, order[i]);
        if (!order[i]->alias)
-        total_size -= inline_summary (order[i])->size;
+        total_size -= inline_summary_d->get (order[i])->size;
        

        /* Once we added a new node to the partition, we also want to add
diff --git a/gcc/tree-sra.c b/gcc/tree-sra.c
index e0c375d..980a97b 100644
--- a/gcc/tree-sra.c
+++ b/gcc/tree-sra.c
@@ -4991,7 +4991,7 @@ ipa_sra_preliminary_function_checks (struct cgraph_node 
*node)
      }

    if ((DECL_COMDAT (node->decl) || DECL_EXTERNAL (node->decl))
-      && inline_summary (node)->size >= MAX_INLINE_INSNS_AUTO)
+      && inline_summary_d->get (node)->size >= MAX_INLINE_INSNS_AUTO)
      {
        if (dump_file)
        fprintf (dump_file, "Function too big to be made truly local.\n");
--
2.1.2




Reply via email to