diff mbox

[3/4] First usage of cgraph_summary in ipa-prop pass.

Message ID 54661E7D.3060007@suse.cz
State New
Headers show

Commit Message

Martin Liška Nov. 14, 2014, 3:23 p.m. UTC
On 11/14/2014 03:05 PM, Martin Liška wrote:
> On 11/11/2014 01:26 PM, mliska wrote:
>> gcc/ChangeLog:
>>
>> 2014-11-12  Martin Liska  <mliska@suse.cz>
>>
>>     * auto-profile.c: Include cgraph_summary.h.
>>     * cgraph.c: Likewise.
>>     * cgraphbuild.c: Likewise.
>>     * cgraphclones.c: Likewise.
>>     * cgraphunit.c: Likewise.
>>     * ipa-cp.c: Likewise.
>>     * ipa-devirt.c: Likewise.
>>     * ipa-icf.c: Likewise.
>>     * ipa-inline-analysis.c (evaluate_properties_for_edge): Usage of
>>     ipa_node_params_vector is replaced with ipa_node_params_summary.
>>     (inline_node_duplication_hook): Likewise.
>>     (estimate_function_body_sizes): Likewise.
>>     (remap_edge_change_prob): Likewise.
>>     (inline_merge_summary): Likewise.
>>     * ipa-inline-transform.c: Include of cgraph_summary.h.
>>     * ipa-inline.c (early_inliner): Usage of
>>     ipa_node_params_vector is replaced with ipa_node_params_summary.
>>     * ipa-polymorphic-call.c: Include of cgraph_summary.h.
>>     * ipa-profile.c: Include of cgraph_summary.h.
>>     * ipa-prop.c (struct func_body_info): Struct keyword is removed.
>>     (struct ipa_cst_ref_desc): Likewise.
>>     (ipa_func_spec_opts_forbid_analysis_p): Likewise.
>>     (ipa_alloc_node_params): Likewise.
>>     (ipa_initialize_node_params): Likewise.
>>     (ipa_print_node_jump_functions_for_edge): Likewise.
>>     (ipa_print_node_jump_functions): Likewise.
>>     (ipa_print_all_jump_functions): Likewise.
>>     (ipa_set_jf_constant): Likewise.
>>     (check_stmt_for_type_change): Likewise.
>>     (detect_type_change_from_memory_writes): Likewise.
>>     (find_dominating_aa_status): Likewise.
>>     (parm_bb_aa_status_for_bb): Likewise.
>>     (parm_preserved_before_stmt_p): Likewise.
>>     (parm_ref_data_preserved_p): Likewise.
>>     (parm_ref_data_pass_through_p): Likewise.
>>     (struct ipa_known_agg_contents_list): Likewise.
>>     (get_place_in_agg_contents_list): Likewise.
>>     (build_agg_jump_func_from_list): Likewise.
>>     (determine_locally_known_aggregate_parts): Likewise.
>>     (ipa_compute_jump_functions_for_edge): Likewise.
>>     (ipa_compute_jump_functions_for_bb): Likewise.
>>     (ipa_note_param_call): Likewise.
>>     (ipa_analyze_indirect_call_uses) Likewise.:
>>     (ipa_analyze_virtual_call_uses): Likewise.
>>     (ipa_analyze_call_uses): Likewise.
>>     (visit_ref_for_mod_analysis): Likewise.
>>     (ipa_analyze_controlled_uses): Likewise.
>>     (ipa_analyze_node): Likewise.
>>     (update_jump_functions_after_inlining): Likewise.
>>     (ipa_make_edge_direct_to_target): Likewise.
>>     (ipa_find_agg_cst_for_param): Likewise.
>>     (remove_described_reference): Likewise.
>>     (jfunc_rdesc_usable): Likewise.
>>     (try_decrement_rdesc_refcount): Likewise.
>>     (try_make_edge_direct_simple_call): Likewise.
>>     (try_make_edge_direct_virtual_call): Likewise.
>>     (update_indirect_edges_after_inlining): Likewise.
>>     (propagate_info_to_inlined_callees): Likewise.
>>     (propagate_controlled_uses): Likewise.
>>     (ipa_propagate_indirect_call_infos): Likewise.
>>     (ipa_free_all_edge_args): Likewise.
>>     (ipa_node_params::~ipa_node_params): Likewise.
>>     (ipa_free_all_node_params): Likewise.
>>     (ipa_edge_removal_hook): Likewise.
>>     (ipa_node_removal_hook): Likewise.
>>     (ipa_edge_duplication_hook): Likewise.
>>     (ipa_add_new_function): Removed
>>     (ipa_node_params_cgraph_summary::duplication_hook): New function.
>>     (ipa_node_duplication_hook): Struct keyword removed.
>>     (ipa_register_cgraph_hooks): Removal of old hooks.
>>     (ipa_unregister_cgraph_hooks): Likewise.
>>     (ipa_print_node_params): Struct keyword is removed.
>>     (ipa_print_all_params): Likewise.
>>     (ipa_modify_formal_parameters): Likewise.
>>     (ipa_modify_call_arguments): Likewise.
>>     (ipa_modify_expr): Likewise.
>>     (ipa_get_adjustment_candidate): Likewise.
>>     (index_in_adjustments_multiple_times_p): Likewise.
>>     (ipa_combine_adjustments): Likewise.
>>     (ipa_dump_param_adjustments): Likewise.
>>     (ipa_write_jump_function): Likewise.
>>     (ipa_read_jump_function): Likewise.
>>     (ipa_write_indirect_edge_info): Likewise.
>>     (ipa_read_indirect_edge_info): Likewise.
>>     (ipa_write_node_info): Likewise.
>>     (ipa_read_node_info): Likewise.
>>     (ipa_prop_write_jump_functions): Likewise.
>>     (ipa_prop_read_section): Likewise.
>>     (ipa_prop_read_jump_functions): Likewise.
>>     (write_agg_replacement_chain): Likewise.
>>     (read_agg_replacement_chain): Likewise.
>>     (ipa_prop_write_all_agg_replacement): Likewise.
>>     (read_replacements_section): Likewise.
>>     (ipa_prop_read_all_agg_replacement): Likewise.
>>     (adjust_agg_replacement_values): Likewise.
>>     (ipcp_modif_dom_walker::before_dom_children): Likewise.
>>     (ipcp_transform_function): Likewise.
>>     * ipa-prop.h (struct ipa_node_params): Introduction of new class
>>     ipa_node_params_cgraph_summary.
>>     * ipa-split.c: Include cgraph_summary.h.
>>     * ipa-utils.c: Likewise.
>>     * ipa.c: Likewise.
>>     * omp-low.c: Likewise.
>>     * tree-inline.c: Likewise.
>>     * tree-sra.c: Likewise.
>>     * tree-ssa-pre.c: Likewise.
>>
>> gcc/lto/ChangeLog:
>>
>> 2014-11-12  Martin Liska  <mliska@suse.cz>
>>
>>     * lto-partition.c: Include cgraph_summary.h.
>>     * lto-symtab.c: Likewise.
>>     * lto.c: Likewise.
>> ---
>>   gcc/auto-profile.c         |   1 +
>>   gcc/cgraph.c               |   1 +
>>   gcc/cgraphbuild.c          |   1 +
>>   gcc/cgraphclones.c         |   1 +
>>   gcc/cgraphunit.c           |   1 +
>>   gcc/ipa-cp.c               |   1 +
>>   gcc/ipa-devirt.c           |   1 +
>>   gcc/ipa-icf.c              |   1 +
>>   gcc/ipa-inline-analysis.c  |  13 +-
>>   gcc/ipa-inline-transform.c |   1 +
>>   gcc/ipa-inline.c           |   3 +-
>>   gcc/ipa-polymorphic-call.c |   1 +
>>   gcc/ipa-profile.c          |   1 +
>>   gcc/ipa-prop.c             | 700 ++++++++++++++++++++++-----------------------
>>   gcc/ipa-prop.h             |  46 +--
>>   gcc/ipa-split.c            |   1 +
>>   gcc/ipa-utils.c            |   1 +
>>   gcc/ipa.c                  |   1 +
>>   gcc/lto/lto-partition.c    |   1 +
>>   gcc/lto/lto-symtab.c       |   1 +
>>   gcc/lto/lto.c              |   1 +
>>   gcc/omp-low.c              |   1 +
>>   gcc/tree-inline.c          |   1 +
>>   gcc/tree-sra.c             |   1 +
>>   gcc/tree-ssa-pre.c         |   1 +
>>   25 files changed, 397 insertions(+), 386 deletions(-)
>>
>> diff --git a/gcc/auto-profile.c b/gcc/auto-profile.c
>> index 8c7b4ca..49f9b8c 100644
>> --- a/gcc/auto-profile.c
>> +++ b/gcc/auto-profile.c
>> @@ -67,6 +67,7 @@ along with GCC; see the file COPYING3.  If not see
>>   #include "coverage.h"
>>   #include "params.h"
>>   #include "alloc-pool.h"
>> +#include "cgraph_summary.h"
>>   #include "ipa-prop.h"
>>   #include "ipa-inline.h"
>>   #include "tree-inline.h"
>> diff --git a/gcc/cgraph.c b/gcc/cgraph.c
>> index 7216b89..af1835a 100644
>> --- a/gcc/cgraph.c
>> +++ b/gcc/cgraph.c
>> @@ -72,6 +72,7 @@ along with GCC; see the file COPYING3.  If not see
>>   #include "ipa-utils.h"
>>   #include "lto-streamer.h"
>>   #include "alloc-pool.h"
>> +#include "cgraph_summary.h"
>>   #include "ipa-prop.h"
>>   #include "ipa-inline.h"
>>   #include "cfgloop.h"
>> diff --git a/gcc/cgraphbuild.c b/gcc/cgraphbuild.c
>> index c72ceab..a93b0aa 100644
>> --- a/gcc/cgraphbuild.c
>> +++ b/gcc/cgraphbuild.c
>> @@ -52,6 +52,7 @@ along with GCC; see the file COPYING3.  If not see
>>   #include "ipa-utils.h"
>>   #include "except.h"
>>   #include "alloc-pool.h"
>> +#include "cgraph_summary.h"
>>   #include "ipa-prop.h"
>>   #include "ipa-inline.h"
>>
>> diff --git a/gcc/cgraphclones.c b/gcc/cgraphclones.c
>> index c8892da..79f95ef 100644
>> --- a/gcc/cgraphclones.c
>> +++ b/gcc/cgraphclones.c
>> @@ -103,6 +103,7 @@ along with GCC; see the file COPYING3.  If not see
>>   #include "ipa-ref.h"
>>   #include "cgraph.h"
>>   #include "alloc-pool.h"
>> +#include "cgraph_summary.h"
>>   #include "ipa-prop.h"
>>   #include "tree-iterator.h"
>>   #include "tree-dump.h"
>> diff --git a/gcc/cgraphunit.c b/gcc/cgraphunit.c
>> index 25af234..dbbdc44 100644
>> --- a/gcc/cgraphunit.c
>> +++ b/gcc/cgraphunit.c
>> @@ -204,6 +204,7 @@ along with GCC; see the file COPYING3.  If not see
>>   #include "ipa-ref.h"
>>   #include "cgraph.h"
>>   #include "alloc-pool.h"
>> +#include "cgraph_summary.h"
>>   #include "ipa-prop.h"
>>   #include "tree-iterator.h"
>>   #include "tree-pass.h"
>> diff --git a/gcc/ipa-cp.c b/gcc/ipa-cp.c
>> index 47f9f5c..da589af 100644
>> --- a/gcc/ipa-cp.c
>> +++ b/gcc/ipa-cp.c
>> @@ -123,6 +123,7 @@ along with GCC; see the file COPYING3.  If not see
>>   #include "ipa-ref.h"
>>   #include "cgraph.h"
>>   #include "alloc-pool.h"
>> +#include "cgraph_summary.h"
>>   #include "ipa-prop.h"
>>   #include "bitmap.h"
>>   #include "tree-pass.h"
>> diff --git a/gcc/ipa-devirt.c b/gcc/ipa-devirt.c
>> index 32c6549..8e1f9ce 100644
>> --- a/gcc/ipa-devirt.c
>> +++ b/gcc/ipa-devirt.c
>> @@ -139,6 +139,7 @@ along with GCC; see the file COPYING3.  If not see
>>   #include "gimple-expr.h"
>>   #include "gimple.h"
>>   #include "alloc-pool.h"
>> +#include "cgraph_summary.h"
>>   #include "ipa-prop.h"
>>   #include "ipa-inline.h"
>>   #include "diagnostic.h"
>> diff --git a/gcc/ipa-icf.c b/gcc/ipa-icf.c
>> index 92ec82d..9778323 100644
>> --- a/gcc/ipa-icf.c
>> +++ b/gcc/ipa-icf.c
>> @@ -87,6 +87,7 @@ along with GCC; see the file COPYING3.  If not see
>>   #include "ipa-ref.h"
>>   #include "cgraph.h"
>>   #include "alloc-pool.h"
>> +#include "cgraph_summary.h"
>>   #include "ipa-prop.h"
>>   #include "ipa-inline.h"
>>   #include "cfgloop.h"
>> diff --git a/gcc/ipa-inline-analysis.c b/gcc/ipa-inline-analysis.c
>> index eb1c6ec..c7a52d2 100644
>> --- a/gcc/ipa-inline-analysis.c
>> +++ b/gcc/ipa-inline-analysis.c
>> @@ -110,6 +110,7 @@ along with GCC; see the file COPYING3.  If not see
>>   #include "ipa-ref.h"
>>   #include "cgraph.h"
>>   #include "alloc-pool.h"
>> +#include "cgraph_summary.h"
>>   #include "ipa-prop.h"
>>   #include "lto-streamer.h"
>>   #include "data-streamer.h"
>> @@ -910,7 +911,7 @@ evaluate_properties_for_edge (struct cgraph_edge *e, bool inline_p,
>>     if (known_binfos_ptr)
>>       known_binfos_ptr->create (0);
>>
>> -  if (ipa_node_params_vector.exists ()
>> +  if (ipa_node_params_summary
>>         && !e->call_stmt_cannot_inline_p
>>         && ((clause_ptr && info->conds) || known_vals_ptr || known_binfos_ptr))
>>       {
>> @@ -1130,7 +1131,7 @@ inline_node_duplication_hook (struct cgraph_node *src,
>>
>>     /* When there are any replacements in the function body, see if we can figure
>>        out that something was optimized out.  */
>> -  if (ipa_node_params_vector.exists () && dst->clone.tree_map)
>> +  if (ipa_node_params_summary && dst->clone.tree_map)
>>       {
>>         vec<size_time_entry, va_gc> *entry = info->entry;
>>         /* Use SRC parm info since it may not be copied yet.  */
>> @@ -2476,7 +2477,7 @@ estimate_function_body_sizes (struct cgraph_node *node, bool early)
>>         calculate_dominance_info (CDI_DOMINATORS);
>>         loop_optimizer_init (LOOPS_NORMAL | LOOPS_HAVE_RECORDED_EXITS);
>>
>> -      if (ipa_node_params_vector.exists ())
>> +      if (ipa_node_params_summary)
>>       {
>>         parms_info = IPA_NODE_REF (node);
>>         nonconstant_names.safe_grow_cleared
>> @@ -2624,7 +2625,7 @@ estimate_function_body_sizes (struct cgraph_node *node, bool early)
>>             nonconstant_names[SSA_NAME_VERSION (gimple_call_lhs (stmt))]
>>               = false_p;
>>           }
>> -          if (ipa_node_params_vector.exists ())
>> +          if (ipa_node_params_summary)
>>           {
>>             int count = gimple_call_num_args (stmt);
>>             int i;
>> @@ -3367,7 +3368,7 @@ static void
>>   remap_edge_change_prob (struct cgraph_edge *inlined_edge,
>>               struct cgraph_edge *edge)
>>   {
>> -  if (ipa_node_params_vector.exists ())
>> +  if (ipa_node_params_summary)
>>       {
>>         int i;
>>         struct ipa_edge_args *args = IPA_EDGE_REF (edge);
>> @@ -3523,7 +3524,7 @@ inline_merge_summary (struct cgraph_edge *edge)
>>     else
>>       toplev_predicate = true_predicate ();
>>
>> -  if (ipa_node_params_vector.exists () && callee_info->conds)
>> +  if (ipa_node_params_summary && callee_info->conds)
>>       {
>>         struct ipa_edge_args *args = IPA_EDGE_REF (edge);
>>         int count = ipa_get_cs_argument_count (args);
>> diff --git a/gcc/ipa-inline-transform.c b/gcc/ipa-inline-transform.c
>> index dbc56c5..fd700ff 100644
>> --- a/gcc/ipa-inline-transform.c
>> +++ b/gcc/ipa-inline-transform.c
>> @@ -51,6 +51,7 @@ along with GCC; see the file COPYING3.  If not see
>>   #include "ipa-ref.h"
>>   #include "cgraph.h"
>>   #include "alloc-pool.h"
>> +#include "cgraph_summary.h"
>>   #include "ipa-prop.h"
>>   #include "ipa-inline.h"
>>   #include "tree-inline.h"
>> diff --git a/gcc/ipa-inline.c b/gcc/ipa-inline.c
>> index 5c97815..8a08cd4 100644
>> --- a/gcc/ipa-inline.c
>> +++ b/gcc/ipa-inline.c
>> @@ -129,6 +129,7 @@ along with GCC; see the file COPYING3.  If not see
>>   #include "ipa-ref.h"
>>   #include "cgraph.h"
>>   #include "alloc-pool.h"
>> +#include "cgraph_summary.h"
>>   #include "ipa-prop.h"
>>   #include "except.h"
>>   #include "target.h"
>> @@ -2400,7 +2401,7 @@ early_inliner (function *fun)
>>        it.  This may confuse ourself when early inliner decide to inline call to
>>        function clone, because function clones don't have parameter list in
>>        ipa-prop matching their signature.  */
>> -  if (ipa_node_params_vector.exists ())
>> +  if (ipa_node_params_summary)
>>       return 0;
>>
>>   #ifdef ENABLE_CHECKING
>> diff --git a/gcc/ipa-polymorphic-call.c b/gcc/ipa-polymorphic-call.c
>> index 33dd1a8..e0555f2 100644
>> --- a/gcc/ipa-polymorphic-call.c
>> +++ b/gcc/ipa-polymorphic-call.c
>> @@ -52,6 +52,7 @@ along with GCC; see the file COPYING3.  If not see
>>   #include "gimple-expr.h"
>>   #include "gimple.h"
>>   #include "alloc-pool.h"
>> +#include "cgraph_summary.h"
>>   #include "ipa-prop.h"
>>   #include "ipa-inline.h"
>>   #include "diagnostic.h"
>> diff --git a/gcc/ipa-profile.c b/gcc/ipa-profile.c
>> index b83d1cf..4fdee09 100644
>> --- a/gcc/ipa-profile.c
>> +++ b/gcc/ipa-profile.c
>> @@ -82,6 +82,7 @@ along with GCC; see the file COPYING3.  If not see
>>   #include "tree-inline.h"
>>   #include "lto-streamer.h"
>>   #include "data-streamer.h"
>> +#include "cgraph_summary.h"
>>   #include "ipa-prop.h"
>>   #include "ipa-inline.h"
>>
>> diff --git a/gcc/ipa-prop.c b/gcc/ipa-prop.c
>> index db85c7d..ce9745e 100644
>> --- a/gcc/ipa-prop.c
>> +++ b/gcc/ipa-prop.c
>> @@ -54,6 +54,7 @@ along with GCC; see the file COPYING3.  If not see
>>   #include "ipa-ref.h"
>>   #include "cgraph.h"
>>   #include "alloc-pool.h"
>> +#include "cgraph_summary.h"
>>   #include "ipa-prop.h"
>>   #include "bitmap.h"
>>   #include "gimple-ssa.h"
>> @@ -119,7 +120,7 @@ struct func_body_info
>>     cgraph_node *node;
>>
>>     /* Its info.  */
>> -  struct ipa_node_params *info;
>> +  ipa_node_params *info;
>>
>>     /* Information about individual BBs. */
>>     vec<ipa_bb_info> bb_infos;
>> @@ -131,7 +132,8 @@ struct func_body_info
>>     unsigned int aa_walked;
>>   };
>>
>> -/* Vector where the parameter infos are actually stored. */
>> +/* Callgraph summary where the parameter infos are actually stored. */
>> +ipa_node_params_cgraph_summary *ipa_node_params_summary = NULL;
>>   vec<ipa_node_params> ipa_node_params_vector;
>>   /* Vector of known aggregate values in cloned nodes.  */
>>   vec<ipa_agg_replacement_value_p, va_gc> *ipa_node_agg_replacements;
>> @@ -139,19 +141,17 @@ vec<ipa_agg_replacement_value_p, va_gc> *ipa_node_agg_replacements;
>>   vec<ipa_edge_args, va_gc> *ipa_edge_args_vector;
>>
>>   /* Holders of ipa cgraph hooks: */
>> -static struct cgraph_edge_hook_list *edge_removal_hook_holder;
>> -static struct cgraph_node_hook_list *node_removal_hook_holder;
>> -static struct cgraph_2edge_hook_list *edge_duplication_hook_holder;
>> -static struct cgraph_2node_hook_list *node_duplication_hook_holder;
>> -static struct cgraph_node_hook_list *function_insertion_hook_holder;
>> +static cgraph_edge_hook_list *edge_removal_hook_holder;
>> +static cgraph_2edge_hook_list *edge_duplication_hook_holder;
>> +static cgraph_node_hook_list *function_insertion_hook_holder;
>>
>>   /* Description of a reference to an IPA constant.  */
>>   struct ipa_cst_ref_desc
>>   {
>>     /* Edge that corresponds to the statement which took the reference.  */
>> -  struct cgraph_edge *cs;
>> +  cgraph_edge *cs;
>>     /* Linked list of duplicates created when call graph edges are cloned.  */
>> -  struct ipa_cst_ref_desc *next_duplicate;
>> +  ipa_cst_ref_desc *next_duplicate;
>>     /* Number of references in IPA structures, IPA_UNDESCRIBED_USE if the value
>>        if out of control.  */
>>     int refcount;
>> @@ -165,10 +165,10 @@ static alloc_pool ipa_refdesc_pool;
>>      with NODE should prevent us from analyzing it for the purposes of IPA-CP.  */
>>
>>   static bool
>> -ipa_func_spec_opts_forbid_analysis_p (struct cgraph_node *node)
>> +ipa_func_spec_opts_forbid_analysis_p (cgraph_node *node)
>>   {
>>     tree fs_opts = DECL_FUNCTION_SPECIFIC_OPTIMIZATION (node->decl);
>> -  struct cl_optimization *os;
>> +  cl_optimization *os;
>>
>>     if (!fs_opts)
>>       return false;
>> @@ -196,7 +196,7 @@ ipa_get_param_decl_index_1 (vec<ipa_param_descriptor> descriptors, tree ptree)
>>      to INFO.  */
>>
>>   int
>> -ipa_get_param_decl_index (struct ipa_node_params *info, tree ptree)
>> +ipa_get_param_decl_index (ipa_node_params *info, tree ptree)
>>   {
>>     return ipa_get_param_decl_index_1 (info->descriptors, ptree);
>>   }
>> @@ -205,7 +205,7 @@ ipa_get_param_decl_index (struct ipa_node_params *info, tree ptree)
>>      NODE.  */
>>
>>   static void
>> -ipa_populate_param_decls (struct cgraph_node *node,
>> +ipa_populate_param_decls (cgraph_node *node,
>>                 vec<ipa_param_descriptor> &descriptors)
>>   {
>>     tree fndecl;
>> @@ -246,7 +246,7 @@ count_formal_params (tree fndecl)
>>      using ipa_initialize_node_params. */
>>
>>   void
>> -ipa_dump_param (FILE *file, struct ipa_node_params *info, int i)
>> +ipa_dump_param (FILE *file, ipa_node_params *info, int i)
>>   {
>>     fprintf (file, "param #%i", i);
>>     if (info->descriptors[i].decl)
>> @@ -260,9 +260,9 @@ ipa_dump_param (FILE *file, struct ipa_node_params *info, int i)
>>      to hold PARAM_COUNT parameters.  */
>>
>>   void
>> -ipa_alloc_node_params (struct cgraph_node *node, int param_count)
>> +ipa_alloc_node_params (cgraph_node *node, int param_count)
>>   {
>> -  struct ipa_node_params *info = IPA_NODE_REF (node);
>> +  ipa_node_params *info = IPA_NODE_REF (node);
>>
>>     if (!info->descriptors.exists () && param_count)
>>       info->descriptors.safe_grow_cleared (param_count);
>> @@ -273,9 +273,9 @@ ipa_alloc_node_params (struct cgraph_node *node, int param_count)
>>      param_decls.  */
>>
>>   void
>> -ipa_initialize_node_params (struct cgraph_node *node)
>> +ipa_initialize_node_params (cgraph_node *node)
>>   {
>> -  struct ipa_node_params *info = IPA_NODE_REF (node);
>> +  ipa_node_params *info = IPA_NODE_REF (node);
>>
>>     if (!info->descriptors.exists ())
>>       {
>> @@ -287,14 +287,14 @@ ipa_initialize_node_params (struct cgraph_node *node)
>>   /* Print the jump functions associated with call graph edge CS to file F.  */
>>
>>   static void
>> -ipa_print_node_jump_functions_for_edge (FILE *f, struct cgraph_edge *cs)
>> +ipa_print_node_jump_functions_for_edge (FILE *f, cgraph_edge *cs)
>>   {
>>     int i, count;
>>
>>     count = ipa_get_cs_argument_count (IPA_EDGE_REF (cs));
>>     for (i = 0; i < count; i++)
>>       {
>> -      struct ipa_jump_func *jump_func;
>> +      ipa_jump_func *jump_func;
>>         enum jump_func_type type;
>>
>>         jump_func = ipa_get_ith_jump_func (IPA_EDGE_REF (cs), i);
>> @@ -360,7 +360,7 @@ ipa_print_node_jump_functions_for_edge (FILE *f, struct cgraph_edge *cs)
>>
>>         if (jump_func->agg.items)
>>       {
>> -      struct ipa_agg_jf_item *item;
>> +      ipa_agg_jf_item *item;
>>         int j;
>>
>>         fprintf (f, "         Aggregate passed by %s:\n",
>> @@ -390,9 +390,9 @@ ipa_print_node_jump_functions_for_edge (FILE *f, struct cgraph_edge *cs)
>>      NODE to file F.  */
>>
>>   void
>> -ipa_print_node_jump_functions (FILE *f, struct cgraph_node *node)
>> +ipa_print_node_jump_functions (FILE *f, cgraph_node *node)
>>   {
>> -  struct cgraph_edge *cs;
>> +  cgraph_edge *cs;
>>
>>     fprintf (f, "  Jump functions of caller  %s/%i:\n", node->name (),
>>          node->order);
>> @@ -410,7 +410,7 @@ ipa_print_node_jump_functions (FILE *f, struct cgraph_node *node)
>>
>>     for (cs = node->indirect_calls; cs; cs = cs->next_callee)
>>       {
>> -      struct cgraph_indirect_call_info *ii;
>> +      cgraph_indirect_call_info *ii;
>>         if (!ipa_edge_args_info_available_for_edge_p (cs))
>>       continue;
>>
>> @@ -445,7 +445,7 @@ ipa_print_node_jump_functions (FILE *f, struct cgraph_node *node)
>>   void
>>   ipa_print_all_jump_functions (FILE *f)
>>   {
>> -  struct cgraph_node *node;
>> +  cgraph_node *node;
>>
>>     fprintf (f, "\nJump functions:\n");
>>     FOR_EACH_FUNCTION (node)
>> @@ -457,7 +457,7 @@ ipa_print_all_jump_functions (FILE *f)
>>   /* Set JFUNC to be a known type jump function.  */
>>
>>   static void
>> -ipa_set_jf_known_type (struct ipa_jump_func *jfunc, HOST_WIDE_INT offset,
>> +ipa_set_jf_known_type (ipa_jump_func *jfunc, HOST_WIDE_INT offset,
>>                  tree base_type, tree component_type)
>>   {
>>     /* Recording and propagating main variants increases change that types
>> @@ -480,8 +480,8 @@ ipa_set_jf_known_type (struct ipa_jump_func *jfunc, HOST_WIDE_INT offset,
>>      combination code).  The two functions will share their rdesc.  */
>>
>>   static void
>> -ipa_set_jf_cst_copy (struct ipa_jump_func *dst,
>> -             struct ipa_jump_func *src)
>> +ipa_set_jf_cst_copy (ipa_jump_func *dst,
>> +             ipa_jump_func *src)
>>
>>   {
>>     gcc_checking_assert (src->type == IPA_JF_CONST);
>> @@ -492,8 +492,8 @@ ipa_set_jf_cst_copy (struct ipa_jump_func *dst,
>>   /* Set JFUNC to be a constant jmp function.  */
>>
>>   static void
>> -ipa_set_jf_constant (struct ipa_jump_func *jfunc, tree constant,
>> -             struct cgraph_edge *cs)
>> +ipa_set_jf_constant (ipa_jump_func *jfunc, tree constant,
>> +             cgraph_edge *cs)
>>   {
>>     constant = unshare_expr (constant);
>>     if (constant && EXPR_P (constant))
>> @@ -504,12 +504,12 @@ ipa_set_jf_constant (struct ipa_jump_func *jfunc, tree constant,
>>     if (TREE_CODE (constant) == ADDR_EXPR
>>         && TREE_CODE (TREE_OPERAND (constant, 0)) == FUNCTION_DECL)
>>       {
>> -      struct ipa_cst_ref_desc *rdesc;
>> +      ipa_cst_ref_desc *rdesc;
>>         if (!ipa_refdesc_pool)
>>       ipa_refdesc_pool = create_alloc_pool ("IPA-PROP ref descriptions",
>> -                    sizeof (struct ipa_cst_ref_desc), 32);
>> +                    sizeof (ipa_cst_ref_desc), 32);
>>
>> -      rdesc = (struct ipa_cst_ref_desc *) pool_alloc (ipa_refdesc_pool);
>> +      rdesc = (ipa_cst_ref_desc *) pool_alloc (ipa_refdesc_pool);
>>         rdesc->cs = cs;
>>         rdesc->next_duplicate = NULL;
>>         rdesc->refcount = 1;
>> @@ -521,7 +521,7 @@ ipa_set_jf_constant (struct ipa_jump_func *jfunc, tree constant,
>>
>>   /* Set JFUNC to be a simple pass-through jump function.  */
>>   static void
>> -ipa_set_jf_simple_pass_through (struct ipa_jump_func *jfunc, int formal_id,
>> +ipa_set_jf_simple_pass_through (ipa_jump_func *jfunc, int formal_id,
>>                   bool agg_preserved, bool type_preserved)
>>   {
>>     jfunc->type = IPA_JF_PASS_THROUGH;
>> @@ -535,7 +535,7 @@ ipa_set_jf_simple_pass_through (struct ipa_jump_func *jfunc, int formal_id,
>>   /* Set JFUNC to be an arithmetic pass through jump function.  */
>>
>>   static void
>> -ipa_set_jf_arith_pass_through (struct ipa_jump_func *jfunc, int formal_id,
>> +ipa_set_jf_arith_pass_through (ipa_jump_func *jfunc, int formal_id,
>>                      tree operand, enum tree_code operation)
>>   {
>>     jfunc->type = IPA_JF_PASS_THROUGH;
>> @@ -549,7 +549,7 @@ ipa_set_jf_arith_pass_through (struct ipa_jump_func *jfunc, int formal_id,
>>   /* Set JFUNC to be an ancestor jump function.  */
>>
>>   static void
>> -ipa_set_ancestor_jf (struct ipa_jump_func *jfunc, HOST_WIDE_INT offset,
>> +ipa_set_ancestor_jf (ipa_jump_func *jfunc, HOST_WIDE_INT offset,
>>                tree type, int formal_id, bool agg_preserved,
>>                bool type_preserved)
>>   {
>> @@ -572,7 +572,7 @@ ipa_set_ancestor_jf (struct ipa_jump_func *jfunc, HOST_WIDE_INT offset,
>>      jump function.  */
>>
>>   tree
>> -ipa_binfo_from_known_type_jfunc (struct ipa_jump_func *jfunc)
>> +ipa_binfo_from_known_type_jfunc (ipa_jump_func *jfunc)
>>   {
>>     if (!RECORD_OR_UNION_TYPE_P (jfunc->value.known_type.base_type))
>>       return NULL_TREE;
>> @@ -602,8 +602,8 @@ ipa_binfo_from_known_type_jfunc (struct ipa_jump_func *jfunc)
>>   /* Get IPA BB information about the given BB.  FBI is the context of analyzis
>>      of this function body.  */
>>
>> -static struct ipa_bb_info *
>> -ipa_get_bb_info (struct func_body_info *fbi, basic_block bb)
>> +static ipa_bb_info *
>> +ipa_get_bb_info (func_body_info *fbi, basic_block bb)
>>   {
>>     gcc_checking_assert (fbi);
>>     return &fbi->bb_infos[bb->index];
>> @@ -700,7 +700,7 @@ stmt_may_be_vtbl_ptr_store (gimple stmt)
>>      identified, return the type.  Otherwise return NULL_TREE.  */
>>
>>   static tree
>> -extr_type_from_vtbl_ptr_store (gimple stmt, struct prop_type_change_info *tci)
>> +extr_type_from_vtbl_ptr_store (gimple stmt, prop_type_change_info *tci)
>>   {
>>     HOST_WIDE_INT offset, size, max_size;
>>     tree lhs, rhs, base, binfo;
>> @@ -752,7 +752,7 @@ static bool
>>   check_stmt_for_type_change (ao_ref *ao ATTRIBUTE_UNUSED, tree vdef, void *data)
>>   {
>>     gimple stmt = SSA_NAME_DEF_STMT (vdef);
>> -  struct prop_type_change_info *tci = (struct prop_type_change_info *) data;
>> +  prop_type_change_info *tci = (prop_type_change_info *) data;
>>
>>     if (stmt_may_be_vtbl_ptr_store (stmt))
>>       {
>> @@ -847,10 +847,10 @@ param_type_may_change_p (tree function, tree arg, gimple call)
>>
>>   static bool
>>   detect_type_change_from_memory_writes (tree arg, tree base, tree comp_type,
>> -                       gimple call, struct ipa_jump_func *jfunc,
>> +                       gimple call, ipa_jump_func *jfunc,
>>                          HOST_WIDE_INT offset)
>>   {
>> -  struct prop_type_change_info tci;
>> +  prop_type_change_info tci;
>>     ao_ref ao;
>>     bool entry_reached = false;
>>
>> @@ -908,7 +908,7 @@ detect_type_change_from_memory_writes (tree arg, tree base, tree comp_type,
>>
>>   static bool
>>   detect_type_change (tree arg, tree base, tree comp_type, gimple call,
>> -            struct ipa_jump_func *jfunc, HOST_WIDE_INT offset)
>> +            ipa_jump_func *jfunc, HOST_WIDE_INT offset)
>>   {
>>     if (!flag_devirtualize)
>>       return false;
>> @@ -928,7 +928,7 @@ detect_type_change (tree arg, tree base, tree comp_type, gimple call,
>>
>>   static bool
>>   detect_type_change_ssa (tree arg, tree comp_type,
>> -            gimple call, struct ipa_jump_func *jfunc)
>> +            gimple call, ipa_jump_func *jfunc)
>>   {
>>     gcc_checking_assert (TREE_CODE (arg) == SSA_NAME);
>>     if (!flag_devirtualize
>> @@ -961,7 +961,7 @@ mark_modified (ao_ref *ao ATTRIBUTE_UNUSED, tree vdef ATTRIBUTE_UNUSED,
>>      should really just start giving up.  */
>>
>>   static bool
>> -aa_overwalked (struct func_body_info *fbi)
>> +aa_overwalked (func_body_info *fbi)
>>   {
>>     gcc_checking_assert (fbi);
>>     return fbi->aa_walked > (unsigned) PARAM_VALUE (PARAM_IPA_MAX_AA_STEPS);
>> @@ -970,8 +970,8 @@ aa_overwalked (struct func_body_info *fbi)
>>   /* Find the nearest valid aa status for parameter specified by INDEX that
>>      dominates BB.  */
>>
>> -static struct param_aa_status *
>> -find_dominating_aa_status (struct func_body_info *fbi, basic_block bb,
>> +static param_aa_status *
>> +find_dominating_aa_status (func_body_info *fbi, basic_block bb,
>>                  int index)
>>   {
>>     while (true)
>> @@ -979,7 +979,7 @@ find_dominating_aa_status (struct func_body_info *fbi, basic_block bb,
>>         bb = get_immediate_dominator (CDI_DOMINATORS, bb);
>>         if (!bb)
>>       return NULL;
>> -      struct ipa_bb_info *bi = ipa_get_bb_info (fbi, bb);
>> +      ipa_bb_info *bi = ipa_get_bb_info (fbi, bb);
>>         if (!bi->param_aa_statuses.is_empty ()
>>         && bi->param_aa_statuses[index].valid)
>>       return &bi->param_aa_statuses[index];
>> @@ -990,21 +990,21 @@ find_dominating_aa_status (struct func_body_info *fbi, basic_block bb,
>>      structures and/or intialize the result with a dominating description as
>>      necessary.  */
>>
>> -static struct param_aa_status *
>> -parm_bb_aa_status_for_bb (struct func_body_info *fbi, basic_block bb,
>> +static param_aa_status *
>> +parm_bb_aa_status_for_bb (func_body_info *fbi, basic_block bb,
>>                 int index)
>>   {
>>     gcc_checking_assert (fbi);
>> -  struct ipa_bb_info *bi = ipa_get_bb_info (fbi, bb);
>> +  ipa_bb_info *bi = ipa_get_bb_info (fbi, bb);
>>     if (bi->param_aa_statuses.is_empty ())
>>       bi->param_aa_statuses.safe_grow_cleared (fbi->param_count);
>> -  struct param_aa_status *paa = &bi->param_aa_statuses[index];
>> +  param_aa_status *paa = &bi->param_aa_statuses[index];
>>     if (!paa->valid)
>>       {
>>         gcc_checking_assert (!paa->parm_modified
>>                  && !paa->ref_modified
>>                  && !paa->pt_modified);
>> -      struct param_aa_status *dom_paa;
>> +      param_aa_status *dom_paa;
>>         dom_paa = find_dominating_aa_status (fbi, bb, index);
>>         if (dom_paa)
>>       *paa = *dom_paa;
>> @@ -1021,10 +1021,10 @@ parm_bb_aa_status_for_bb (struct func_body_info *fbi, basic_block bb,
>>      gathered but do not survive the summary building stage.  */
>>
>>   static bool
>> -parm_preserved_before_stmt_p (struct func_body_info *fbi, int index,
>> +parm_preserved_before_stmt_p (func_body_info *fbi, int index,
>>                     gimple stmt, tree parm_load)
>>   {
>> -  struct param_aa_status *paa;
>> +  param_aa_status *paa;
>>     bool modified = false;
>>     ao_ref refd;
>>
>> @@ -1060,7 +1060,7 @@ parm_preserved_before_stmt_p (struct func_body_info *fbi, int index,
>>      modified.  Otherwise return -1.  */
>>
>>   static int
>> -load_from_unmodified_param (struct func_body_info *fbi,
>> +load_from_unmodified_param (func_body_info *fbi,
>>                   vec<ipa_param_descriptor> descriptors,
>>                   gimple stmt)
>>   {
>> @@ -1087,10 +1087,10 @@ load_from_unmodified_param (struct func_body_info *fbi,
>>      before reaching statement STMT.  */
>>
>>   static bool
>> -parm_ref_data_preserved_p (struct func_body_info *fbi,
>> +parm_ref_data_preserved_p (func_body_info *fbi,
>>                  int index, gimple stmt, tree ref)
>>   {
>> -  struct param_aa_status *paa;
>> +  param_aa_status *paa;
>>     bool modified = false;
>>     ao_ref refd;
>>
>> @@ -1126,7 +1126,7 @@ parm_ref_data_preserved_p (struct func_body_info *fbi,
>>      CALL into which it is passed.  FBI describes the function body.  */
>>
>>   static bool
>> -parm_ref_data_pass_through_p (struct func_body_info *fbi, int index,
>> +parm_ref_data_pass_through_p (func_body_info *fbi, int index,
>>                     gimple call, tree parm)
>>   {
>>     bool modified = false;
>> @@ -1140,7 +1140,7 @@ parm_ref_data_pass_through_p (struct func_body_info *fbi, int index,
>>         || aa_overwalked (fbi))
>>       return false;
>>
>> -  struct param_aa_status *paa = parm_bb_aa_status_for_bb (fbi, gimple_bb (call),
>> +  param_aa_status *paa = parm_bb_aa_status_for_bb (fbi, gimple_bb (call),
>>                                 index);
>>     if (paa->pt_modified)
>>       return false;
>> @@ -1165,7 +1165,7 @@ parm_ref_data_pass_through_p (struct func_body_info *fbi, int index,
>>      reference respectively.  */
>>
>>   static bool
>> -ipa_load_from_parm_agg_1 (struct func_body_info *fbi,
>> +ipa_load_from_parm_agg_1 (func_body_info *fbi,
>>                 vec<ipa_param_descriptor> descriptors,
>>                 gimple stmt, tree op, int *index_p,
>>                 HOST_WIDE_INT *offset_p, HOST_WIDE_INT *size_p,
>> @@ -1240,7 +1240,7 @@ ipa_load_from_parm_agg_1 (struct func_body_info *fbi,
>>      pointer, for users outside of this file.  */
>>
>>   bool
>> -ipa_load_from_parm_agg (struct ipa_node_params *info, gimple stmt,
>> +ipa_load_from_parm_agg (ipa_node_params *info, gimple stmt,
>>               tree op, int *index_p, HOST_WIDE_INT *offset_p,
>>               bool *by_ref_p)
>>   {
>> @@ -1302,9 +1302,9 @@ ipa_load_from_parm_agg (struct ipa_node_params *info, gimple stmt,
>>      only needed for intraprocedural analysis.  */
>>
>>   static void
>> -compute_complex_assign_jump_func (struct func_body_info *fbi,
>> -                  struct ipa_node_params *info,
>> -                  struct ipa_jump_func *jfunc,
>> +compute_complex_assign_jump_func (func_body_info *fbi,
>> +                  ipa_node_params *info,
>> +                  ipa_jump_func *jfunc,
>>                     gimple call, gimple stmt, tree name,
>>                     tree param_type)
>>   {
>> @@ -1458,9 +1458,9 @@ get_ancestor_addr_info (gimple assign, tree *obj_p, HOST_WIDE_INT *offset)
>>        return D.1879_6;  */
>>
>>   static void
>> -compute_complex_ancestor_jump_func (struct func_body_info *fbi,
>> -                    struct ipa_node_params *info,
>> -                    struct ipa_jump_func *jfunc,
>> +compute_complex_ancestor_jump_func (func_body_info *fbi,
>> +                    ipa_node_params *info,
>> +                    ipa_jump_func *jfunc,
>>                       gimple call, gimple phi, tree param_type)
>>   {
>>     HOST_WIDE_INT offset;
>> @@ -1531,7 +1531,7 @@ compute_complex_ancestor_jump_func (struct func_body_info *fbi,
>>      EXPECTED_TYPE represents a type the argument should be in  */
>>
>>   static void
>> -compute_known_type_jump_func (tree op, struct ipa_jump_func *jfunc,
>> +compute_known_type_jump_func (tree op, ipa_jump_func *jfunc,
>>                     gimple call, tree expected_type)
>>   {
>>     HOST_WIDE_INT offset, size, max_size;
>> @@ -1629,7 +1629,7 @@ struct ipa_known_agg_contents_list
>>     /* Known constant value or NULL if the contents is known to be unknown.  */
>>     tree constant;
>>     /* Pointer to the next structure in the list.  */
>> -  struct ipa_known_agg_contents_list *next;
>> +  ipa_known_agg_contents_list *next;
>>   };
>>
>>   /* Find the proper place in linked list of ipa_known_agg_contents_list
>> @@ -1637,13 +1637,13 @@ struct ipa_known_agg_contents_list
>>      unless there is a partial overlap, in which case return NULL, or such
>>      element is already there, in which case set *ALREADY_THERE to true.  */
>>
>> -static struct ipa_known_agg_contents_list **
>> -get_place_in_agg_contents_list (struct ipa_known_agg_contents_list **list,
>> +static ipa_known_agg_contents_list **
>> +get_place_in_agg_contents_list (ipa_known_agg_contents_list **list,
>>                   HOST_WIDE_INT lhs_offset,
>>                   HOST_WIDE_INT lhs_size,
>>                   bool *already_there)
>>   {
>> -  struct ipa_known_agg_contents_list **p = list;
>> +  ipa_known_agg_contents_list **p = list;
>>     while (*p && (*p)->offset < lhs_offset)
>>       {
>>         if ((*p)->offset + (*p)->size > lhs_offset)
>> @@ -1670,16 +1670,16 @@ get_place_in_agg_contents_list (struct ipa_known_agg_contents_list **list,
>>      is ARG_OFFSET and store it into JFUNC.  */
>>
>>   static void
>> -build_agg_jump_func_from_list (struct ipa_known_agg_contents_list *list,
>> +build_agg_jump_func_from_list (ipa_known_agg_contents_list *list,
>>                      int const_count, HOST_WIDE_INT arg_offset,
>> -                   struct ipa_jump_func *jfunc)
>> +                   ipa_jump_func *jfunc)
>>   {
>>     vec_alloc (jfunc->agg.items, const_count);
>>     while (list)
>>       {
>>         if (list->constant)
>>       {
>> -      struct ipa_agg_jf_item item;
>> +      ipa_agg_jf_item item;
>>         item.offset = list->offset - arg_offset;
>>         gcc_assert ((item.offset % BITS_PER_UNIT) == 0);
>>         item.value = unshare_expr_without_location (list->constant);
>> @@ -1697,9 +1697,9 @@ build_agg_jump_func_from_list (struct ipa_known_agg_contents_list *list,
>>
>>   static void
>>   determine_locally_known_aggregate_parts (gimple call, tree arg, tree arg_type,
>> -                     struct ipa_jump_func *jfunc)
>> +                     ipa_jump_func *jfunc)
>>   {
>> -  struct ipa_known_agg_contents_list *list = NULL;
>> +  ipa_known_agg_contents_list *list = NULL;
>>     int item_count = 0, const_count = 0;
>>     HOST_WIDE_INT arg_offset, arg_size;
>>     gimple_stmt_iterator gsi;
>> @@ -1774,7 +1774,7 @@ determine_locally_known_aggregate_parts (gimple call, tree arg, tree arg_type,
>>     gsi_prev (&gsi);
>>     for (; !gsi_end_p (gsi); gsi_prev (&gsi))
>>       {
>> -      struct ipa_known_agg_contents_list *n, **p;
>> +      ipa_known_agg_contents_list *n, **p;
>>         gimple stmt = gsi_stmt (gsi);
>>         HOST_WIDE_INT lhs_offset, lhs_size, lhs_max_size;
>>         tree lhs, rhs, lhs_base;
>> @@ -1821,7 +1821,7 @@ determine_locally_known_aggregate_parts (gimple call, tree arg, tree arg_type,
>>       continue;
>>
>>         rhs = get_ssa_def_if_simple_copy (rhs);
>> -      n = XALLOCA (struct ipa_known_agg_contents_list);
>> +      n = XALLOCA (ipa_known_agg_contents_list);
>>         n->size = lhs_size;
>>         n->offset = lhs_offset;
>>         if (is_gimple_ip_invariant (rhs))
>> @@ -1852,7 +1852,7 @@ determine_locally_known_aggregate_parts (gimple call, tree arg, tree arg_type,
>>   }
>>
>>   static tree
>> -ipa_get_callee_param_type (struct cgraph_edge *e, int i)
>> +ipa_get_callee_param_type (cgraph_edge *e, int i)
>>   {
>>     int n;
>>     tree type = (e->callee
>> @@ -1887,11 +1887,11 @@ ipa_get_callee_param_type (struct cgraph_edge *e, int i)
>>      to this callsite.  */
>>
>>   static void
>> -ipa_compute_jump_functions_for_edge (struct func_body_info *fbi,
>> -                     struct cgraph_edge *cs)
>> +ipa_compute_jump_functions_for_edge (func_body_info *fbi,
>> +                     cgraph_edge *cs)
>>   {
>> -  struct ipa_node_params *info = IPA_NODE_REF (cs->caller);
>> -  struct ipa_edge_args *args = IPA_EDGE_REF (cs);
>> +  ipa_node_params *info = IPA_NODE_REF (cs->caller);
>> +  ipa_edge_args *args = IPA_EDGE_REF (cs);
>>     gimple call = cs->call_stmt;
>>     int n, arg_num = gimple_call_num_args (call);
>>     bool useful_context = false;
>> @@ -1909,13 +1909,13 @@ ipa_compute_jump_functions_for_edge (struct func_body_info *fbi,
>>
>>     for (n = 0; n < arg_num; n++)
>>       {
>> -      struct ipa_jump_func *jfunc = ipa_get_ith_jump_func (args, n);
>> +      ipa_jump_func *jfunc = ipa_get_ith_jump_func (args, n);
>>         tree arg = gimple_call_arg (call, n);
>>         tree param_type = ipa_get_callee_param_type (cs, n);
>>         if (flag_devirtualize && POINTER_TYPE_P (TREE_TYPE (arg)))
>>       {
>>         tree instance;
>> -      struct ipa_polymorphic_call_context context (cs->caller->decl,
>> +      ipa_polymorphic_call_context context (cs->caller->decl,
>>                                  arg, cs->call_stmt,
>>                                  &instance);
>>         context.get_dynamic_type (instance, arg, NULL, cs->call_stmt);
>> @@ -2003,15 +2003,15 @@ ipa_compute_jump_functions_for_edge (struct func_body_info *fbi,
>>      from BB.  */
>>
>>   static void
>> -ipa_compute_jump_functions_for_bb (struct func_body_info *fbi, basic_block bb)
>> +ipa_compute_jump_functions_for_bb (func_body_info *fbi, basic_block bb)
>>   {
>> -  struct ipa_bb_info *bi = ipa_get_bb_info (fbi, bb);
>> +  ipa_bb_info *bi = ipa_get_bb_info (fbi, bb);
>>     int i;
>> -  struct cgraph_edge *cs;
>> +  cgraph_edge *cs;
>>
>>     FOR_EACH_VEC_ELT_REVERSE (bi->cg_edges, i, cs)
>>       {
>> -      struct cgraph_node *callee = cs->callee;
>> +      cgraph_node *callee = cs->callee;
>>
>>         if (callee)
>>       {
>> @@ -2093,10 +2093,10 @@ ipa_is_ssa_with_stmt_def (tree t)
>>      call to a parameter number PARAM_INDEX.  NODE is the caller.  Return the
>>      indirect call graph edge.  */
>>
>> -static struct cgraph_edge *
>> -ipa_note_param_call (struct cgraph_node *node, int param_index, gimple stmt)
>> +static cgraph_edge *
>> +ipa_note_param_call (cgraph_node *node, int param_index, gimple stmt)
>>   {
>> -  struct cgraph_edge *cs;
>> +  cgraph_edge *cs;
>>
>>     cs = node->get_edge (stmt);
>>     cs->indirect_info->param_index = param_index;
>> @@ -2165,10 +2165,10 @@ ipa_note_param_call (struct cgraph_node *node, int param_index, gimple stmt)
>>      passed by value or reference.  */
>>
>>   static void
>> -ipa_analyze_indirect_call_uses (struct func_body_info *fbi, gimple call,
>> +ipa_analyze_indirect_call_uses (func_body_info *fbi, gimple call,
>>                   tree target)
>>   {
>> -  struct ipa_node_params *info = fbi->info;
>> +  ipa_node_params *info = fbi->info;
>>     HOST_WIDE_INT offset;
>>     bool by_ref;
>>
>> @@ -2188,7 +2188,7 @@ ipa_analyze_indirect_call_uses (struct func_body_info *fbi, gimple call,
>>                      gimple_assign_rhs1 (def), &index, &offset,
>>                      NULL, &by_ref))
>>       {
>> -      struct cgraph_edge *cs = ipa_note_param_call (fbi->node, index, call);
>> +      cgraph_edge *cs = ipa_note_param_call (fbi->node, index, call);
>>         cs->indirect_info->offset = offset;
>>         cs->indirect_info->agg_contents = 1;
>>         cs->indirect_info->by_ref = by_ref;
>> @@ -2288,7 +2288,7 @@ ipa_analyze_indirect_call_uses (struct func_body_info *fbi, gimple call,
>>     if (index >= 0
>>         && parm_preserved_before_stmt_p (fbi, index, call, rec))
>>       {
>> -      struct cgraph_edge *cs = ipa_note_param_call (fbi->node, index, call);
>> +      cgraph_edge *cs = ipa_note_param_call (fbi->node, index, call);
>>         cs->indirect_info->offset = offset;
>>         cs->indirect_info->agg_contents = 1;
>>         cs->indirect_info->member_ptr = 1;
>> @@ -2303,7 +2303,7 @@ ipa_analyze_indirect_call_uses (struct func_body_info *fbi, gimple call,
>>      statement.  */
>>
>>   static void
>> -ipa_analyze_virtual_call_uses (struct func_body_info *fbi,
>> +ipa_analyze_virtual_call_uses (func_body_info *fbi,
>>                      gimple call, tree target)
>>   {
>>     tree obj = OBJ_TYPE_REF_OBJECT (target);
>> @@ -2316,10 +2316,10 @@ ipa_analyze_virtual_call_uses (struct func_body_info *fbi,
>>     if (TREE_CODE (obj) != SSA_NAME)
>>       return;
>>
>> -  struct ipa_node_params *info = fbi->info;
>> +  ipa_node_params *info = fbi->info;
>>     if (SSA_NAME_IS_DEFAULT_DEF (obj))
>>       {
>> -      struct ipa_jump_func jfunc;
>> +      ipa_jump_func jfunc;
>>         if (TREE_CODE (SSA_NAME_VAR (obj)) != PARM_DECL)
>>       return;
>>
>> @@ -2332,7 +2332,7 @@ ipa_analyze_virtual_call_uses (struct func_body_info *fbi,
>>       }
>>     else
>>       {
>> -      struct ipa_jump_func jfunc;
>> +      ipa_jump_func jfunc;
>>         gimple stmt = SSA_NAME_DEF_STMT (obj);
>>         tree expr;
>>
>> @@ -2347,8 +2347,8 @@ ipa_analyze_virtual_call_uses (struct func_body_info *fbi,
>>       return;
>>       }
>>
>> -  struct cgraph_edge *cs = ipa_note_param_call (fbi->node, index, call);
>> -  struct cgraph_indirect_call_info *ii = cs->indirect_info;
>> +  cgraph_edge *cs = ipa_note_param_call (fbi->node, index, call);
>> +  cgraph_indirect_call_info *ii = cs->indirect_info;
>>     ii->offset = anc_offset;
>>     ii->otr_token = tree_to_uhwi (OBJ_TYPE_REF_TOKEN (target));
>>     ii->otr_type = obj_type_ref_class (target);
>> @@ -2360,7 +2360,7 @@ ipa_analyze_virtual_call_uses (struct func_body_info *fbi,
>>      containing intermediate information about each formal parameter.  */
>>
>>   static void
>> -ipa_analyze_call_uses (struct func_body_info *fbi, gimple call)
>> +ipa_analyze_call_uses (func_body_info *fbi, gimple call)
>>   {
>>     tree target = gimple_call_fn (call);
>>
>> @@ -2369,7 +2369,7 @@ ipa_analyze_call_uses (struct func_body_info *fbi, gimple call)
>>             && !virtual_method_call_p (target)))
>>       return;
>>
>> -  struct cgraph_edge *cs = fbi->node->get_edge (call);
>> +  cgraph_edge *cs = fbi->node->get_edge (call);
>>     /* If we previously turned the call into a direct call, there is
>>        no need to analyze.  */
>>     if (cs && !cs->indirect_unknown_callee)
>> @@ -2406,7 +2406,7 @@ ipa_analyze_call_uses (struct func_body_info *fbi, gimple call)
>>      formal parameters are called.  */
>>
>>   static void
>> -ipa_analyze_stmt_uses (struct func_body_info *fbi, gimple stmt)
>> +ipa_analyze_stmt_uses (func_body_info *fbi, gimple stmt)
>>   {
>>     if (is_gimple_call (stmt))
>>       ipa_analyze_call_uses (fbi, stmt);
>> @@ -2419,7 +2419,7 @@ ipa_analyze_stmt_uses (struct func_body_info *fbi, gimple stmt)
>>   static bool
>>   visit_ref_for_mod_analysis (gimple, tree op, tree, void *data)
>>   {
>> -  struct ipa_node_params *info = (struct ipa_node_params *) data;
>> +  ipa_node_params *info = (ipa_node_params *) data;
>>
>>     op = get_base_address (op);
>>     if (op
>> @@ -2439,7 +2439,7 @@ visit_ref_for_mod_analysis (gimple, tree op, tree, void *data)
>>      the function being analyzed.  */
>>
>>   static void
>> -ipa_analyze_params_uses_in_bb (struct func_body_info *fbi, basic_block bb)
>> +ipa_analyze_params_uses_in_bb (func_body_info *fbi, basic_block bb)
>>   {
>>     gimple_stmt_iterator gsi;
>>     for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
>> @@ -2465,9 +2465,9 @@ ipa_analyze_params_uses_in_bb (struct func_body_info *fbi, basic_block bb)
>>   /* Calculate controlled uses of parameters of NODE.  */
>>
>>   static void
>> -ipa_analyze_controlled_uses (struct cgraph_node *node)
>> +ipa_analyze_controlled_uses (cgraph_node *node)
>>   {
>> -  struct ipa_node_params *info = IPA_NODE_REF (node);
>> +  ipa_node_params *info = IPA_NODE_REF (node);
>>
>>     for (int i = 0; i < ipa_get_param_count (info); i++)
>>       {
>> @@ -2510,7 +2510,7 @@ ipa_analyze_controlled_uses (struct cgraph_node *node)
>>   /* Free stuff in BI.  */
>>
>>   static void
>> -free_ipa_bb_info (struct ipa_bb_info *bi)
>> +free_ipa_bb_info (ipa_bb_info *bi)
>>   {
>>     bi->cg_edges.release ();
>>     bi->param_aa_statuses.release ();
>> @@ -2521,13 +2521,13 @@ free_ipa_bb_info (struct ipa_bb_info *bi)
>>   class analysis_dom_walker : public dom_walker
>>   {
>>   public:
>> -  analysis_dom_walker (struct func_body_info *fbi)
>> +  analysis_dom_walker (func_body_info *fbi)
>>       : dom_walker (CDI_DOMINATORS), m_fbi (fbi) {}
>>
>>     virtual void before_dom_children (basic_block);
>>
>>   private:
>> -  struct func_body_info *m_fbi;
>> +  func_body_info *m_fbi;
>>   };
>>
>>   void
>> @@ -2542,10 +2542,10 @@ analysis_dom_walker::before_dom_children (basic_block bb)
>>      with actual arguments of calls from within NODE.  */
>>
>>   void
>> -ipa_analyze_node (struct cgraph_node *node)
>> +ipa_analyze_node (cgraph_node *node)
>>   {
>> -  struct func_body_info fbi;
>> -  struct ipa_node_params *info;
>> +  func_body_info fbi;
>> +  ipa_node_params *info;
>>
>>     ipa_check_create_node_params ();
>>     ipa_check_create_edge_args ();
>> @@ -2565,7 +2565,7 @@ ipa_analyze_node (struct cgraph_node *node)
>>         return;
>>       }
>>
>> -  struct function *func = DECL_STRUCT_FUNCTION (node->decl);
>> +  function *func = DECL_STRUCT_FUNCTION (node->decl);
>>     push_cfun (func);
>>     calculate_dominance_info (CDI_DOMINATORS);
>>     ipa_initialize_node_params (node);
>> @@ -2578,13 +2578,13 @@ ipa_analyze_node (struct cgraph_node *node)
>>     fbi.param_count = ipa_get_param_count (info);
>>     fbi.aa_walked = 0;
>>
>> -  for (struct cgraph_edge *cs = node->callees; cs; cs = cs->next_callee)
>> +  for (cgraph_edge *cs = node->callees; cs; cs = cs->next_callee)
>>       {
>>         ipa_bb_info *bi = ipa_get_bb_info (&fbi, gimple_bb (cs->call_stmt));
>>         bi->cg_edges.safe_push (cs);
>>       }
>>
>> -  for (struct cgraph_edge *cs = node->indirect_calls; cs; cs = cs->next_callee)
>> +  for (cgraph_edge *cs = node->indirect_calls; cs; cs = cs->next_callee)
>>       {
>>         ipa_bb_info *bi = ipa_get_bb_info (&fbi, gimple_bb (cs->call_stmt));
>>         bi->cg_edges.safe_push (cs);
>> @@ -2593,7 +2593,7 @@ ipa_analyze_node (struct cgraph_node *node)
>>     analysis_dom_walker (&fbi).walk (ENTRY_BLOCK_PTR_FOR_FN (cfun));
>>
>>     int i;
>> -  struct ipa_bb_info *bi;
>> +  ipa_bb_info *bi;
>>     FOR_EACH_VEC_ELT (fbi.bb_infos, i, bi)
>>       free_ipa_bb_info (bi);
>>     fbi.bb_infos.release ();
>> @@ -2606,8 +2606,8 @@ ipa_analyze_node (struct cgraph_node *node)
>>      type.  */
>>
>>   static void
>> -combine_known_type_and_ancestor_jfs (struct ipa_jump_func *src,
>> -                     struct ipa_jump_func *dst)
>> +combine_known_type_and_ancestor_jfs (ipa_jump_func *src,
>> +                     ipa_jump_func *dst)
>>   {
>>     HOST_WIDE_INT combined_offset;
>>     tree combined_type;
>> @@ -2632,25 +2632,25 @@ combine_known_type_and_ancestor_jfs (struct ipa_jump_func *src,
>>      indirectly) inlined into CS->callee and that E has not been inlined.  */
>>
>>   static void
>> -update_jump_functions_after_inlining (struct cgraph_edge *cs,
>> -                      struct cgraph_edge *e)
>> +update_jump_functions_after_inlining (cgraph_edge *cs,
>> +                      cgraph_edge *e)
>>   {
>> -  struct ipa_edge_args *top = IPA_EDGE_REF (cs);
>> -  struct ipa_edge_args *args = IPA_EDGE_REF (e);
>> +  ipa_edge_args *top = IPA_EDGE_REF (cs);
>> +  ipa_edge_args *args = IPA_EDGE_REF (e);
>>     int count = ipa_get_cs_argument_count (args);
>>     int i;
>>
>>     for (i = 0; i < count; i++)
>>       {
>> -      struct ipa_jump_func *dst = ipa_get_ith_jump_func (args, i);
>> -      struct ipa_polymorphic_call_context *dst_ctx
>> +      ipa_jump_func *dst = ipa_get_ith_jump_func (args, i);
>> +      ipa_polymorphic_call_context *dst_ctx
>>       = ipa_get_ith_polymorhic_call_context (args, i);
>>
>>         if (dst->type == IPA_JF_ANCESTOR)
>>       {
>> -      struct ipa_jump_func *src;
>> +      ipa_jump_func *src;
>>         int dst_fid = dst->value.ancestor.formal_id;
>> -      struct ipa_polymorphic_call_context *src_ctx
>> +      ipa_polymorphic_call_context *src_ctx
>>           = ipa_get_ith_polymorhic_call_context (top, dst_fid);
>>
>>         /* Variable number of arguments can cause havoc if we try to access
>> @@ -2666,7 +2666,7 @@ update_jump_functions_after_inlining (struct cgraph_edge *cs,
>>
>>         if (src_ctx && !src_ctx->useless_p ())
>>           {
>> -          struct ipa_polymorphic_call_context ctx = *src_ctx;
>> +          ipa_polymorphic_call_context ctx = *src_ctx;
>>
>>             /* TODO: Make type preserved safe WRT contexts.  */
>>             if (!dst->value.ancestor.agg_preserved)
>> @@ -2683,7 +2683,7 @@ update_jump_functions_after_inlining (struct cgraph_edge *cs,
>>         if (src->agg.items
>>             && (dst->value.ancestor.agg_preserved || !src->agg.by_ref))
>>           {
>> -          struct ipa_agg_jf_item *item;
>> +          ipa_agg_jf_item *item;
>>             int j;
>>
>>             /* Currently we do not produce clobber aggregate jump functions,
>> @@ -2721,7 +2721,7 @@ update_jump_functions_after_inlining (struct cgraph_edge *cs,
>>       }
>>         else if (dst->type == IPA_JF_PASS_THROUGH)
>>       {
>> -      struct ipa_jump_func *src;
>> +      ipa_jump_func *src;
>>         /* We must check range due to calls with variable number of arguments
>>            and we cannot combine jump functions with operations.  */
>>         if (dst->value.pass_through.operation == NOP_EXPR
>> @@ -2731,12 +2731,12 @@ update_jump_functions_after_inlining (struct cgraph_edge *cs,
>>             int dst_fid = dst->value.pass_through.formal_id;
>>             src = ipa_get_ith_jump_func (top, dst_fid);
>>             bool dst_agg_p = ipa_get_jf_pass_through_agg_preserved (dst);
>> -          struct ipa_polymorphic_call_context *src_ctx
>> +          ipa_polymorphic_call_context *src_ctx
>>           = ipa_get_ith_polymorhic_call_context (top, dst_fid);
>>
>>             if (src_ctx && !src_ctx->useless_p ())
>>           {
>> -          struct ipa_polymorphic_call_context ctx = *src_ctx;
>> +          ipa_polymorphic_call_context ctx = *src_ctx;
>>
>>             /* TODO: Make type preserved safe WRT contexts.  */
>>             if (!dst->value.ancestor.agg_preserved)
>> @@ -2833,11 +2833,11 @@ update_jump_functions_after_inlining (struct cgraph_edge *cs,
>>      (SPECULATIVE)destination of an indirect edge IE and return the edge.
>>      Otherwise, return NULL.  */
>>
>> -struct cgraph_edge *
>> -ipa_make_edge_direct_to_target (struct cgraph_edge *ie, tree target,
>> +cgraph_edge *
>> +ipa_make_edge_direct_to_target (cgraph_edge *ie, tree target,
>>                   bool speculative)
>>   {
>> -  struct cgraph_node *callee;
>> +  cgraph_node *callee;
>>     struct inline_edge_summary *es = inline_edge_summary (ie);
>>     bool unreachable = false;
>>
>> @@ -2898,8 +2898,8 @@ ipa_make_edge_direct_to_target (struct cgraph_edge *ie, tree target,
>>     /* If the edge is already speculated.  */
>>     if (speculative && ie->speculative)
>>       {
>> -      struct cgraph_edge *e2;
>> -      struct ipa_ref *ref;
>> +      cgraph_edge *e2;
>> +      ipa_ref *ref;
>>         ie->speculative_call_info (e2, ie, ref);
>>         if (e2->callee->ultimate_alias_target ()
>>         != callee->ultimate_alias_target ())
>> @@ -2987,10 +2987,10 @@ ipa_make_edge_direct_to_target (struct cgraph_edge *ie, tree target,
>>      be passed by reference or by value.  */
>>
>>   tree
>> -ipa_find_agg_cst_for_param (struct ipa_agg_jump_function *agg,
>> +ipa_find_agg_cst_for_param (ipa_agg_jump_function *agg,
>>                   HOST_WIDE_INT offset, bool by_ref)
>>   {
>> -  struct ipa_agg_jf_item *item;
>> +  ipa_agg_jf_item *item;
>>     int i;
>>
>>     if (by_ref != agg->by_ref)
>> @@ -3012,10 +3012,10 @@ ipa_find_agg_cst_for_param (struct ipa_agg_jump_function *agg,
>>      successfully found and removed.  */
>>
>>   static bool
>> -remove_described_reference (symtab_node *symbol, struct ipa_cst_ref_desc *rdesc)
>> +remove_described_reference (symtab_node *symbol, ipa_cst_ref_desc *rdesc)
>>   {
>> -  struct ipa_ref *to_del;
>> -  struct cgraph_edge *origin;
>> +  ipa_ref *to_del;
>> +  cgraph_edge *origin;
>>
>>     origin = rdesc->cs;
>>     if (!origin)
>> @@ -3037,10 +3037,10 @@ remove_described_reference (symtab_node *symbol, struct ipa_cst_ref_desc *rdesc)
>>      IPA_UNDESCRIBED_USE, return the reference description, otherwise return
>>      NULL.  JFUNC must be a constant jump function.  */
>>
>> -static struct ipa_cst_ref_desc *
>> -jfunc_rdesc_usable (struct ipa_jump_func *jfunc)
>> +static ipa_cst_ref_desc *
>> +jfunc_rdesc_usable (ipa_jump_func *jfunc)
>>   {
>> -  struct ipa_cst_ref_desc *rdesc = ipa_get_jf_constant_rdesc (jfunc);
>> +  ipa_cst_ref_desc *rdesc = ipa_get_jf_constant_rdesc (jfunc);
>>     if (rdesc && rdesc->refcount != IPA_UNDESCRIBED_USE)
>>       return rdesc;
>>     else
>> @@ -3052,7 +3052,7 @@ jfunc_rdesc_usable (struct ipa_jump_func *jfunc)
>>      NULL.  */
>>
>>   static cgraph_node *
>> -cgraph_node_for_jfunc (struct ipa_jump_func *jfunc)
>> +cgraph_node_for_jfunc (ipa_jump_func *jfunc)
>>   {
>>     gcc_checking_assert (jfunc->type == IPA_JF_CONST);
>>     tree cst = ipa_get_jf_constant (jfunc);
>> @@ -3070,9 +3070,9 @@ cgraph_node_for_jfunc (struct ipa_jump_func *jfunc)
>>      reference could not be found, otherwise return true.  */
>>
>>   static bool
>> -try_decrement_rdesc_refcount (struct ipa_jump_func *jfunc)
>> +try_decrement_rdesc_refcount (ipa_jump_func *jfunc)
>>   {
>> -  struct ipa_cst_ref_desc *rdesc;
>> +  ipa_cst_ref_desc *rdesc;
>>     if (jfunc->type == IPA_JF_CONST
>>         && (rdesc = jfunc_rdesc_usable (jfunc))
>>         && --rdesc->refcount == 0)
>> @@ -3092,12 +3092,12 @@ try_decrement_rdesc_refcount (struct ipa_jump_func *jfunc)
>>      determined, return the newly direct edge, otherwise return NULL.
>>      NEW_ROOT_INFO is the node info that JFUNC lattices are relative to.  */
>>
>> -static struct cgraph_edge *
>> -try_make_edge_direct_simple_call (struct cgraph_edge *ie,
>> -                  struct ipa_jump_func *jfunc,
>> -                  struct ipa_node_params *new_root_info)
>> +static cgraph_edge *
>> +try_make_edge_direct_simple_call (cgraph_edge *ie,
>> +                  ipa_jump_func *jfunc,
>> +                  ipa_node_params *new_root_info)
>>   {
>> -  struct cgraph_edge *cs;
>> +  cgraph_edge *cs;
>>     tree target;
>>     bool agg_contents = ie->indirect_info->agg_contents;
>>
>> @@ -3130,7 +3130,7 @@ try_make_edge_direct_simple_call (struct cgraph_edge *ie,
>>      and target (the latter can be NULL) are dumped when dumping is enabled.  */
>>
>>   tree
>> -ipa_impossible_devirt_target (struct cgraph_edge *ie, tree target)
>> +ipa_impossible_devirt_target (cgraph_edge *ie, tree target)
>>   {
>>     if (dump_file)
>>       {
>> @@ -3155,11 +3155,11 @@ ipa_impossible_devirt_target (struct cgraph_edge *ie, tree target)
>>      Otherwise, return NULL.  NEW_ROOT_INFO is the node info that JFUNC lattices
>>      are relative to.  */
>>
>> -static struct cgraph_edge *
>> -try_make_edge_direct_virtual_call (struct cgraph_edge *ie,
>> -                   struct ipa_jump_func *jfunc,
>> -                   struct ipa_node_params *new_root_info,
>> -                   struct ipa_polymorphic_call_context *ctx_ptr)
>> +static cgraph_edge *
>> +try_make_edge_direct_virtual_call (cgraph_edge *ie,
>> +                   ipa_jump_func *jfunc,
>> +                   ipa_node_params *new_root_info,
>> +                   ipa_polymorphic_call_context *ctx_ptr)
>>   {
>>     tree binfo, target = NULL;
>>     bool speculative = false;
>> @@ -3172,7 +3172,7 @@ try_make_edge_direct_virtual_call (struct cgraph_edge *ie,
>>        based on knowlede of the context.  */
>>     if (ctx_ptr && !ie->indirect_info->by_ref)
>>       {
>> -      struct ipa_polymorphic_call_context ctx = *ctx_ptr;
>> +      ipa_polymorphic_call_context ctx = *ctx_ptr;
>>
>>         ctx.offset_by (ie->indirect_info->offset);
>>
>> @@ -3221,7 +3221,7 @@ try_make_edge_direct_virtual_call (struct cgraph_edge *ie,
>>
>>     if (binfo && TREE_CODE (binfo) != TREE_BINFO)
>>       {
>> -      struct ipa_polymorphic_call_context ctx (binfo,
>> +      ipa_polymorphic_call_context ctx (binfo,
>>                              ie->indirect_info->otr_type,
>>                              ie->indirect_info->offset);
>>         updated |= ie->indirect_info->context.combine_with
>> @@ -3296,13 +3296,13 @@ try_make_edge_direct_virtual_call (struct cgraph_edge *ie,
>>      unless NEW_EDGES is NULL.  Return true iff a new edge(s) were created.  */
>>
>>   static bool
>> -update_indirect_edges_after_inlining (struct cgraph_edge *cs,
>> -                      struct cgraph_node *node,
>> +update_indirect_edges_after_inlining (cgraph_edge *cs,
>> +                      cgraph_node *node,
>>                         vec<cgraph_edge *> *new_edges)
>>   {
>> -  struct ipa_edge_args *top;
>> -  struct cgraph_edge *ie, *next_ie, *new_direct_edge;
>> -  struct ipa_node_params *new_root_info;
>> +  ipa_edge_args *top;
>> +  cgraph_edge *ie, *next_ie, *new_direct_edge;
>> +  ipa_node_params *new_root_info;
>>     bool res = false;
>>
>>     ipa_check_create_edge_args ();
>> @@ -3313,8 +3313,8 @@ update_indirect_edges_after_inlining (struct cgraph_edge *cs,
>>
>>     for (ie = node->indirect_calls; ie; ie = next_ie)
>>       {
>> -      struct cgraph_indirect_call_info *ici = ie->indirect_info;
>> -      struct ipa_jump_func *jfunc;
>> +      cgraph_indirect_call_info *ici = ie->indirect_info;
>> +      ipa_jump_func *jfunc;
>>         int param_index;
>>
>>         next_ie = ie->next_callee;
>> @@ -3408,11 +3408,11 @@ update_indirect_edges_after_inlining (struct cgraph_edge *cs,
>>      created.  */
>>
>>   static bool
>> -propagate_info_to_inlined_callees (struct cgraph_edge *cs,
>> -                   struct cgraph_node *node,
>> +propagate_info_to_inlined_callees (cgraph_edge *cs,
>> +                   cgraph_node *node,
>>                      vec<cgraph_edge *> *new_edges)
>>   {
>> -  struct cgraph_edge *e;
>> +  cgraph_edge *e;
>>     bool res;
>>
>>     res = update_indirect_edges_after_inlining (cs, node, new_edges);
>> @@ -3443,21 +3443,21 @@ combine_controlled_uses_counters (int c, int d)
>>      tree of inlined nodes.  */
>>
>>   static void
>> -propagate_controlled_uses (struct cgraph_edge *cs)
>> +propagate_controlled_uses (cgraph_edge *cs)
>>   {
>> -  struct ipa_edge_args *args = IPA_EDGE_REF (cs);
>> -  struct cgraph_node *new_root = cs->caller->global.inlined_to
>> +  ipa_edge_args *args = IPA_EDGE_REF (cs);
>> +  cgraph_node *new_root = cs->caller->global.inlined_to
>>       ? cs->caller->global.inlined_to : cs->caller;
>> -  struct ipa_node_params *new_root_info = IPA_NODE_REF (new_root);
>> -  struct ipa_node_params *old_root_info = IPA_NODE_REF (cs->callee);
>> +  ipa_node_params *new_root_info = IPA_NODE_REF (new_root);
>> +  ipa_node_params *old_root_info = IPA_NODE_REF (cs->callee);
>>     int count, i;
>>
>>     count = MIN (ipa_get_cs_argument_count (args),
>>              ipa_get_param_count (old_root_info));
>>     for (i = 0; i < count; i++)
>>       {
>> -      struct ipa_jump_func *jf = ipa_get_ith_jump_func (args, i);
>> -      struct ipa_cst_ref_desc *rdesc;
>> +      ipa_jump_func *jf = ipa_get_ith_jump_func (args, i);
>> +      ipa_cst_ref_desc *rdesc;
>>
>>         if (jf->type == IPA_JF_PASS_THROUGH)
>>       {
>> @@ -3472,8 +3472,8 @@ propagate_controlled_uses (struct cgraph_edge *cs)
>>         ipa_set_controlled_uses (new_root_info, src_idx, c);
>>         if (c == 0 && new_root_info->ipcp_orig_node)
>>           {
>> -          struct cgraph_node *n;
>> -          struct ipa_ref *ref;
>> +          cgraph_node *n;
>> +          ipa_ref *ref;
>>             tree t = new_root_info->known_vals[src_idx];
>>
>>             if (t && TREE_CODE (t) == ADDR_EXPR
>> @@ -3500,14 +3500,14 @@ propagate_controlled_uses (struct cgraph_edge *cs)
>>         if (rdesc->refcount == 0)
>>           {
>>             tree cst = ipa_get_jf_constant (jf);
>> -          struct cgraph_node *n;
>> +          cgraph_node *n;
>>             gcc_checking_assert (TREE_CODE (cst) == ADDR_EXPR
>>                      && TREE_CODE (TREE_OPERAND (cst, 0))
>>                      == FUNCTION_DECL);
>>             n = cgraph_node::get (TREE_OPERAND (cst, 0));
>>             if (n)
>>           {
>> -          struct cgraph_node *clone;
>> +          cgraph_node *clone;
>>             bool ok;
>>             ok = remove_described_reference (n, rdesc);
>>             gcc_checking_assert (ok);
>> @@ -3517,7 +3517,7 @@ propagate_controlled_uses (struct cgraph_edge *cs)
>>                && clone != rdesc->cs->caller
>>                && IPA_NODE_REF (clone)->ipcp_orig_node)
>>               {
>> -              struct ipa_ref *ref;
>> +              ipa_ref *ref;
>>                 ref = clone->find_reference (n, NULL, 0);
>>                 if (ref)
>>               {
>> @@ -3542,11 +3542,11 @@ propagate_controlled_uses (struct cgraph_edge *cs)
>>          i < ipa_get_cs_argument_count (args);
>>          i++)
>>       {
>> -      struct ipa_jump_func *jf = ipa_get_ith_jump_func (args, i);
>> +      ipa_jump_func *jf = ipa_get_ith_jump_func (args, i);
>>
>>         if (jf->type == IPA_JF_CONST)
>>       {
>> -      struct ipa_cst_ref_desc *rdesc = jfunc_rdesc_usable (jf);
>> +      ipa_cst_ref_desc *rdesc = jfunc_rdesc_usable (jf);
>>         if (rdesc)
>>           rdesc->refcount = IPA_UNDESCRIBED_USE;
>>       }
>> @@ -3564,13 +3564,13 @@ propagate_controlled_uses (struct cgraph_edge *cs)
>>      created.  */
>>
>>   bool
>> -ipa_propagate_indirect_call_infos (struct cgraph_edge *cs,
>> +ipa_propagate_indirect_call_infos (cgraph_edge *cs,
>>                      vec<cgraph_edge *> *new_edges)
>>   {
>>     bool changed;
>>     /* Do nothing if the preparation phase has not been carried out yet
>>        (i.e. during early inlining).  */
>> -  if (!ipa_node_params_vector.exists ())
>> +  if (!ipa_node_params_summary)
>>       return false;
>>     gcc_assert (ipa_edge_args_vector);
>>
>> @@ -3584,7 +3584,7 @@ ipa_propagate_indirect_call_infos (struct cgraph_edge *cs,
>>      to.  */
>>
>>   void
>> -ipa_free_edge_args_substructures (struct ipa_edge_args *args)
>> +ipa_free_edge_args_substructures (ipa_edge_args *args)
>>   {
>>     vec_free (args->jump_functions);
>>     memset (args, 0, sizeof (*args));
>> @@ -3596,7 +3596,7 @@ void
>>   ipa_free_all_edge_args (void)
>>   {
>>     int i;
>> -  struct ipa_edge_args *args;
>> +  ipa_edge_args *args;
>>
>>     if (!ipa_edge_args_vector)
>>       return;
>> @@ -3610,15 +3610,21 @@ ipa_free_all_edge_args (void)
>>   /* Frees all dynamically allocated structures that the param info points
>>      to.  */
>>
>> -void
>> -ipa_free_node_params_substructures (struct ipa_node_params *info)
>> +ipa_node_params::~ipa_node_params ()
>>   {
>> -  info->descriptors.release ();
>> -  free (info->lattices);
>> +  descriptors.release ();
>> +  free (lattices);
>>     /* Lattice values and their sources are deallocated with their alocation
>>        pool.  */
>> -  info->known_vals.release ();
>> -  memset (info, 0, sizeof (*info));
>> +  known_vals.release ();
>> +
>> +  lattices = NULL;
>> +  ipcp_orig_node = NULL;
>> +  analysis_done = 0;
>> +  node_enqueued = 0;
>> +  do_clone_for_all_contexts = 0;
>> +  is_all_contexts_clone = 0;
>> +  node_dead = 0;
>>   }
>>
>>   /* Free all ipa_node_params structures.  */
>> @@ -3626,11 +3632,8 @@ ipa_free_node_params_substructures (struct ipa_node_params *info)
>>   void
>>   ipa_free_all_node_params (void)
>>   {
>> -  int i;
>> -  struct ipa_node_params *info;
>> -
>> -  FOR_EACH_VEC_ELT (ipa_node_params_vector, i, info)
>> -    ipa_free_node_params_substructures (info);
>> +  delete ipa_node_params_summary;
>> +  ipa_node_params_summary = NULL;
>>
>>     ipa_node_params_vector.release ();
>>   }
>> @@ -3638,8 +3641,8 @@ ipa_free_all_node_params (void)
>>   /* Set the aggregate replacements of NODE to be AGGVALS.  */
>>
>>   void
>> -ipa_set_node_agg_value_chain (struct cgraph_node *node,
>> -                  struct ipa_agg_replacement_value *aggvals)
>> +ipa_set_node_agg_value_chain (const cgraph_node *node,
>> +                  ipa_agg_replacement_value *aggvals)
>>   {
>>     if (vec_safe_length (ipa_node_agg_replacements)
>>         <= (unsigned) symtab->cgraph_max_uid)
>> @@ -3652,9 +3655,9 @@ ipa_set_node_agg_value_chain (struct cgraph_node *node,
>>   /* Hook that is called by cgraph.c when an edge is removed.  */
>>
>>   static void
>> -ipa_edge_removal_hook (struct cgraph_edge *cs, void *data ATTRIBUTE_UNUSED)
>> +ipa_edge_removal_hook (cgraph_edge *cs, void *data ATTRIBUTE_UNUSED)
>>   {
>> -  struct ipa_edge_args *args;
>> +  ipa_edge_args *args;
>>
>>     /* During IPA-CP updating we can be called on not-yet analyzed clones.  */
>>     if (vec_safe_length (ipa_edge_args_vector) <= (unsigned)cs->uid)
>> @@ -3663,11 +3666,11 @@ ipa_edge_removal_hook (struct cgraph_edge *cs, void *data ATTRIBUTE_UNUSED)
>>     args = IPA_EDGE_REF (cs);
>>     if (args->jump_functions)
>>       {
>> -      struct ipa_jump_func *jf;
>> +      ipa_jump_func *jf;
>>         int i;
>>         FOR_EACH_VEC_ELT (*args->jump_functions, i, jf)
>>       {
>> -      struct ipa_cst_ref_desc *rdesc;
>> +      ipa_cst_ref_desc *rdesc;
>>         try_decrement_rdesc_refcount (jf);
>>         if (jf->type == IPA_JF_CONST
>>             && (rdesc = ipa_get_jf_constant_rdesc (jf))
>> @@ -3679,25 +3682,13 @@ ipa_edge_removal_hook (struct cgraph_edge *cs, void *data ATTRIBUTE_UNUSED)
>>     ipa_free_edge_args_substructures (IPA_EDGE_REF (cs));
>>   }
>>
>> -/* Hook that is called by cgraph.c when a node is removed.  */
>> -
>> -static void
>> -ipa_node_removal_hook (struct cgraph_node *node, void *data ATTRIBUTE_UNUSED)
>> -{
>> -  /* During IPA-CP updating we can be called on not-yet analyze clones.  */
>> -  if (ipa_node_params_vector.length () > (unsigned)node->uid)
>> -    ipa_free_node_params_substructures (IPA_NODE_REF (node));
>> -  if (vec_safe_length (ipa_node_agg_replacements) > (unsigned)node->uid)
>> -    (*ipa_node_agg_replacements)[(unsigned)node->uid] = NULL;
>> -}
>> -
>>   /* Hook that is called by cgraph.c when an edge is duplicated.  */
>>
>>   static void
>> -ipa_edge_duplication_hook (struct cgraph_edge *src, struct cgraph_edge *dst,
>> +ipa_edge_duplication_hook (cgraph_edge *src, cgraph_edge *dst,
>>                  __attribute__((unused)) void *data)
>>   {
>> -  struct ipa_edge_args *old_args, *new_args;
>> +  ipa_edge_args *old_args, *new_args;
>>     unsigned int i;
>>
>>     ipa_check_create_edge_args ();
>> @@ -3712,20 +3703,20 @@ ipa_edge_duplication_hook (struct cgraph_edge *src, struct cgraph_edge *dst,
>>
>>     for (i = 0; i < vec_safe_length (old_args->jump_functions); i++)
>>       {
>> -      struct ipa_jump_func *src_jf = ipa_get_ith_jump_func (old_args, i);
>> -      struct ipa_jump_func *dst_jf = ipa_get_ith_jump_func (new_args, i);
>> +      ipa_jump_func *src_jf = ipa_get_ith_jump_func (old_args, i);
>> +      ipa_jump_func *dst_jf = ipa_get_ith_jump_func (new_args, i);
>>
>>         dst_jf->agg.items = vec_safe_copy (dst_jf->agg.items);
>>
>>         if (src_jf->type == IPA_JF_CONST)
>>       {
>> -      struct ipa_cst_ref_desc *src_rdesc = jfunc_rdesc_usable (src_jf);
>> +      ipa_cst_ref_desc *src_rdesc = jfunc_rdesc_usable (src_jf);
>>
>>         if (!src_rdesc)
>>           dst_jf->value.constant.rdesc = NULL;
>>         else if (src->caller == dst->caller)
>>           {
>> -          struct ipa_ref *ref;
>> +          ipa_ref *ref;
>>             symtab_node *n = cgraph_node_for_jfunc (src_jf);
>>             gcc_checking_assert (n);
>>             ref = src->caller->find_reference (n, src->call_stmt,
>> @@ -3734,8 +3725,8 @@ ipa_edge_duplication_hook (struct cgraph_edge *src, struct cgraph_edge *dst,
>>             dst->caller->clone_reference (ref, ref->stmt);
>>
>>             gcc_checking_assert (ipa_refdesc_pool);
>> -          struct ipa_cst_ref_desc *dst_rdesc
>> -        = (struct ipa_cst_ref_desc *) pool_alloc (ipa_refdesc_pool);
>> +          ipa_cst_ref_desc *dst_rdesc
>> +        = (ipa_cst_ref_desc *) pool_alloc (ipa_refdesc_pool);
>>             dst_rdesc->cs = dst;
>>             dst_rdesc->refcount = src_rdesc->refcount;
>>             dst_rdesc->next_duplicate = NULL;
>> @@ -3743,10 +3734,10 @@ ipa_edge_duplication_hook (struct cgraph_edge *src, struct cgraph_edge *dst,
>>           }
>>         else if (src_rdesc->cs == src)
>>           {
>> -          struct ipa_cst_ref_desc *dst_rdesc;
>> +          ipa_cst_ref_desc *dst_rdesc;
>>             gcc_checking_assert (ipa_refdesc_pool);
>>             dst_rdesc
>> -        = (struct ipa_cst_ref_desc *) pool_alloc (ipa_refdesc_pool);
>> +        = (ipa_cst_ref_desc *) pool_alloc (ipa_refdesc_pool);
>>             dst_rdesc->cs = dst;
>>             dst_rdesc->refcount = src_rdesc->refcount;
>>             dst_rdesc->next_duplicate = src_rdesc->next_duplicate;
>> @@ -3755,7 +3746,7 @@ ipa_edge_duplication_hook (struct cgraph_edge *src, struct cgraph_edge *dst,
>>           }
>>         else
>>           {
>> -          struct ipa_cst_ref_desc *dst_rdesc;
>> +          ipa_cst_ref_desc *dst_rdesc;
>>             /* This can happen during inlining, when a JFUNC can refer to a
>>            reference taken in a function up in the tree of inline clones.
>>            We need to find the duplicate that refers to our tree of
>> @@ -3766,7 +3757,7 @@ ipa_edge_duplication_hook (struct cgraph_edge *src, struct cgraph_edge *dst,
>>              dst_rdesc;
>>              dst_rdesc = dst_rdesc->next_duplicate)
>>           {
>> -          struct cgraph_node *top;
>> +          cgraph_node *top;
>>             top = dst_rdesc->cs->caller->global.inlined_to
>>               ? dst_rdesc->cs->caller->global.inlined_to
>>               : dst_rdesc->cs->caller;
>> @@ -3780,9 +3771,9 @@ ipa_edge_duplication_hook (struct cgraph_edge *src, struct cgraph_edge *dst,
>>         else if (dst_jf->type == IPA_JF_PASS_THROUGH
>>              && src->caller == dst->caller)
>>       {
>> -      struct cgraph_node *inline_root = dst->caller->global.inlined_to
>> +      cgraph_node *inline_root = dst->caller->global.inlined_to
>>           ? dst->caller->global.inlined_to : dst->caller;
>> -      struct ipa_node_params *root_info = IPA_NODE_REF (inline_root);
>> +      ipa_node_params *root_info = IPA_NODE_REF (inline_root);
>>         int idx = ipa_get_jf_pass_through_formal_id (dst_jf);
>>
>>         int c = ipa_get_controlled_uses (root_info, idx);
>> @@ -3795,18 +3786,24 @@ ipa_edge_duplication_hook (struct cgraph_edge *src, struct cgraph_edge *dst,
>>       }
>>   }
>>
>> -/* Hook that is called by cgraph.c when a node is duplicated.  */
>> +/* Analyze newly added function into callgraph.  */
>>
>>   static void
>> -ipa_node_duplication_hook (struct cgraph_node *src, struct cgraph_node *dst,
>> -               ATTRIBUTE_UNUSED void *data)
>> +ipa_add_new_function (cgraph_node *node, void *data ATTRIBUTE_UNUSED)
>>   {
>> -  struct ipa_node_params *old_info, *new_info;
>> -  struct ipa_agg_replacement_value *old_av, *new_av;
>> +  if (node->has_gimple_body_p ())
>> +    ipa_analyze_node (node);
>> +}
>>
>> -  ipa_check_create_node_params ();
>> -  old_info = IPA_NODE_REF (src);
>> -  new_info = IPA_NODE_REF (dst);
>> +/* Hook that is called by summary when a node is duplicated.  */
>> +
>> +void
>> +ipa_node_params_cgraph_summary::duplication_hook(cgraph_node *src,
>> +                            cgraph_node *dst,
>> +                            ipa_node_params *old_info,
>> +                            ipa_node_params *new_info)
>> +{
>> +  ipa_agg_replacement_value *old_av, *new_av;
>>
>>     new_info->descriptors = old_info->descriptors.copy ();
>>     new_info->lattices = NULL;
>> @@ -3822,7 +3819,7 @@ ipa_node_duplication_hook (struct cgraph_node *src, struct cgraph_node *dst,
>>     new_av = NULL;
>>     while (old_av)
>>       {
>> -      struct ipa_agg_replacement_value *v;
>> +      ipa_agg_replacement_value *v;
>>
>>         v = ggc_alloc<ipa_agg_replacement_value> ();
>>         memcpy (v, old_av, sizeof (*v));
>> @@ -3833,33 +3830,19 @@ ipa_node_duplication_hook (struct cgraph_node *src, struct cgraph_node *dst,
>>     ipa_set_node_agg_value_chain (dst, new_av);
>>   }
>>
>> -
>> -/* Analyze newly added function into callgraph.  */
>> -
>> -static void
>> -ipa_add_new_function (struct cgraph_node *node, void *data ATTRIBUTE_UNUSED)
>> -{
>> -  if (node->has_gimple_body_p ())
>> -    ipa_analyze_node (node);
>> -}
>> -
>>   /* Register our cgraph hooks if they are not already there.  */
>>
>>   void
>>   ipa_register_cgraph_hooks (void)
>>   {
>> +  ipa_check_create_node_params ();
>> +
>>     if (!edge_removal_hook_holder)
>>       edge_removal_hook_holder =
>>         symtab->add_edge_removal_hook (&ipa_edge_removal_hook, NULL);
>> -  if (!node_removal_hook_holder)
>> -    node_removal_hook_holder =
>> -      symtab->add_cgraph_removal_hook (&ipa_node_removal_hook, NULL);
>>     if (!edge_duplication_hook_holder)
>>       edge_duplication_hook_holder =
>>         symtab->add_edge_duplication_hook (&ipa_edge_duplication_hook, NULL);
>> -  if (!node_duplication_hook_holder)
>> -    node_duplication_hook_holder =
>> -      symtab->add_cgraph_duplication_hook (&ipa_node_duplication_hook, NULL);
>>     function_insertion_hook_holder =
>>         symtab->add_cgraph_insertion_hook (&ipa_add_new_function, NULL);
>>   }
>> @@ -3871,12 +3854,8 @@ ipa_unregister_cgraph_hooks (void)
>>   {
>>     symtab->remove_edge_removal_hook (edge_removal_hook_holder);
>>     edge_removal_hook_holder = NULL;
>> -  symtab->remove_cgraph_removal_hook (node_removal_hook_holder);
>> -  node_removal_hook_holder = NULL;
>>     symtab->remove_edge_duplication_hook (edge_duplication_hook_holder);
>>     edge_duplication_hook_holder = NULL;
>> -  symtab->remove_cgraph_duplication_hook (node_duplication_hook_holder);
>> -  node_duplication_hook_holder = NULL;
>>     symtab->remove_cgraph_insertion_hook (function_insertion_hook_holder);
>>     function_insertion_hook_holder = NULL;
>>   }
>> @@ -3923,10 +3902,10 @@ ipa_free_all_structures_after_iinln (void)
>>      callgraph to F.  */
>>
>>   void
>> -ipa_print_node_params (FILE *f, struct cgraph_node *node)
>> +ipa_print_node_params (FILE *f, cgraph_node *node)
>>   {
>>     int i, count;
>> -  struct ipa_node_params *info;
>> +  ipa_node_params *info;
>>
>>     if (!node->definition)
>>       return;
>> @@ -3957,7 +3936,7 @@ ipa_print_node_params (FILE *f, struct cgraph_node *node)
>>   void
>>   ipa_print_all_params (FILE * f)
>>   {
>> -  struct cgraph_node *node;
>> +  cgraph_node *node;
>>
>>     fprintf (f, "\nFunction parameters:\n");
>>     FOR_EACH_FUNCTION (node)
>> @@ -4040,7 +4019,7 @@ ipa_modify_formal_parameters (tree fndecl, ipa_parm_adjustment_vec adjustments)
>>     tree new_arg_types = NULL;
>>     for (int i = 0; i < len; i++)
>>       {
>> -      struct ipa_parm_adjustment *adj;
>> +      ipa_parm_adjustment *adj;
>>         gcc_assert (link);
>>
>>         adj = &adjustments[i];
>> @@ -4158,10 +4137,10 @@ ipa_modify_formal_parameters (tree fndecl, ipa_parm_adjustment_vec adjustments)
>>      contain the corresponding call graph edge.  */
>>
>>   void
>> -ipa_modify_call_arguments (struct cgraph_edge *cs, gimple stmt,
>> +ipa_modify_call_arguments (cgraph_edge *cs, gimple stmt,
>>                  ipa_parm_adjustment_vec adjustments)
>>   {
>> -  struct cgraph_node *current_node = cgraph_node::get (current_function_decl);
>> +  cgraph_node *current_node = cgraph_node::get (current_function_decl);
>>     vec<tree> vargs;
>>     vec<tree, va_gc> **debug_args = NULL;
>>     gimple new_stmt;
>> @@ -4179,7 +4158,7 @@ ipa_modify_call_arguments (struct cgraph_edge *cs, gimple stmt,
>>     gsi_prev (&prev_gsi);
>>     for (i = 0; i < len; i++)
>>       {
>> -      struct ipa_parm_adjustment *adj;
>> +      ipa_parm_adjustment *adj;
>>
>>         adj = &adjustments[i];
>>
>> @@ -4412,7 +4391,7 @@ bool
>>   ipa_modify_expr (tree *expr, bool convert,
>>            ipa_parm_adjustment_vec adjustments)
>>   {
>> -  struct ipa_parm_adjustment *cand
>> +  ipa_parm_adjustment *cand
>>       = ipa_get_adjustment_candidate (&expr, &convert, adjustments, false);
>>     if (!cand)
>>       return false;
>> @@ -4500,11 +4479,11 @@ ipa_get_adjustment_candidate (tree **expr, bool *convert,
>>     if (!base || TREE_CODE (base) != PARM_DECL)
>>       return NULL;
>>
>> -  struct ipa_parm_adjustment *cand = NULL;
>> +  ipa_parm_adjustment *cand = NULL;
>>     unsigned int len = adjustments.length ();
>>     for (unsigned i = 0; i < len; i++)
>>       {
>> -      struct ipa_parm_adjustment *adj = &adjustments[i];
>> +      ipa_parm_adjustment *adj = &adjustments[i];
>>
>>         if (adj->base == base
>>         && (adj->offset == offset || adj->op == IPA_PARM_OP_REMOVE))
>> @@ -4530,7 +4509,7 @@ index_in_adjustments_multiple_times_p (int base_index,
>>
>>     for (i = 0; i < len; i++)
>>       {
>> -      struct ipa_parm_adjustment *adj;
>> +      ipa_parm_adjustment *adj;
>>         adj = &adjustments[i];
>>
>>         if (adj->base_index == base_index)
>> @@ -4561,7 +4540,7 @@ ipa_combine_adjustments (ipa_parm_adjustment_vec inner,
>>     tmp.create (inlen);
>>     for (i = 0; i < inlen; i++)
>>       {
>> -      struct ipa_parm_adjustment *n;
>> +      ipa_parm_adjustment *n;
>>         n = &inner[i];
>>
>>         if (n->op == IPA_PARM_OP_REMOVE)
>> @@ -4577,9 +4556,9 @@ ipa_combine_adjustments (ipa_parm_adjustment_vec inner,
>>     adjustments.create (outlen + removals);
>>     for (i = 0; i < outlen; i++)
>>       {
>> -      struct ipa_parm_adjustment r;
>> -      struct ipa_parm_adjustment *out = &outer[i];
>> -      struct ipa_parm_adjustment *in = &tmp[out->base_index];
>> +      ipa_parm_adjustment r;
>> +      ipa_parm_adjustment *out = &outer[i];
>> +      ipa_parm_adjustment *in = &tmp[out->base_index];
>>
>>         memset (&r, 0, sizeof (r));
>>         gcc_assert (in->op != IPA_PARM_OP_REMOVE);
>> @@ -4616,7 +4595,7 @@ ipa_combine_adjustments (ipa_parm_adjustment_vec inner,
>>
>>     for (i = 0; i < inlen; i++)
>>       {
>> -      struct ipa_parm_adjustment *n = &inner[i];
>> +      ipa_parm_adjustment *n = &inner[i];
>>
>>         if (n->op == IPA_PARM_OP_REMOVE)
>>       adjustments.quick_push (*n);
>> @@ -4640,7 +4619,7 @@ ipa_dump_param_adjustments (FILE *file, ipa_parm_adjustment_vec adjustments,
>>     fprintf (file, "IPA param adjustments: ");
>>     for (i = 0; i < len; i++)
>>       {
>> -      struct ipa_parm_adjustment *adj;
>> +      ipa_parm_adjustment *adj;
>>         adj = &adjustments[i];
>>
>>         if (!first)
>> @@ -4683,7 +4662,7 @@ ipa_dump_param_adjustments (FILE *file, ipa_parm_adjustment_vec adjustments,
>>   /* Dump the AV linked list.  */
>>
>>   void
>> -ipa_dump_agg_replacement_values (FILE *f, struct ipa_agg_replacement_value *av)
>> +ipa_dump_agg_replacement_values (FILE *f, ipa_agg_replacement_value *av)
>>   {
>>     bool comma = false;
>>     fprintf (f, "     Aggregate replacements:");
>> @@ -4700,11 +4679,11 @@ ipa_dump_agg_replacement_values (FILE *f, struct ipa_agg_replacement_value *av)
>>   /* Stream out jump function JUMP_FUNC to OB.  */
>>
>>   static void
>> -ipa_write_jump_function (struct output_block *ob,
>> -             struct ipa_jump_func *jump_func)
>> +ipa_write_jump_function (output_block *ob,
>> +             ipa_jump_func *jump_func)
>>   {
>> -  struct ipa_agg_jf_item *item;
>> -  struct bitpack_d bp;
>> +  ipa_agg_jf_item *item;
>> +  bitpack_d bp;
>>     int i, count;
>>
>>     streamer_write_uhwi (ob, jump_func->type);
>> @@ -4768,10 +4747,10 @@ ipa_write_jump_function (struct output_block *ob,
>>   /* Read in jump function JUMP_FUNC from IB.  */
>>
>>   static void
>> -ipa_read_jump_function (struct lto_input_block *ib,
>> -            struct ipa_jump_func *jump_func,
>> -            struct cgraph_edge *cs,
>> -            struct data_in *data_in)
>> +ipa_read_jump_function (lto_input_block *ib,
>> +            ipa_jump_func *jump_func,
>> +            cgraph_edge *cs,
>> +            data_in *data_in)
>>   {
>>     enum jump_func_type jftype;
>>     enum tree_code operation;
>> @@ -4800,7 +4779,7 @@ ipa_read_jump_function (struct lto_input_block *ib,
>>         if (operation == NOP_EXPR)
>>       {
>>         int formal_id =  streamer_read_uhwi (ib);
>> -      struct bitpack_d bp = streamer_read_bitpack (ib);
>> +      bitpack_d bp = streamer_read_bitpack (ib);
>>         bool agg_preserved = bp_unpack_value (&bp, 1);
>>         bool type_preserved = bp_unpack_value (&bp, 1);
>>         ipa_set_jf_simple_pass_through (jump_func, formal_id, agg_preserved,
>> @@ -4819,7 +4798,7 @@ ipa_read_jump_function (struct lto_input_block *ib,
>>       HOST_WIDE_INT offset = streamer_read_uhwi (ib);
>>       tree type = stream_read_tree (ib, data_in);
>>       int formal_id = streamer_read_uhwi (ib);
>> -    struct bitpack_d bp = streamer_read_bitpack (ib);
>> +    bitpack_d bp = streamer_read_bitpack (ib);
>>       bool agg_preserved = bp_unpack_value (&bp, 1);
>>       bool type_preserved = bp_unpack_value (&bp, 1);
>>
>> @@ -4833,12 +4812,12 @@ ipa_read_jump_function (struct lto_input_block *ib,
>>     vec_alloc (jump_func->agg.items, count);
>>     if (count)
>>       {
>> -      struct bitpack_d bp = streamer_read_bitpack (ib);
>> +      bitpack_d bp = streamer_read_bitpack (ib);
>>         jump_func->agg.by_ref = bp_unpack_value (&bp, 1);
>>       }
>>     for (i = 0; i < count; i++)
>>       {
>> -      struct ipa_agg_jf_item item;
>> +      ipa_agg_jf_item item;
>>         item.offset = streamer_read_uhwi (ib);
>>         item.value = stream_read_tree (ib, data_in);
>>         jump_func->agg.items->quick_push (item);
>> @@ -4849,11 +4828,11 @@ ipa_read_jump_function (struct lto_input_block *ib,
>>      relevant to indirect inlining to OB.  */
>>
>>   static void
>> -ipa_write_indirect_edge_info (struct output_block *ob,
>> -                  struct cgraph_edge *cs)
>> +ipa_write_indirect_edge_info (output_block *ob,
>> +                  cgraph_edge *cs)
>>   {
>> -  struct cgraph_indirect_call_info *ii = cs->indirect_info;
>> -  struct bitpack_d bp;
>> +  cgraph_indirect_call_info *ii = cs->indirect_info;
>> +  bitpack_d bp;
>>
>>     streamer_write_hwi (ob, ii->param_index);
>>     bp = bitpack_create (ob->main_stream);
>> @@ -4880,12 +4859,12 @@ ipa_write_indirect_edge_info (struct output_block *ob,
>>      relevant to indirect inlining from IB.  */
>>
>>   static void
>> -ipa_read_indirect_edge_info (struct lto_input_block *ib,
>> -                 struct data_in *data_in,
>> -                 struct cgraph_edge *cs)
>> +ipa_read_indirect_edge_info (lto_input_block *ib,
>> +                 data_in *data_in,
>> +                 cgraph_edge *cs)
>>   {
>> -  struct cgraph_indirect_call_info *ii = cs->indirect_info;
>> -  struct bitpack_d bp;
>> +  cgraph_indirect_call_info *ii = cs->indirect_info;
>> +  bitpack_d bp;
>>
>>     ii->param_index = (int) streamer_read_hwi (ib);
>>     bp = streamer_read_bitpack (ib);
>> @@ -4909,14 +4888,14 @@ ipa_read_indirect_edge_info (struct lto_input_block *ib,
>>   /* Stream out NODE info to OB.  */
>>
>>   static void
>> -ipa_write_node_info (struct output_block *ob, struct cgraph_node *node)
>> +ipa_write_node_info (output_block *ob, cgraph_node *node)
>>   {
>>     int node_ref;
>>     lto_symtab_encoder_t encoder;
>> -  struct ipa_node_params *info = IPA_NODE_REF (node);
>> +  ipa_node_params *info = IPA_NODE_REF (node);
>>     int j;
>> -  struct cgraph_edge *e;
>> -  struct bitpack_d bp;
>> +  cgraph_edge *e;
>> +  bitpack_d bp;
>>
>>     encoder = ob->decl_state->symtab_node_encoder;
>>     node_ref = lto_symtab_encoder_encode (encoder, node);
>> @@ -4937,7 +4916,7 @@ ipa_write_node_info (struct output_block *ob, struct cgraph_node *node)
>>       streamer_write_hwi (ob, ipa_get_controlled_uses (info, j));
>>     for (e = node->callees; e; e = e->next_callee)
>>       {
>> -      struct ipa_edge_args *args = IPA_EDGE_REF (e);
>> +      ipa_edge_args *args = IPA_EDGE_REF (e);
>>
>>         streamer_write_uhwi (ob,
>>                  ipa_get_cs_argument_count (args) * 2
>> @@ -4951,7 +4930,7 @@ ipa_write_node_info (struct output_block *ob, struct cgraph_node *node)
>>       }
>>     for (e = node->indirect_calls; e; e = e->next_callee)
>>       {
>> -      struct ipa_edge_args *args = IPA_EDGE_REF (e);
>> +      ipa_edge_args *args = IPA_EDGE_REF (e);
>>
>>         streamer_write_uhwi (ob,
>>                  ipa_get_cs_argument_count (args) * 2
>> @@ -4969,13 +4948,13 @@ ipa_write_node_info (struct output_block *ob, struct cgraph_node *node)
>>   /* Stream in NODE info from IB.  */
>>
>>   static void
>> -ipa_read_node_info (struct lto_input_block *ib, struct cgraph_node *node,
>> -            struct data_in *data_in)
>> +ipa_read_node_info (lto_input_block *ib, cgraph_node *node,
>> +            data_in *data_in)
>>   {
>> -  struct ipa_node_params *info = IPA_NODE_REF (node);
>> +  ipa_node_params *info = IPA_NODE_REF (node);
>>     int k;
>> -  struct cgraph_edge *e;
>> -  struct bitpack_d bp;
>> +  cgraph_edge *e;
>> +  bitpack_d bp;
>>
>>     ipa_alloc_node_params (node, streamer_read_uhwi (ib));
>>
>> @@ -4992,7 +4971,7 @@ ipa_read_node_info (struct lto_input_block *ib, struct cgraph_node *node,
>>       ipa_set_controlled_uses (info, k, streamer_read_hwi (ib));
>>     for (e = node->callees; e; e = e->next_callee)
>>       {
>> -      struct ipa_edge_args *args = IPA_EDGE_REF (e);
>> +      ipa_edge_args *args = IPA_EDGE_REF (e);
>>         int count = streamer_read_uhwi (ib);
>>         bool contexts_computed = count & 1;
>>         count /= 2;
>> @@ -5013,7 +4992,7 @@ ipa_read_node_info (struct lto_input_block *ib, struct cgraph_node *node,
>>       }
>>     for (e = node->indirect_calls; e; e = e->next_callee)
>>       {
>> -      struct ipa_edge_args *args = IPA_EDGE_REF (e);
>> +      ipa_edge_args *args = IPA_EDGE_REF (e);
>>         int count = streamer_read_uhwi (ib);
>>         bool contexts_computed = count & 1;
>>         count /= 2;
>> @@ -5040,14 +5019,13 @@ ipa_read_node_info (struct lto_input_block *ib, struct cgraph_node *node,
>>   void
>>   ipa_prop_write_jump_functions (void)
>>   {
>> -  struct cgraph_node *node;
>> -  struct output_block *ob;
>> +  cgraph_node *node;
>> +  output_block *ob;
>>     unsigned int count = 0;
>>     lto_symtab_encoder_iterator lsei;
>>     lto_symtab_encoder_t encoder;
>>
>> -
>> -  if (!ipa_node_params_vector.exists ())
>> +  if (!ipa_node_params_summary)
>>       return;
>>
>>     ob = create_output_block (LTO_section_jump_functions);
>> @@ -5081,15 +5059,15 @@ ipa_prop_write_jump_functions (void)
>>   /* Read section in file FILE_DATA of length LEN with data DATA.  */
>>
>>   static void
>> -ipa_prop_read_section (struct lto_file_decl_data *file_data, const char *data,
>> +ipa_prop_read_section (lto_file_decl_data *file_data, const char *data,
>>                  size_t len)
>>   {
>> -  const struct lto_function_header *header =
>> -    (const struct lto_function_header *) data;
>> -  const int cfg_offset = sizeof (struct lto_function_header);
>> +  const lto_function_header *header =
>> +    (const lto_function_header *) data;
>> +  const int cfg_offset = sizeof (lto_function_header);
>>     const int main_offset = cfg_offset + header->cfg_size;
>>     const int string_offset = main_offset + header->main_size;
>> -  struct data_in *data_in;
>> +  data_in *data_in;
>>     unsigned int i;
>>     unsigned int count;
>>
>> @@ -5104,7 +5082,7 @@ ipa_prop_read_section (struct lto_file_decl_data *file_data, const char *data,
>>     for (i = 0; i < count; i++)
>>       {
>>         unsigned int index;
>> -      struct cgraph_node *node;
>> +      cgraph_node *node;
>>         lto_symtab_encoder_t encoder;
>>
>>         index = streamer_read_uhwi (&ib_main);
>> @@ -5124,8 +5102,8 @@ ipa_prop_read_section (struct lto_file_decl_data *file_data, const char *data,
>>   void
>>   ipa_prop_read_jump_functions (void)
>>   {
>> -  struct lto_file_decl_data **file_data_vec = lto_get_file_decl_data ();
>> -  struct lto_file_decl_data *file_data;
>> +  lto_file_decl_data **file_data_vec = lto_get_file_decl_data ();
>> +  lto_file_decl_data *file_data;
>>     unsigned int j = 0;
>>
>>     ipa_check_create_node_params ();
>> @@ -5154,12 +5132,12 @@ ipa_update_after_lto_read (void)
>>   }
>>
>>   void
>> -write_agg_replacement_chain (struct output_block *ob, struct cgraph_node *node)
>> +write_agg_replacement_chain (output_block *ob, cgraph_node *node)
>>   {
>>     int node_ref;
>>     unsigned int count = 0;
>>     lto_symtab_encoder_t encoder;
>> -  struct ipa_agg_replacement_value *aggvals, *av;
>> +  ipa_agg_replacement_value *aggvals, *av;
>>
>>     aggvals = ipa_get_agg_replacements_for_node (node);
>>     encoder = ob->decl_state->symtab_node_encoder;
>> @@ -5172,7 +5150,7 @@ write_agg_replacement_chain (struct output_block *ob, struct cgraph_node *node)
>>
>>     for (av = aggvals; av; av = av->next)
>>       {
>> -      struct bitpack_d bp;
>> +      bitpack_d bp;
>>
>>         streamer_write_uhwi (ob, av->offset);
>>         streamer_write_uhwi (ob, av->index);
>> @@ -5187,18 +5165,18 @@ write_agg_replacement_chain (struct output_block *ob, struct cgraph_node *node)
>>   /* Stream in the aggregate value replacement chain for NODE from IB.  */
>>
>>   static void
>> -read_agg_replacement_chain (struct lto_input_block *ib,
>> -                struct cgraph_node *node,
>> -                struct data_in *data_in)
>> +read_agg_replacement_chain (lto_input_block *ib,
>> +                cgraph_node *node,
>> +                data_in *data_in)
>>   {
>> -  struct ipa_agg_replacement_value *aggvals = NULL;
>> +  ipa_agg_replacement_value *aggvals = NULL;
>>     unsigned int count, i;
>>
>>     count = streamer_read_uhwi (ib);
>>     for (i = 0; i <count; i++)
>>       {
>> -      struct ipa_agg_replacement_value *av;
>> -      struct bitpack_d bp;
>> +      ipa_agg_replacement_value *av;
>> +      bitpack_d bp;
>>
>>         av = ggc_alloc<ipa_agg_replacement_value> ();
>>         av->offset = streamer_read_uhwi (ib);
>> @@ -5217,8 +5195,8 @@ read_agg_replacement_chain (struct lto_input_block *ib,
>>   void
>>   ipa_prop_write_all_agg_replacement (void)
>>   {
>> -  struct cgraph_node *node;
>> -  struct output_block *ob;
>> +  cgraph_node *node;
>> +  output_block *ob;
>>     unsigned int count = 0;
>>     lto_symtab_encoder_iterator lsei;
>>     lto_symtab_encoder_t encoder;
>> @@ -5257,16 +5235,16 @@ ipa_prop_write_all_agg_replacement (void)
>>      DATA.  */
>>
>>   static void
>> -read_replacements_section (struct lto_file_decl_data *file_data,
>> +read_replacements_section (lto_file_decl_data *file_data,
>>                  const char *data,
>>                  size_t len)
>>   {
>> -  const struct lto_function_header *header =
>> -    (const struct lto_function_header *) data;
>> -  const int cfg_offset = sizeof (struct lto_function_header);
>> +  const lto_function_header *header =
>> +    (const lto_function_header *) data;
>> +  const int cfg_offset = sizeof (lto_function_header);
>>     const int main_offset = cfg_offset + header->cfg_size;
>>     const int string_offset = main_offset + header->main_size;
>> -  struct data_in *data_in;
>> +  data_in *data_in;
>>     unsigned int i;
>>     unsigned int count;
>>
>> @@ -5280,7 +5258,7 @@ read_replacements_section (struct lto_file_decl_data *file_data,
>>     for (i = 0; i < count; i++)
>>       {
>>         unsigned int index;
>> -      struct cgraph_node *node;
>> +      cgraph_node *node;
>>         lto_symtab_encoder_t encoder;
>>
>>         index = streamer_read_uhwi (&ib_main);
>> @@ -5300,8 +5278,8 @@ read_replacements_section (struct lto_file_decl_data *file_data,
>>   void
>>   ipa_prop_read_all_agg_replacement (void)
>>   {
>> -  struct lto_file_decl_data **file_data_vec = lto_get_file_decl_data ();
>> -  struct lto_file_decl_data *file_data;
>> +  lto_file_decl_data **file_data_vec = lto_get_file_decl_data ();
>> +  lto_file_decl_data *file_data;
>>     unsigned int j = 0;
>>
>>     while ((file_data = file_data_vec[j++]))
>> @@ -5319,10 +5297,10 @@ ipa_prop_read_all_agg_replacement (void)
>>      NODE.  */
>>
>>   static void
>> -adjust_agg_replacement_values (struct cgraph_node *node,
>> -                   struct ipa_agg_replacement_value *aggval)
>> +adjust_agg_replacement_values (cgraph_node *node,
>> +                   ipa_agg_replacement_value *aggval)
>>   {
>> -  struct ipa_agg_replacement_value *v;
>> +  ipa_agg_replacement_value *v;
>>     int i, c = 0, d = 0, *adj;
>>
>>     if (!node->clone.combined_args_to_skip)
>> @@ -5355,9 +5333,9 @@ adjust_agg_replacement_values (struct cgraph_node *node,
>>   class ipcp_modif_dom_walker : public dom_walker
>>   {
>>   public:
>> -  ipcp_modif_dom_walker (struct func_body_info *fbi,
>> +  ipcp_modif_dom_walker (func_body_info *fbi,
>>                vec<ipa_param_descriptor> descs,
>> -             struct ipa_agg_replacement_value *av,
>> +             ipa_agg_replacement_value *av,
>>                bool *sc, bool *cc)
>>       : dom_walker (CDI_DOMINATORS), m_fbi (fbi), m_descriptors (descs),
>>         m_aggval (av), m_something_changed (sc), m_cfg_changed (cc) {}
>> @@ -5365,9 +5343,9 @@ public:
>>     virtual void before_dom_children (basic_block);
>>
>>   private:
>> -  struct func_body_info *m_fbi;
>> +  func_body_info *m_fbi;
>>     vec<ipa_param_descriptor> m_descriptors;
>> -  struct ipa_agg_replacement_value *m_aggval;
>> +  ipa_agg_replacement_value *m_aggval;
>>     bool *m_something_changed, *m_cfg_changed;
>>   };
>>
>> @@ -5377,7 +5355,7 @@ ipcp_modif_dom_walker::before_dom_children (basic_block bb)
>>     gimple_stmt_iterator gsi;
>>     for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
>>       {
>> -      struct ipa_agg_replacement_value *v;
>> +      ipa_agg_replacement_value *v;
>>         gimple stmt = gsi_stmt (gsi);
>>         tree rhs, val, t;
>>         HOST_WIDE_INT offset, size;
>> @@ -5468,11 +5446,11 @@ ipcp_modif_dom_walker::before_dom_children (basic_block bb)
>>   /* IPCP transformation phase doing propagation of aggregate values.  */
>>
>>   unsigned int
>> -ipcp_transform_function (struct cgraph_node *node)
>> +ipcp_transform_function (cgraph_node *node)
>>   {
>>     vec<ipa_param_descriptor> descriptors = vNULL;
>> -  struct func_body_info fbi;
>> -  struct ipa_agg_replacement_value *aggval;
>> +  func_body_info fbi;
>> +  ipa_agg_replacement_value *aggval;
>>     int param_count;
>>     bool cfg_changed = false, something_changed = false;
>>
>> @@ -5507,7 +5485,7 @@ ipcp_transform_function (struct cgraph_node *node)
>>                &cfg_changed).walk (ENTRY_BLOCK_PTR_FOR_FN (cfun));
>>
>>     int i;
>> -  struct ipa_bb_info *bi;
>> +  ipa_bb_info *bi;
>>     FOR_EACH_VEC_ELT (fbi.bb_infos, i, bi)
>>       free_ipa_bb_info (bi);
>>     fbi.bb_infos.release ();
>> diff --git a/gcc/ipa-prop.h b/gcc/ipa-prop.h
>> index 165fc1a..6c3b31f 100644
>> --- a/gcc/ipa-prop.h
>> +++ b/gcc/ipa-prop.h
>> @@ -20,7 +20,6 @@ along with GCC; see the file COPYING3.  If not see
>>   #ifndef IPA_PROP_H
>>   #define IPA_PROP_H
>>
>> -
>>   /* The following definitions and interfaces are used by
>>      interprocedural analyses or parameters.  */
>>
>> @@ -356,6 +355,8 @@ struct ipcp_lattice;
>>
>>   struct ipa_node_params
>>   {
>> +  ~ipa_node_params ();
>> +
>>     /* Information about individual formal parameters that are gathered when
>>        summaries are generated. */
>>     vec<ipa_param_descriptor> descriptors;
>> @@ -364,7 +365,7 @@ struct ipa_node_params
>>     struct ipcp_param_lattices *lattices;
>>     /* Only for versioned nodes this field would not be NULL,
>>        it points to the node that IPA cp cloned from.  */
>> -  struct cgraph_node *ipcp_orig_node;
>> +  cgraph_node *ipcp_orig_node;
>>     /* If this node is an ipa-cp clone, these are the known values that describe
>>        what it has been specialized for.  */
>>     vec<tree> known_vals;
>> @@ -470,7 +471,7 @@ struct GTY(()) ipa_agg_replacement_value
>>
>>   typedef struct ipa_agg_replacement_value *ipa_agg_replacement_value_p;
>>
>> -void ipa_set_node_agg_value_chain (struct cgraph_node *node,
>> +void ipa_set_node_agg_value_chain (const cgraph_node *node,
>>                      struct ipa_agg_replacement_value *aggvals);
>>
>>   /* ipa_edge_args stores information related to a callsite and particularly its
>> @@ -513,10 +514,22 @@ ipa_get_ith_polymorhic_call_context (struct ipa_edge_args *args, int i)
>>     return &(*args->polymorphic_call_contexts)[i];
>>   }
>>
>> -/* Types of vectors holding the infos.  */
>> +/* Callgraph summary for ipa_node_params.  */
>> +class ipa_node_params_cgraph_summary: public cgraph_summary <ipa_node_params *>
>> +{
>> +public:
>> +  ipa_node_params_cgraph_summary (symbol_table *table):
>> +    cgraph_summary <ipa_node_params *> (table) { }
>> +
>> +  /* Hook that is called by summary when a node is duplicated.  */
>> +  virtual void duplication_hook (cgraph_node *node,
>> +                 cgraph_node *node2,
>> +                 ipa_node_params *data,
>> +                 ipa_node_params *data2);
>> +};
>>
>>   /* Vector where the parameter infos are actually stored. */
>> -extern vec<ipa_node_params> ipa_node_params_vector;
>> +extern ipa_node_params_cgraph_summary *ipa_node_params_summary;
>>   /* Vector of known aggregate values in cloned nodes.  */
>>   extern GTY(()) vec<ipa_agg_replacement_value_p, va_gc> *ipa_node_agg_replacements;
>>   /* Vector where the parameter infos are actually stored. */
>> @@ -524,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_vector[(NODE)->uid])
>> +#define IPA_NODE_REF(NODE) ((*ipa_node_params_summary)[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.  */
>> @@ -534,11 +547,11 @@ extern GTY(()) vec<ipa_edge_args, va_gc> *ipa_edge_args_vector;
>>   void ipa_create_all_node_params (void);
>>   void ipa_create_all_edge_args (void);
>>   void ipa_free_edge_args_substructures (struct ipa_edge_args *);
>> -void ipa_free_node_params_substructures (struct ipa_node_params *);
>>   void ipa_free_all_node_params (void);
>>   void ipa_free_all_edge_args (void);
>>   void ipa_free_all_structures_after_ipa_cp (void);
>>   void ipa_free_all_structures_after_iinln (void);
>> +
>>   void ipa_register_cgraph_hooks (void);
>>   int count_formal_params (tree fndecl);
>>
>> @@ -548,11 +561,8 @@ int count_formal_params (tree fndecl);
>>   static inline void
>>   ipa_check_create_node_params (void)
>>   {
>> -  if (!ipa_node_params_vector.exists ())
>> -    ipa_node_params_vector.create (symtab->cgraph_max_uid);
>> -
>> -  if (ipa_node_params_vector.length () <= (unsigned) symtab->cgraph_max_uid)
>> -    ipa_node_params_vector.safe_grow_cleared (symtab->cgraph_max_uid + 1);
>> +  if (!ipa_node_params_summary)
>> +    ipa_node_params_summary = new ipa_node_params_cgraph_summary (symtab);
>>   }
>>
>>   /* This function ensures the array of edge arguments infos is big enough to
>> @@ -579,7 +589,7 @@ ipa_edge_args_info_available_for_edge_p (struct cgraph_edge *edge)
>>   /* Return the aggregate replacements for NODE, if there are any.  */
>>
>>   static inline struct ipa_agg_replacement_value *
>> -ipa_get_agg_replacements_for_node (struct cgraph_node *node)
>> +ipa_get_agg_replacements_for_node (const cgraph_node *node)
>>   {
>>     if ((unsigned) node->uid >= vec_safe_length (ipa_node_agg_replacements))
>>       return NULL;
>> @@ -587,7 +597,7 @@ ipa_get_agg_replacements_for_node (struct cgraph_node *node)
>>   }
>>
>>   /* Function formal parameters related computations.  */
>> -void ipa_initialize_node_params (struct cgraph_node *node);
>> +void ipa_initialize_node_params (const cgraph_node *node);
>>   bool ipa_propagate_indirect_call_infos (struct cgraph_edge *cs,
>>                       vec<cgraph_edge *> *new_edges);
>>
>> @@ -602,7 +612,7 @@ tree ipa_binfo_from_known_type_jfunc (struct ipa_jump_func *);
>>   tree ipa_impossible_devirt_target (struct cgraph_edge *, tree);
>>
>>   /* Functions related to both.  */
>> -void ipa_analyze_node (struct cgraph_node *);
>> +void ipa_analyze_node (cgraph_node *);
>>
>>   /* Aggregate jump function related functions.  */
>>   tree ipa_find_agg_cst_for_param (struct ipa_agg_jump_function *, HOST_WIDE_INT,
>> @@ -611,9 +621,9 @@ bool ipa_load_from_parm_agg (struct ipa_node_params *, gimple, tree, int *,
>>                    HOST_WIDE_INT *, bool *);
>>
>>   /* Debugging interface.  */
>> -void ipa_print_node_params (FILE *, struct cgraph_node *node);
>> +void ipa_print_node_params (FILE *, cgraph_node *node);
>>   void ipa_print_all_params (FILE *);
>> -void ipa_print_node_jump_functions (FILE *f, struct cgraph_node *node);
>> +void ipa_print_node_jump_functions (FILE *f, cgraph_node *node);
>>   void ipa_print_all_jump_functions (FILE * f);
>>   void ipcp_verify_propagated_values (void);
>>
>> @@ -717,7 +727,7 @@ void ipa_update_after_lto_read (void);
>>   int ipa_get_param_decl_index (struct ipa_node_params *, tree);
>>   tree ipa_value_from_jfunc (struct ipa_node_params *info,
>>                  struct ipa_jump_func *jfunc);
>> -unsigned int ipcp_transform_function (struct cgraph_node *node);
>> +unsigned int ipcp_transform_function (cgraph_node *node);
>>   void ipa_dump_param (FILE *, struct ipa_node_params *info, int i);
>>   bool ipa_modify_expr (tree *, bool, ipa_parm_adjustment_vec);
>>   ipa_parm_adjustment *ipa_get_adjustment_candidate (tree **, bool *,
>> diff --git a/gcc/ipa-split.c b/gcc/ipa-split.c
>> index 98dbc63..0a7ca53 100644
>> --- a/gcc/ipa-split.c
>> +++ b/gcc/ipa-split.c
>> @@ -109,6 +109,7 @@ along with GCC; see the file COPYING3.  If not see
>>   #include "ipa-ref.h"
>>   #include "cgraph.h"
>>   #include "alloc-pool.h"
>> +#include "cgraph_summary.h"
>>   #include "ipa-prop.h"
>>   #include "gimple-ssa.h"
>>   #include "tree-cfg.h"
>> diff --git a/gcc/ipa-utils.c b/gcc/ipa-utils.c
>> index 22900cc..83111bc 100644
>> --- a/gcc/ipa-utils.c
>> +++ b/gcc/ipa-utils.c
>> @@ -55,6 +55,7 @@ along with GCC; see the file COPYING3.  If not see
>>   #include "langhooks.h"
>>   #include "lto-streamer.h"
>>   #include "alloc-pool.h"
>> +#include "cgraph_summary.h"
>>   #include "ipa-prop.h"
>>   #include "ipa-inline.h"
>>
>> diff --git a/gcc/ipa.c b/gcc/ipa.c
>> index a6086d8..aded512 100644
>> --- a/gcc/ipa.c
>> +++ b/gcc/ipa.c
>> @@ -46,6 +46,7 @@ along with GCC; see the file COPYING3.  If not see
>>   #include "tree-iterator.h"
>>   #include "ipa-utils.h"
>>   #include "alloc-pool.h"
>> +#include "cgraph_summary.h"
>>   #include "ipa-prop.h"
>>   #include "ipa-inline.h"
>>   #include "tree-inline.h"
>> diff --git a/gcc/lto/lto-partition.c b/gcc/lto/lto-partition.c
>> index 0e1a95b..37d0f39 100644
>> --- a/gcc/lto/lto-partition.c
>> +++ b/gcc/lto/lto-partition.c
>> @@ -45,6 +45,7 @@ along with GCC; see the file COPYING3.  If not see
>>   #include "timevar.h"
>>   #include "params.h"
>>   #include "alloc-pool.h"
>> +#include "cgraph_summary.h"
>>   #include "ipa-prop.h"
>>   #include "ipa-inline.h"
>>   #include "ipa-utils.h"
>> diff --git a/gcc/lto/lto-symtab.c b/gcc/lto/lto-symtab.c
>> index 4c4e48a..ee97d06 100644
>> --- a/gcc/lto/lto-symtab.c
>> +++ b/gcc/lto/lto-symtab.c
>> @@ -45,6 +45,7 @@ along with GCC; see the file COPYING3.  If not see
>>   #include "lto-streamer.h"
>>   #include "ipa-utils.h"
>>   #include "alloc-pool.h"
>> +#include "cgraph_summary.h"
>>   #include "ipa-prop.h"
>>   #include "ipa-inline.h"
>>   #include "builtins.h"
>> diff --git a/gcc/lto/lto.c b/gcc/lto/lto.c
>> index d8519d9..c99dbdf 100644
>> --- a/gcc/lto/lto.c
>> +++ b/gcc/lto/lto.c
>> @@ -47,6 +47,7 @@ along with GCC; see the file COPYING3.  If not see
>>   #include "bitmap.h"
>>   #include "inchash.h"
>>   #include "alloc-pool.h"
>> +#include "cgraph_summary.h"
>>   #include "ipa-prop.h"
>>   #include "common.h"
>>   #include "debug.h"
>> diff --git a/gcc/omp-low.c b/gcc/omp-low.c
>> index b59d069..707379a 100644
>> --- a/gcc/omp-low.c
>> +++ b/gcc/omp-low.c
>> @@ -82,6 +82,7 @@ along with GCC; see the file COPYING3.  If not see
>>   #include "tree-cfgcleanup.h"
>>   #include "pretty-print.h"
>>   #include "alloc-pool.h"
>> +#include "cgraph_summary.h"
>>   #include "ipa-prop.h"
>>   #include "tree-nested.h"
>>   #include "tree-eh.h"
>> diff --git a/gcc/tree-inline.c b/gcc/tree-inline.c
>> index 8cb9510..a8e3561 100644
>> --- a/gcc/tree-inline.c
>> +++ b/gcc/tree-inline.c
>> @@ -74,6 +74,7 @@ along with GCC; see the file COPYING3.  If not see
>>   #include "ipa-ref.h"
>>   #include "cgraph.h"
>>   #include "alloc-pool.h"
>> +#include "cgraph_summary.h"
>>   #include "ipa-prop.h"
>>   #include "value-prof.h"
>>   #include "tree-pass.h"
>> diff --git a/gcc/tree-sra.c b/gcc/tree-sra.c
>> index 1e629bc..99b19b8 100644
>> --- a/gcc/tree-sra.c
>> +++ b/gcc/tree-sra.c
>> @@ -115,6 +115,7 @@ along with GCC; see the file COPYING3.  If not see
>>   #include "plugin-api.h"
>>   #include "ipa-ref.h"
>>   #include "cgraph.h"
>> +#include "cgraph_summary.h"
>>   #include "ipa-prop.h"
>>   #include "statistics.h"
>>   #include "params.h"
>> diff --git a/gcc/tree-ssa-pre.c b/gcc/tree-ssa-pre.c
>> index ea99198..b526cc9 100644
>> --- a/gcc/tree-ssa-pre.c
>> +++ b/gcc/tree-ssa-pre.c
>> @@ -77,6 +77,7 @@ along with GCC; see the file COPYING3.  If not see
>>   #include "plugin-api.h"
>>   #include "ipa-ref.h"
>>   #include "cgraph.h"
>> +#include "cgraph_summary.h"
>>   #include "ipa-prop.h"
>>   #include "tree-ssa-propagate.h"
>>   #include "ipa-utils.h"
>>
>
> Patch v2.
>
> Martin

Patch v3.

Martin

Comments

Martin Jambor Nov. 14, 2014, 5:08 p.m. UTC | #1
Hi,

On Fri, Nov 14, 2014 at 04:23:41PM +0100, Martin Liska wrote:
> Patch v3.
> 
> Martin

> From 7255ffaf7bb416037baa14499b197bac3be8c222 Mon Sep 17 00:00:00 2001
> From: mliska <mliska@suse.cz>
> Date: Fri, 14 Nov 2014 16:14:28 +0100
> Subject: [PATCH 2/3] First usage of cgraph_summary in ipa-prop pass.
> 
> gcc/ChangeLog:
> 
> 2014-11-12  Martin Liska  <mliska@suse.cz>
> 
> 	* ipa-prop.c (struct func_body_info): Struct keyword is removed.
> 	(struct ipa_cst_ref_desc): Likewise.
> 	(ipa_func_spec_opts_forbid_analysis_p): Likewise.
> 	(ipa_alloc_node_params): Likewise.
> 	(ipa_initialize_node_params): Likewise.
> 	(ipa_print_node_jump_functions_for_edge): Likewise.
> 	(ipa_print_node_jump_functions): Likewise.
> 	(ipa_print_all_jump_functions): Likewise.
> 	(ipa_set_jf_constant): Likewise.
> 	(check_stmt_for_type_change): Likewise.
> 	(detect_type_change_from_memory_writes): Likewise.
> 	(find_dominating_aa_status): Likewise.
> 	(parm_bb_aa_status_for_bb): Likewise.
> 	(parm_preserved_before_stmt_p): Likewise.
> 	(parm_ref_data_preserved_p): Likewise.
> 	(parm_ref_data_pass_through_p): Likewise.
> 	(struct ipa_known_agg_contents_list): Likewise.
> 	(get_place_in_agg_contents_list): Likewise.
> 	(build_agg_jump_func_from_list): Likewise.
> 	(determine_locally_known_aggregate_parts): Likewise.
> 	(ipa_compute_jump_functions_for_edge): Likewise.
> 	(ipa_compute_jump_functions_for_bb): Likewise.
> 	(ipa_note_param_call): Likewise.
> 	(ipa_analyze_indirect_call_uses) Likewise.:
> 	(ipa_analyze_virtual_call_uses): Likewise.
> 	(ipa_analyze_call_uses): Likewise.
> 	(visit_ref_for_mod_analysis): Likewise.
> 	(ipa_analyze_controlled_uses): Likewise.
> 	(ipa_analyze_node): Likewise.
> 	(update_jump_functions_after_inlining): Likewise.
> 	(ipa_make_edge_direct_to_target): Likewise.
> 	(ipa_find_agg_cst_for_param): Likewise.
> 	(remove_described_reference): Likewise.
> 	(jfunc_rdesc_usable): Likewise.
> 	(try_decrement_rdesc_refcount): Likewise.
> 	(try_make_edge_direct_simple_call): Likewise.
> 	(try_make_edge_direct_virtual_call): Likewise.
> 	(update_indirect_edges_after_inlining): Likewise.
> 	(propagate_info_to_inlined_callees): Likewise.
> 	(propagate_controlled_uses): Likewise.
> 	(ipa_propagate_indirect_call_infos): Likewise.
> 	(ipa_free_all_edge_args): Likewise.
> 	(ipa_node_params::~ipa_node_params): Likewise.
> 	(ipa_free_all_node_params): Likewise.
> 	(ipa_edge_removal_hook): Likewise.
> 	(ipa_node_removal_hook): Likewise.
> 	(ipa_edge_duplication_hook): Likewise.
> 	(ipa_add_new_function): Removed
> 	(ipa_node_params_t::duplicate): New function.
> 	(ipa_node_duplication_hook): Struct keyword removed.
> 	(ipa_register_cgraph_hooks): Removal of old hooks.
> 	(ipa_unregister_cgraph_hooks): Likewise.
> 	(ipa_print_node_params): Struct keyword is removed.
> 	(ipa_print_all_params): Likewise.
> 	(ipa_modify_formal_parameters): Likewise.
> 	(ipa_modify_call_arguments): Likewise.
> 	(ipa_modify_expr): Likewise.
> 	(ipa_get_adjustment_candidate): Likewise.
> 	(index_in_adjustments_multiple_times_p): Likewise.
> 	(ipa_combine_adjustments): Likewise.
> 	(ipa_dump_param_adjustments): Likewise.
> 	(ipa_write_jump_function): Likewise.
> 	(ipa_read_jump_function): Likewise.
> 	(ipa_write_indirect_edge_info): Likewise.
> 	(ipa_read_indirect_edge_info): Likewise.
> 	(ipa_write_node_info): Likewise.
> 	(ipa_read_node_info): Likewise.
> 	(ipa_prop_write_jump_functions): Likewise.
> 	(ipa_prop_read_section): Likewise.
> 	(ipa_prop_read_jump_functions): Likewise.
> 	(write_agg_replacement_chain): Likewise.
> 	(read_agg_replacement_chain): Likewise.
> 	(ipa_prop_write_all_agg_replacement): Likewise.
> 	(read_replacements_section): Likewise.
> 	(ipa_prop_read_all_agg_replacement): Likewise.
> 	(adjust_agg_replacement_values): Likewise.
> 	(ipcp_modif_dom_walker::before_dom_children): Likewise.
> 	(ipcp_transform_function): Likewise.

If you don't have to, please don't.  If you make a change somewhere
for some particular reason, by all means remove all struct keywords on
that line or in its vicinity, that is what I try to do as well.  But
this will just make it much more difficult to revive some older
patches of mine for no good reason. It also makes looking up and
reviewing the functional changes in this patch very slow and
demanding.

Martin
diff mbox

Patch

From 7255ffaf7bb416037baa14499b197bac3be8c222 Mon Sep 17 00:00:00 2001
From: mliska <mliska@suse.cz>
Date: Fri, 14 Nov 2014 16:14:28 +0100
Subject: [PATCH 2/3] First usage of cgraph_summary in ipa-prop pass.

gcc/ChangeLog:

2014-11-12  Martin Liska  <mliska@suse.cz>

	* auto-profile.c: Include symbol-summary.h.
	* cgraph.c: Likewise.
	* cgraphbuild.c: Likewise.
	* cgraphclones.c: Likewise.
	* cgraphunit.c: Likewise.
	* ipa-cp.c: Likewise.
	* ipa-devirt.c: Likewise.
	* ipa-icf.c: Likewise.
	* ipa-inline-analysis.c (evaluate_properties_for_edge): Usage of
	ipa_node_params_vector is replaced with ipa_node_params_t.
	(inline_node_duplication_hook): Likewise.
	(estimate_function_body_sizes): Likewise.
	(remap_edge_change_prob): Likewise.
	(inline_merge_summary): Likewise.
	* ipa-inline-transform.c: Include of symbol-summary.h.
	* ipa-inline.c (early_inliner): Usage of
	ipa_node_params_vector is replaced with ipa_node_params_t.
	* ipa-polymorphic-call.c: Include of symbol-summary.h.
	* ipa-profile.c: Include of symbol-summary.h.
	* ipa-prop.c (struct func_body_info): Struct keyword is removed.
	(struct ipa_cst_ref_desc): Likewise.
	(ipa_func_spec_opts_forbid_analysis_p): Likewise.
	(ipa_alloc_node_params): Likewise.
	(ipa_initialize_node_params): Likewise.
	(ipa_print_node_jump_functions_for_edge): Likewise.
	(ipa_print_node_jump_functions): Likewise.
	(ipa_print_all_jump_functions): Likewise.
	(ipa_set_jf_constant): Likewise.
	(check_stmt_for_type_change): Likewise.
	(detect_type_change_from_memory_writes): Likewise.
	(find_dominating_aa_status): Likewise.
	(parm_bb_aa_status_for_bb): Likewise.
	(parm_preserved_before_stmt_p): Likewise.
	(parm_ref_data_preserved_p): Likewise.
	(parm_ref_data_pass_through_p): Likewise.
	(struct ipa_known_agg_contents_list): Likewise.
	(get_place_in_agg_contents_list): Likewise.
	(build_agg_jump_func_from_list): Likewise.
	(determine_locally_known_aggregate_parts): Likewise.
	(ipa_compute_jump_functions_for_edge): Likewise.
	(ipa_compute_jump_functions_for_bb): Likewise.
	(ipa_note_param_call): Likewise.
	(ipa_analyze_indirect_call_uses) Likewise.:
	(ipa_analyze_virtual_call_uses): Likewise.
	(ipa_analyze_call_uses): Likewise.
	(visit_ref_for_mod_analysis): Likewise.
	(ipa_analyze_controlled_uses): Likewise.
	(ipa_analyze_node): Likewise.
	(update_jump_functions_after_inlining): Likewise.
	(ipa_make_edge_direct_to_target): Likewise.
	(ipa_find_agg_cst_for_param): Likewise.
	(remove_described_reference): Likewise.
	(jfunc_rdesc_usable): Likewise.
	(try_decrement_rdesc_refcount): Likewise.
	(try_make_edge_direct_simple_call): Likewise.
	(try_make_edge_direct_virtual_call): Likewise.
	(update_indirect_edges_after_inlining): Likewise.
	(propagate_info_to_inlined_callees): Likewise.
	(propagate_controlled_uses): Likewise.
	(ipa_propagate_indirect_call_infos): Likewise.
	(ipa_free_all_edge_args): Likewise.
	(ipa_node_params::~ipa_node_params): Likewise.
	(ipa_free_all_node_params): Likewise.
	(ipa_edge_removal_hook): Likewise.
	(ipa_node_removal_hook): Likewise.
	(ipa_edge_duplication_hook): Likewise.
	(ipa_add_new_function): Removed
	(ipa_node_params_t::duplicate): New function.
	(ipa_node_duplication_hook): Struct keyword removed.
	(ipa_register_cgraph_hooks): Removal of old hooks.
	(ipa_unregister_cgraph_hooks): Likewise.
	(ipa_print_node_params): Struct keyword is removed.
	(ipa_print_all_params): Likewise.
	(ipa_modify_formal_parameters): Likewise.
	(ipa_modify_call_arguments): Likewise.
	(ipa_modify_expr): Likewise.
	(ipa_get_adjustment_candidate): Likewise.
	(index_in_adjustments_multiple_times_p): Likewise.
	(ipa_combine_adjustments): Likewise.
	(ipa_dump_param_adjustments): Likewise.
	(ipa_write_jump_function): Likewise.
	(ipa_read_jump_function): Likewise.
	(ipa_write_indirect_edge_info): Likewise.
	(ipa_read_indirect_edge_info): Likewise.
	(ipa_write_node_info): Likewise.
	(ipa_read_node_info): Likewise.
	(ipa_prop_write_jump_functions): Likewise.
	(ipa_prop_read_section): Likewise.
	(ipa_prop_read_jump_functions): Likewise.
	(write_agg_replacement_chain): Likewise.
	(read_agg_replacement_chain): Likewise.
	(ipa_prop_write_all_agg_replacement): Likewise.
	(read_replacements_section): Likewise.
	(ipa_prop_read_all_agg_replacement): Likewise.
	(adjust_agg_replacement_values): Likewise.
	(ipcp_modif_dom_walker::before_dom_children): Likewise.
	(ipcp_transform_function): Likewise.
	* ipa-prop.h (struct ipa_node_params): Introduction of new class
	ipa_node_params_t.
	* ipa-split.c: Include symbol-summary.h.
	* ipa-utils.c: Likewise.
	* ipa.c: Likewise.
	* omp-low.c: Likewise.
	* tree-inline.c: Likewise.
	* tree-sra.c: Likewise.
	* tree-ssa-pre.c: Likewise.

gcc/lto/ChangeLog:

2014-11-12  Martin Liska  <mliska@suse.cz>

	* lto-partition.c: Include symbol-summary.h.
	* lto-symtab.c: Likewise.
	* lto.c: Likewise.

Conflicts:
	gcc/symbol-summary.h
---
 gcc/auto-profile.c         |   1 +
 gcc/cgraph.c               |   1 +
 gcc/cgraphbuild.c          |   1 +
 gcc/cgraphclones.c         |   1 +
 gcc/cgraphunit.c           |   1 +
 gcc/ipa-cp.c               |   1 +
 gcc/ipa-devirt.c           |   1 +
 gcc/ipa-icf.c              |   1 +
 gcc/ipa-inline-analysis.c  |  13 +-
 gcc/ipa-inline-transform.c |   1 +
 gcc/ipa-inline.c           |   3 +-
 gcc/ipa-polymorphic-call.c |   1 +
 gcc/ipa-profile.c          |   1 +
 gcc/ipa-prop.c             | 702 ++++++++++++++++++++++-----------------------
 gcc/ipa-prop.h             |  48 ++--
 gcc/ipa-split.c            |   1 +
 gcc/ipa-utils.c            |   1 +
 gcc/ipa.c                  |   1 +
 gcc/lto/lto-partition.c    |   1 +
 gcc/lto/lto-symtab.c       |   1 +
 gcc/lto/lto.c              |   1 +
 gcc/omp-low.c              |   1 +
 gcc/tree-inline.c          |   1 +
 gcc/tree-sra.c             |   1 +
 gcc/tree-ssa-pre.c         |   1 +
 25 files changed, 397 insertions(+), 390 deletions(-)

diff --git a/gcc/auto-profile.c b/gcc/auto-profile.c
index 8c7b4ca..3119d04 100644
--- a/gcc/auto-profile.c
+++ b/gcc/auto-profile.c
@@ -67,6 +67,7 @@  along with GCC; see the file COPYING3.  If not see
 #include "coverage.h"
 #include "params.h"
 #include "alloc-pool.h"
+#include "symbol-summary.h"
 #include "ipa-prop.h"
 #include "ipa-inline.h"
 #include "tree-inline.h"
diff --git a/gcc/cgraph.c b/gcc/cgraph.c
index 7216b89..d60c610 100644
--- a/gcc/cgraph.c
+++ b/gcc/cgraph.c
@@ -72,6 +72,7 @@  along with GCC; see the file COPYING3.  If not see
 #include "ipa-utils.h"
 #include "lto-streamer.h"
 #include "alloc-pool.h"
+#include "symbol-summary.h"
 #include "ipa-prop.h"
 #include "ipa-inline.h"
 #include "cfgloop.h"
diff --git a/gcc/cgraphbuild.c b/gcc/cgraphbuild.c
index c72ceab..007c386 100644
--- a/gcc/cgraphbuild.c
+++ b/gcc/cgraphbuild.c
@@ -52,6 +52,7 @@  along with GCC; see the file COPYING3.  If not see
 #include "ipa-utils.h"
 #include "except.h"
 #include "alloc-pool.h"
+#include "symbol-summary.h"
 #include "ipa-prop.h"
 #include "ipa-inline.h"
 
diff --git a/gcc/cgraphclones.c b/gcc/cgraphclones.c
index c8892da..5091b3b 100644
--- a/gcc/cgraphclones.c
+++ b/gcc/cgraphclones.c
@@ -103,6 +103,7 @@  along with GCC; see the file COPYING3.  If not see
 #include "ipa-ref.h"
 #include "cgraph.h"
 #include "alloc-pool.h"
+#include "symbol-summary.h"
 #include "ipa-prop.h"
 #include "tree-iterator.h"
 #include "tree-dump.h"
diff --git a/gcc/cgraphunit.c b/gcc/cgraphunit.c
index 25af234..93f8d91 100644
--- a/gcc/cgraphunit.c
+++ b/gcc/cgraphunit.c
@@ -204,6 +204,7 @@  along with GCC; see the file COPYING3.  If not see
 #include "ipa-ref.h"
 #include "cgraph.h"
 #include "alloc-pool.h"
+#include "symbol-summary.h"
 #include "ipa-prop.h"
 #include "tree-iterator.h"
 #include "tree-pass.h"
diff --git a/gcc/ipa-cp.c b/gcc/ipa-cp.c
index 47f9f5c..56d1ae9 100644
--- a/gcc/ipa-cp.c
+++ b/gcc/ipa-cp.c
@@ -123,6 +123,7 @@  along with GCC; see the file COPYING3.  If not see
 #include "ipa-ref.h"
 #include "cgraph.h"
 #include "alloc-pool.h"
+#include "symbol-summary.h"
 #include "ipa-prop.h"
 #include "bitmap.h"
 #include "tree-pass.h"
diff --git a/gcc/ipa-devirt.c b/gcc/ipa-devirt.c
index 32c6549..0be721b 100644
--- a/gcc/ipa-devirt.c
+++ b/gcc/ipa-devirt.c
@@ -139,6 +139,7 @@  along with GCC; see the file COPYING3.  If not see
 #include "gimple-expr.h"
 #include "gimple.h"
 #include "alloc-pool.h"
+#include "symbol-summary.h"
 #include "ipa-prop.h"
 #include "ipa-inline.h"
 #include "diagnostic.h"
diff --git a/gcc/ipa-icf.c b/gcc/ipa-icf.c
index 92ec82d..e8892d4 100644
--- a/gcc/ipa-icf.c
+++ b/gcc/ipa-icf.c
@@ -87,6 +87,7 @@  along with GCC; see the file COPYING3.  If not see
 #include "ipa-ref.h"
 #include "cgraph.h"
 #include "alloc-pool.h"
+#include "symbol-summary.h"
 #include "ipa-prop.h"
 #include "ipa-inline.h"
 #include "cfgloop.h"
diff --git a/gcc/ipa-inline-analysis.c b/gcc/ipa-inline-analysis.c
index eb1c6ec..84da4dc 100644
--- a/gcc/ipa-inline-analysis.c
+++ b/gcc/ipa-inline-analysis.c
@@ -110,6 +110,7 @@  along with GCC; see the file COPYING3.  If not see
 #include "ipa-ref.h"
 #include "cgraph.h"
 #include "alloc-pool.h"
+#include "symbol-summary.h"
 #include "ipa-prop.h"
 #include "lto-streamer.h"
 #include "data-streamer.h"
@@ -910,7 +911,7 @@  evaluate_properties_for_edge (struct cgraph_edge *e, bool inline_p,
   if (known_binfos_ptr)
     known_binfos_ptr->create (0);
 
-  if (ipa_node_params_vector.exists ()
+  if (ipa_node_params_d
       && !e->call_stmt_cannot_inline_p
       && ((clause_ptr && info->conds) || known_vals_ptr || known_binfos_ptr))
     {
@@ -1130,7 +1131,7 @@  inline_node_duplication_hook (struct cgraph_node *src,
 
   /* When there are any replacements in the function body, see if we can figure
      out that something was optimized out.  */
-  if (ipa_node_params_vector.exists () && dst->clone.tree_map)
+  if (ipa_node_params_d && dst->clone.tree_map)
     {
       vec<size_time_entry, va_gc> *entry = info->entry;
       /* Use SRC parm info since it may not be copied yet.  */
@@ -2476,7 +2477,7 @@  estimate_function_body_sizes (struct cgraph_node *node, bool early)
       calculate_dominance_info (CDI_DOMINATORS);
       loop_optimizer_init (LOOPS_NORMAL | LOOPS_HAVE_RECORDED_EXITS);
 
-      if (ipa_node_params_vector.exists ())
+      if (ipa_node_params_d)
 	{
 	  parms_info = IPA_NODE_REF (node);
 	  nonconstant_names.safe_grow_cleared
@@ -2624,7 +2625,7 @@  estimate_function_body_sizes (struct cgraph_node *node, bool early)
 		  nonconstant_names[SSA_NAME_VERSION (gimple_call_lhs (stmt))]
 		    = false_p;
 		}
-	      if (ipa_node_params_vector.exists ())
+	      if (ipa_node_params_d)
 		{
 		  int count = gimple_call_num_args (stmt);
 		  int i;
@@ -3367,7 +3368,7 @@  static void
 remap_edge_change_prob (struct cgraph_edge *inlined_edge,
 			struct cgraph_edge *edge)
 {
-  if (ipa_node_params_vector.exists ())
+  if (ipa_node_params_d)
     {
       int i;
       struct ipa_edge_args *args = IPA_EDGE_REF (edge);
@@ -3523,7 +3524,7 @@  inline_merge_summary (struct cgraph_edge *edge)
   else
     toplev_predicate = true_predicate ();
 
-  if (ipa_node_params_vector.exists () && callee_info->conds)
+  if (ipa_node_params_d && callee_info->conds)
     {
       struct ipa_edge_args *args = IPA_EDGE_REF (edge);
       int count = ipa_get_cs_argument_count (args);
diff --git a/gcc/ipa-inline-transform.c b/gcc/ipa-inline-transform.c
index dbc56c5..49c2679 100644
--- a/gcc/ipa-inline-transform.c
+++ b/gcc/ipa-inline-transform.c
@@ -51,6 +51,7 @@  along with GCC; see the file COPYING3.  If not see
 #include "ipa-ref.h"
 #include "cgraph.h"
 #include "alloc-pool.h"
+#include "symbol-summary.h"
 #include "ipa-prop.h"
 #include "ipa-inline.h"
 #include "tree-inline.h"
diff --git a/gcc/ipa-inline.c b/gcc/ipa-inline.c
index 5c97815..a8e94e2 100644
--- a/gcc/ipa-inline.c
+++ b/gcc/ipa-inline.c
@@ -129,6 +129,7 @@  along with GCC; see the file COPYING3.  If not see
 #include "ipa-ref.h"
 #include "cgraph.h"
 #include "alloc-pool.h"
+#include "symbol-summary.h"
 #include "ipa-prop.h"
 #include "except.h"
 #include "target.h"
@@ -2400,7 +2401,7 @@  early_inliner (function *fun)
      it.  This may confuse ourself when early inliner decide to inline call to
      function clone, because function clones don't have parameter list in
      ipa-prop matching their signature.  */
-  if (ipa_node_params_vector.exists ())
+  if (ipa_node_params_d)
     return 0;
 
 #ifdef ENABLE_CHECKING
diff --git a/gcc/ipa-polymorphic-call.c b/gcc/ipa-polymorphic-call.c
index 33dd1a8..ea7f9a6 100644
--- a/gcc/ipa-polymorphic-call.c
+++ b/gcc/ipa-polymorphic-call.c
@@ -52,6 +52,7 @@  along with GCC; see the file COPYING3.  If not see
 #include "gimple-expr.h"
 #include "gimple.h"
 #include "alloc-pool.h"
+#include "symbol-summary.h"
 #include "ipa-prop.h"
 #include "ipa-inline.h"
 #include "diagnostic.h"
diff --git a/gcc/ipa-profile.c b/gcc/ipa-profile.c
index b83d1cf..ddbc17a 100644
--- a/gcc/ipa-profile.c
+++ b/gcc/ipa-profile.c
@@ -82,6 +82,7 @@  along with GCC; see the file COPYING3.  If not see
 #include "tree-inline.h"
 #include "lto-streamer.h"
 #include "data-streamer.h"
+#include "symbol-summary.h"
 #include "ipa-prop.h"
 #include "ipa-inline.h"
 
diff --git a/gcc/ipa-prop.c b/gcc/ipa-prop.c
index db85c7d..c356845 100644
--- a/gcc/ipa-prop.c
+++ b/gcc/ipa-prop.c
@@ -54,6 +54,7 @@  along with GCC; see the file COPYING3.  If not see
 #include "ipa-ref.h"
 #include "cgraph.h"
 #include "alloc-pool.h"
+#include "symbol-summary.h"
 #include "ipa-prop.h"
 #include "bitmap.h"
 #include "gimple-ssa.h"
@@ -119,7 +120,7 @@  struct func_body_info
   cgraph_node *node;
 
   /* Its info.  */
-  struct ipa_node_params *info;
+  ipa_node_params *info;
 
   /* Information about individual BBs. */
   vec<ipa_bb_info> bb_infos;
@@ -131,27 +132,25 @@  struct func_body_info
   unsigned int aa_walked;
 };
 
-/* Vector where the parameter infos are actually stored. */
-vec<ipa_node_params> ipa_node_params_vector;
+/* Function summary where the parameter infos are actually stored. */
+ipa_node_params_t *ipa_node_params_d = NULL;
 /* Vector of known aggregate values in cloned nodes.  */
 vec<ipa_agg_replacement_value_p, va_gc> *ipa_node_agg_replacements;
 /* Vector where the parameter infos are actually stored. */
 vec<ipa_edge_args, va_gc> *ipa_edge_args_vector;
 
 /* Holders of ipa cgraph hooks: */
-static struct cgraph_edge_hook_list *edge_removal_hook_holder;
-static struct cgraph_node_hook_list *node_removal_hook_holder;
-static struct cgraph_2edge_hook_list *edge_duplication_hook_holder;
-static struct cgraph_2node_hook_list *node_duplication_hook_holder;
-static struct cgraph_node_hook_list *function_insertion_hook_holder;
+static cgraph_edge_hook_list *edge_removal_hook_holder;
+static cgraph_2edge_hook_list *edge_duplication_hook_holder;
+static cgraph_node_hook_list *function_insertion_hook_holder;
 
 /* Description of a reference to an IPA constant.  */
 struct ipa_cst_ref_desc
 {
   /* Edge that corresponds to the statement which took the reference.  */
-  struct cgraph_edge *cs;
+  cgraph_edge *cs;
   /* Linked list of duplicates created when call graph edges are cloned.  */
-  struct ipa_cst_ref_desc *next_duplicate;
+  ipa_cst_ref_desc *next_duplicate;
   /* Number of references in IPA structures, IPA_UNDESCRIBED_USE if the value
      if out of control.  */
   int refcount;
@@ -165,10 +164,10 @@  static alloc_pool ipa_refdesc_pool;
    with NODE should prevent us from analyzing it for the purposes of IPA-CP.  */
 
 static bool
-ipa_func_spec_opts_forbid_analysis_p (struct cgraph_node *node)
+ipa_func_spec_opts_forbid_analysis_p (cgraph_node *node)
 {
   tree fs_opts = DECL_FUNCTION_SPECIFIC_OPTIMIZATION (node->decl);
-  struct cl_optimization *os;
+  cl_optimization *os;
 
   if (!fs_opts)
     return false;
@@ -196,7 +195,7 @@  ipa_get_param_decl_index_1 (vec<ipa_param_descriptor> descriptors, tree ptree)
    to INFO.  */
 
 int
-ipa_get_param_decl_index (struct ipa_node_params *info, tree ptree)
+ipa_get_param_decl_index (ipa_node_params *info, tree ptree)
 {
   return ipa_get_param_decl_index_1 (info->descriptors, ptree);
 }
@@ -205,7 +204,7 @@  ipa_get_param_decl_index (struct ipa_node_params *info, tree ptree)
    NODE.  */
 
 static void
-ipa_populate_param_decls (struct cgraph_node *node,
+ipa_populate_param_decls (cgraph_node *node,
 			  vec<ipa_param_descriptor> &descriptors)
 {
   tree fndecl;
@@ -246,7 +245,7 @@  count_formal_params (tree fndecl)
    using ipa_initialize_node_params. */
 
 void
-ipa_dump_param (FILE *file, struct ipa_node_params *info, int i)
+ipa_dump_param (FILE *file, ipa_node_params *info, int i)
 {
   fprintf (file, "param #%i", i);
   if (info->descriptors[i].decl)
@@ -260,9 +259,9 @@  ipa_dump_param (FILE *file, struct ipa_node_params *info, int i)
    to hold PARAM_COUNT parameters.  */
 
 void
-ipa_alloc_node_params (struct cgraph_node *node, int param_count)
+ipa_alloc_node_params (cgraph_node *node, int param_count)
 {
-  struct ipa_node_params *info = IPA_NODE_REF (node);
+  ipa_node_params *info = IPA_NODE_REF (node);
 
   if (!info->descriptors.exists () && param_count)
     info->descriptors.safe_grow_cleared (param_count);
@@ -273,9 +272,9 @@  ipa_alloc_node_params (struct cgraph_node *node, int param_count)
    param_decls.  */
 
 void
-ipa_initialize_node_params (struct cgraph_node *node)
+ipa_initialize_node_params (cgraph_node *node)
 {
-  struct ipa_node_params *info = IPA_NODE_REF (node);
+  ipa_node_params *info = IPA_NODE_REF (node);
 
   if (!info->descriptors.exists ())
     {
@@ -287,14 +286,14 @@  ipa_initialize_node_params (struct cgraph_node *node)
 /* Print the jump functions associated with call graph edge CS to file F.  */
 
 static void
-ipa_print_node_jump_functions_for_edge (FILE *f, struct cgraph_edge *cs)
+ipa_print_node_jump_functions_for_edge (FILE *f, cgraph_edge *cs)
 {
   int i, count;
 
   count = ipa_get_cs_argument_count (IPA_EDGE_REF (cs));
   for (i = 0; i < count; i++)
     {
-      struct ipa_jump_func *jump_func;
+      ipa_jump_func *jump_func;
       enum jump_func_type type;
 
       jump_func = ipa_get_ith_jump_func (IPA_EDGE_REF (cs), i);
@@ -360,7 +359,7 @@  ipa_print_node_jump_functions_for_edge (FILE *f, struct cgraph_edge *cs)
 
       if (jump_func->agg.items)
 	{
-	  struct ipa_agg_jf_item *item;
+	  ipa_agg_jf_item *item;
 	  int j;
 
 	  fprintf (f, "         Aggregate passed by %s:\n",
@@ -390,9 +389,9 @@  ipa_print_node_jump_functions_for_edge (FILE *f, struct cgraph_edge *cs)
    NODE to file F.  */
 
 void
-ipa_print_node_jump_functions (FILE *f, struct cgraph_node *node)
+ipa_print_node_jump_functions (FILE *f, cgraph_node *node)
 {
-  struct cgraph_edge *cs;
+  cgraph_edge *cs;
 
   fprintf (f, "  Jump functions of caller  %s/%i:\n", node->name (),
 	   node->order);
@@ -410,7 +409,7 @@  ipa_print_node_jump_functions (FILE *f, struct cgraph_node *node)
 
   for (cs = node->indirect_calls; cs; cs = cs->next_callee)
     {
-      struct cgraph_indirect_call_info *ii;
+      cgraph_indirect_call_info *ii;
       if (!ipa_edge_args_info_available_for_edge_p (cs))
 	continue;
 
@@ -445,7 +444,7 @@  ipa_print_node_jump_functions (FILE *f, struct cgraph_node *node)
 void
 ipa_print_all_jump_functions (FILE *f)
 {
-  struct cgraph_node *node;
+  cgraph_node *node;
 
   fprintf (f, "\nJump functions:\n");
   FOR_EACH_FUNCTION (node)
@@ -457,7 +456,7 @@  ipa_print_all_jump_functions (FILE *f)
 /* Set JFUNC to be a known type jump function.  */
 
 static void
-ipa_set_jf_known_type (struct ipa_jump_func *jfunc, HOST_WIDE_INT offset,
+ipa_set_jf_known_type (ipa_jump_func *jfunc, HOST_WIDE_INT offset,
 		       tree base_type, tree component_type)
 {
   /* Recording and propagating main variants increases change that types
@@ -480,8 +479,8 @@  ipa_set_jf_known_type (struct ipa_jump_func *jfunc, HOST_WIDE_INT offset,
    combination code).  The two functions will share their rdesc.  */
 
 static void
-ipa_set_jf_cst_copy (struct ipa_jump_func *dst,
-		     struct ipa_jump_func *src)
+ipa_set_jf_cst_copy (ipa_jump_func *dst,
+		     ipa_jump_func *src)
 
 {
   gcc_checking_assert (src->type == IPA_JF_CONST);
@@ -492,8 +491,8 @@  ipa_set_jf_cst_copy (struct ipa_jump_func *dst,
 /* Set JFUNC to be a constant jmp function.  */
 
 static void
-ipa_set_jf_constant (struct ipa_jump_func *jfunc, tree constant,
-		     struct cgraph_edge *cs)
+ipa_set_jf_constant (ipa_jump_func *jfunc, tree constant,
+		     cgraph_edge *cs)
 {
   constant = unshare_expr (constant);
   if (constant && EXPR_P (constant))
@@ -504,12 +503,12 @@  ipa_set_jf_constant (struct ipa_jump_func *jfunc, tree constant,
   if (TREE_CODE (constant) == ADDR_EXPR
       && TREE_CODE (TREE_OPERAND (constant, 0)) == FUNCTION_DECL)
     {
-      struct ipa_cst_ref_desc *rdesc;
+      ipa_cst_ref_desc *rdesc;
       if (!ipa_refdesc_pool)
 	ipa_refdesc_pool = create_alloc_pool ("IPA-PROP ref descriptions",
-					sizeof (struct ipa_cst_ref_desc), 32);
+					sizeof (ipa_cst_ref_desc), 32);
 
-      rdesc = (struct ipa_cst_ref_desc *) pool_alloc (ipa_refdesc_pool);
+      rdesc = (ipa_cst_ref_desc *) pool_alloc (ipa_refdesc_pool);
       rdesc->cs = cs;
       rdesc->next_duplicate = NULL;
       rdesc->refcount = 1;
@@ -521,7 +520,7 @@  ipa_set_jf_constant (struct ipa_jump_func *jfunc, tree constant,
 
 /* Set JFUNC to be a simple pass-through jump function.  */
 static void
-ipa_set_jf_simple_pass_through (struct ipa_jump_func *jfunc, int formal_id,
+ipa_set_jf_simple_pass_through (ipa_jump_func *jfunc, int formal_id,
 				bool agg_preserved, bool type_preserved)
 {
   jfunc->type = IPA_JF_PASS_THROUGH;
@@ -535,7 +534,7 @@  ipa_set_jf_simple_pass_through (struct ipa_jump_func *jfunc, int formal_id,
 /* Set JFUNC to be an arithmetic pass through jump function.  */
 
 static void
-ipa_set_jf_arith_pass_through (struct ipa_jump_func *jfunc, int formal_id,
+ipa_set_jf_arith_pass_through (ipa_jump_func *jfunc, int formal_id,
 			       tree operand, enum tree_code operation)
 {
   jfunc->type = IPA_JF_PASS_THROUGH;
@@ -549,7 +548,7 @@  ipa_set_jf_arith_pass_through (struct ipa_jump_func *jfunc, int formal_id,
 /* Set JFUNC to be an ancestor jump function.  */
 
 static void
-ipa_set_ancestor_jf (struct ipa_jump_func *jfunc, HOST_WIDE_INT offset,
+ipa_set_ancestor_jf (ipa_jump_func *jfunc, HOST_WIDE_INT offset,
 		     tree type, int formal_id, bool agg_preserved,
 		     bool type_preserved)
 {
@@ -572,7 +571,7 @@  ipa_set_ancestor_jf (struct ipa_jump_func *jfunc, HOST_WIDE_INT offset,
    jump function.  */
 
 tree
-ipa_binfo_from_known_type_jfunc (struct ipa_jump_func *jfunc)
+ipa_binfo_from_known_type_jfunc (ipa_jump_func *jfunc)
 {
   if (!RECORD_OR_UNION_TYPE_P (jfunc->value.known_type.base_type))
     return NULL_TREE;
@@ -602,8 +601,8 @@  ipa_binfo_from_known_type_jfunc (struct ipa_jump_func *jfunc)
 /* Get IPA BB information about the given BB.  FBI is the context of analyzis
    of this function body.  */
 
-static struct ipa_bb_info *
-ipa_get_bb_info (struct func_body_info *fbi, basic_block bb)
+static ipa_bb_info *
+ipa_get_bb_info (func_body_info *fbi, basic_block bb)
 {
   gcc_checking_assert (fbi);
   return &fbi->bb_infos[bb->index];
@@ -700,7 +699,7 @@  stmt_may_be_vtbl_ptr_store (gimple stmt)
    identified, return the type.  Otherwise return NULL_TREE.  */
 
 static tree
-extr_type_from_vtbl_ptr_store (gimple stmt, struct prop_type_change_info *tci)
+extr_type_from_vtbl_ptr_store (gimple stmt, prop_type_change_info *tci)
 {
   HOST_WIDE_INT offset, size, max_size;
   tree lhs, rhs, base, binfo;
@@ -752,7 +751,7 @@  static bool
 check_stmt_for_type_change (ao_ref *ao ATTRIBUTE_UNUSED, tree vdef, void *data)
 {
   gimple stmt = SSA_NAME_DEF_STMT (vdef);
-  struct prop_type_change_info *tci = (struct prop_type_change_info *) data;
+  prop_type_change_info *tci = (prop_type_change_info *) data;
 
   if (stmt_may_be_vtbl_ptr_store (stmt))
     {
@@ -847,10 +846,10 @@  param_type_may_change_p (tree function, tree arg, gimple call)
 
 static bool
 detect_type_change_from_memory_writes (tree arg, tree base, tree comp_type,
-				       gimple call, struct ipa_jump_func *jfunc,
+				       gimple call, ipa_jump_func *jfunc,
 				       HOST_WIDE_INT offset)
 {
-  struct prop_type_change_info tci;
+  prop_type_change_info tci;
   ao_ref ao;
   bool entry_reached = false;
 
@@ -908,7 +907,7 @@  detect_type_change_from_memory_writes (tree arg, tree base, tree comp_type,
 
 static bool
 detect_type_change (tree arg, tree base, tree comp_type, gimple call,
-		    struct ipa_jump_func *jfunc, HOST_WIDE_INT offset)
+		    ipa_jump_func *jfunc, HOST_WIDE_INT offset)
 {
   if (!flag_devirtualize)
     return false;
@@ -928,7 +927,7 @@  detect_type_change (tree arg, tree base, tree comp_type, gimple call,
 
 static bool
 detect_type_change_ssa (tree arg, tree comp_type,
-			gimple call, struct ipa_jump_func *jfunc)
+			gimple call, ipa_jump_func *jfunc)
 {
   gcc_checking_assert (TREE_CODE (arg) == SSA_NAME);
   if (!flag_devirtualize
@@ -961,7 +960,7 @@  mark_modified (ao_ref *ao ATTRIBUTE_UNUSED, tree vdef ATTRIBUTE_UNUSED,
    should really just start giving up.  */
 
 static bool
-aa_overwalked (struct func_body_info *fbi)
+aa_overwalked (func_body_info *fbi)
 {
   gcc_checking_assert (fbi);
   return fbi->aa_walked > (unsigned) PARAM_VALUE (PARAM_IPA_MAX_AA_STEPS);
@@ -970,8 +969,8 @@  aa_overwalked (struct func_body_info *fbi)
 /* Find the nearest valid aa status for parameter specified by INDEX that
    dominates BB.  */
 
-static struct param_aa_status *
-find_dominating_aa_status (struct func_body_info *fbi, basic_block bb,
+static param_aa_status *
+find_dominating_aa_status (func_body_info *fbi, basic_block bb,
 			   int index)
 {
   while (true)
@@ -979,7 +978,7 @@  find_dominating_aa_status (struct func_body_info *fbi, basic_block bb,
       bb = get_immediate_dominator (CDI_DOMINATORS, bb);
       if (!bb)
 	return NULL;
-      struct ipa_bb_info *bi = ipa_get_bb_info (fbi, bb);
+      ipa_bb_info *bi = ipa_get_bb_info (fbi, bb);
       if (!bi->param_aa_statuses.is_empty ()
 	  && bi->param_aa_statuses[index].valid)
 	return &bi->param_aa_statuses[index];
@@ -990,21 +989,21 @@  find_dominating_aa_status (struct func_body_info *fbi, basic_block bb,
    structures and/or intialize the result with a dominating description as
    necessary.  */
 
-static struct param_aa_status *
-parm_bb_aa_status_for_bb (struct func_body_info *fbi, basic_block bb,
+static param_aa_status *
+parm_bb_aa_status_for_bb (func_body_info *fbi, basic_block bb,
 			  int index)
 {
   gcc_checking_assert (fbi);
-  struct ipa_bb_info *bi = ipa_get_bb_info (fbi, bb);
+  ipa_bb_info *bi = ipa_get_bb_info (fbi, bb);
   if (bi->param_aa_statuses.is_empty ())
     bi->param_aa_statuses.safe_grow_cleared (fbi->param_count);
-  struct param_aa_status *paa = &bi->param_aa_statuses[index];
+  param_aa_status *paa = &bi->param_aa_statuses[index];
   if (!paa->valid)
     {
       gcc_checking_assert (!paa->parm_modified
 			   && !paa->ref_modified
 			   && !paa->pt_modified);
-      struct param_aa_status *dom_paa;
+      param_aa_status *dom_paa;
       dom_paa = find_dominating_aa_status (fbi, bb, index);
       if (dom_paa)
 	*paa = *dom_paa;
@@ -1021,10 +1020,10 @@  parm_bb_aa_status_for_bb (struct func_body_info *fbi, basic_block bb,
    gathered but do not survive the summary building stage.  */
 
 static bool
-parm_preserved_before_stmt_p (struct func_body_info *fbi, int index,
+parm_preserved_before_stmt_p (func_body_info *fbi, int index,
 			      gimple stmt, tree parm_load)
 {
-  struct param_aa_status *paa;
+  param_aa_status *paa;
   bool modified = false;
   ao_ref refd;
 
@@ -1060,7 +1059,7 @@  parm_preserved_before_stmt_p (struct func_body_info *fbi, int index,
    modified.  Otherwise return -1.  */
 
 static int
-load_from_unmodified_param (struct func_body_info *fbi,
+load_from_unmodified_param (func_body_info *fbi,
 			    vec<ipa_param_descriptor> descriptors,
 			    gimple stmt)
 {
@@ -1087,10 +1086,10 @@  load_from_unmodified_param (struct func_body_info *fbi,
    before reaching statement STMT.  */
 
 static bool
-parm_ref_data_preserved_p (struct func_body_info *fbi,
+parm_ref_data_preserved_p (func_body_info *fbi,
 			   int index, gimple stmt, tree ref)
 {
-  struct param_aa_status *paa;
+  param_aa_status *paa;
   bool modified = false;
   ao_ref refd;
 
@@ -1126,7 +1125,7 @@  parm_ref_data_preserved_p (struct func_body_info *fbi,
    CALL into which it is passed.  FBI describes the function body.  */
 
 static bool
-parm_ref_data_pass_through_p (struct func_body_info *fbi, int index,
+parm_ref_data_pass_through_p (func_body_info *fbi, int index,
 			      gimple call, tree parm)
 {
   bool modified = false;
@@ -1140,7 +1139,7 @@  parm_ref_data_pass_through_p (struct func_body_info *fbi, int index,
       || aa_overwalked (fbi))
     return false;
 
-  struct param_aa_status *paa = parm_bb_aa_status_for_bb (fbi, gimple_bb (call),
+  param_aa_status *paa = parm_bb_aa_status_for_bb (fbi, gimple_bb (call),
 							  index);
   if (paa->pt_modified)
     return false;
@@ -1165,7 +1164,7 @@  parm_ref_data_pass_through_p (struct func_body_info *fbi, int index,
    reference respectively.  */
 
 static bool
-ipa_load_from_parm_agg_1 (struct func_body_info *fbi,
+ipa_load_from_parm_agg_1 (func_body_info *fbi,
 			  vec<ipa_param_descriptor> descriptors,
 			  gimple stmt, tree op, int *index_p,
 			  HOST_WIDE_INT *offset_p, HOST_WIDE_INT *size_p,
@@ -1240,7 +1239,7 @@  ipa_load_from_parm_agg_1 (struct func_body_info *fbi,
    pointer, for users outside of this file.  */
 
 bool
-ipa_load_from_parm_agg (struct ipa_node_params *info, gimple stmt,
+ipa_load_from_parm_agg (ipa_node_params *info, gimple stmt,
 			tree op, int *index_p, HOST_WIDE_INT *offset_p,
 			bool *by_ref_p)
 {
@@ -1302,9 +1301,9 @@  ipa_load_from_parm_agg (struct ipa_node_params *info, gimple stmt,
    only needed for intraprocedural analysis.  */
 
 static void
-compute_complex_assign_jump_func (struct func_body_info *fbi,
-				  struct ipa_node_params *info,
-				  struct ipa_jump_func *jfunc,
+compute_complex_assign_jump_func (func_body_info *fbi,
+				  ipa_node_params *info,
+				  ipa_jump_func *jfunc,
 				  gimple call, gimple stmt, tree name,
 				  tree param_type)
 {
@@ -1458,9 +1457,9 @@  get_ancestor_addr_info (gimple assign, tree *obj_p, HOST_WIDE_INT *offset)
      return D.1879_6;  */
 
 static void
-compute_complex_ancestor_jump_func (struct func_body_info *fbi,
-				    struct ipa_node_params *info,
-				    struct ipa_jump_func *jfunc,
+compute_complex_ancestor_jump_func (func_body_info *fbi,
+				    ipa_node_params *info,
+				    ipa_jump_func *jfunc,
 				    gimple call, gimple phi, tree param_type)
 {
   HOST_WIDE_INT offset;
@@ -1531,7 +1530,7 @@  compute_complex_ancestor_jump_func (struct func_body_info *fbi,
    EXPECTED_TYPE represents a type the argument should be in  */
 
 static void
-compute_known_type_jump_func (tree op, struct ipa_jump_func *jfunc,
+compute_known_type_jump_func (tree op, ipa_jump_func *jfunc,
 			      gimple call, tree expected_type)
 {
   HOST_WIDE_INT offset, size, max_size;
@@ -1629,7 +1628,7 @@  struct ipa_known_agg_contents_list
   /* Known constant value or NULL if the contents is known to be unknown.  */
   tree constant;
   /* Pointer to the next structure in the list.  */
-  struct ipa_known_agg_contents_list *next;
+  ipa_known_agg_contents_list *next;
 };
 
 /* Find the proper place in linked list of ipa_known_agg_contents_list
@@ -1637,13 +1636,13 @@  struct ipa_known_agg_contents_list
    unless there is a partial overlap, in which case return NULL, or such
    element is already there, in which case set *ALREADY_THERE to true.  */
 
-static struct ipa_known_agg_contents_list **
-get_place_in_agg_contents_list (struct ipa_known_agg_contents_list **list,
+static ipa_known_agg_contents_list **
+get_place_in_agg_contents_list (ipa_known_agg_contents_list **list,
 				HOST_WIDE_INT lhs_offset,
 				HOST_WIDE_INT lhs_size,
 				bool *already_there)
 {
-  struct ipa_known_agg_contents_list **p = list;
+  ipa_known_agg_contents_list **p = list;
   while (*p && (*p)->offset < lhs_offset)
     {
       if ((*p)->offset + (*p)->size > lhs_offset)
@@ -1670,16 +1669,16 @@  get_place_in_agg_contents_list (struct ipa_known_agg_contents_list **list,
    is ARG_OFFSET and store it into JFUNC.  */
 
 static void
-build_agg_jump_func_from_list (struct ipa_known_agg_contents_list *list,
+build_agg_jump_func_from_list (ipa_known_agg_contents_list *list,
 			       int const_count, HOST_WIDE_INT arg_offset,
-			       struct ipa_jump_func *jfunc)
+			       ipa_jump_func *jfunc)
 {
   vec_alloc (jfunc->agg.items, const_count);
   while (list)
     {
       if (list->constant)
 	{
-	  struct ipa_agg_jf_item item;
+	  ipa_agg_jf_item item;
 	  item.offset = list->offset - arg_offset;
 	  gcc_assert ((item.offset % BITS_PER_UNIT) == 0);
 	  item.value = unshare_expr_without_location (list->constant);
@@ -1697,9 +1696,9 @@  build_agg_jump_func_from_list (struct ipa_known_agg_contents_list *list,
 
 static void
 determine_locally_known_aggregate_parts (gimple call, tree arg, tree arg_type,
-					 struct ipa_jump_func *jfunc)
+					 ipa_jump_func *jfunc)
 {
-  struct ipa_known_agg_contents_list *list = NULL;
+  ipa_known_agg_contents_list *list = NULL;
   int item_count = 0, const_count = 0;
   HOST_WIDE_INT arg_offset, arg_size;
   gimple_stmt_iterator gsi;
@@ -1774,7 +1773,7 @@  determine_locally_known_aggregate_parts (gimple call, tree arg, tree arg_type,
   gsi_prev (&gsi);
   for (; !gsi_end_p (gsi); gsi_prev (&gsi))
     {
-      struct ipa_known_agg_contents_list *n, **p;
+      ipa_known_agg_contents_list *n, **p;
       gimple stmt = gsi_stmt (gsi);
       HOST_WIDE_INT lhs_offset, lhs_size, lhs_max_size;
       tree lhs, rhs, lhs_base;
@@ -1821,7 +1820,7 @@  determine_locally_known_aggregate_parts (gimple call, tree arg, tree arg_type,
 	continue;
 
       rhs = get_ssa_def_if_simple_copy (rhs);
-      n = XALLOCA (struct ipa_known_agg_contents_list);
+      n = XALLOCA (ipa_known_agg_contents_list);
       n->size = lhs_size;
       n->offset = lhs_offset;
       if (is_gimple_ip_invariant (rhs))
@@ -1852,7 +1851,7 @@  determine_locally_known_aggregate_parts (gimple call, tree arg, tree arg_type,
 }
 
 static tree
-ipa_get_callee_param_type (struct cgraph_edge *e, int i)
+ipa_get_callee_param_type (cgraph_edge *e, int i)
 {
   int n;
   tree type = (e->callee
@@ -1887,11 +1886,11 @@  ipa_get_callee_param_type (struct cgraph_edge *e, int i)
    to this callsite.  */
 
 static void
-ipa_compute_jump_functions_for_edge (struct func_body_info *fbi,
-				     struct cgraph_edge *cs)
+ipa_compute_jump_functions_for_edge (func_body_info *fbi,
+				     cgraph_edge *cs)
 {
-  struct ipa_node_params *info = IPA_NODE_REF (cs->caller);
-  struct ipa_edge_args *args = IPA_EDGE_REF (cs);
+  ipa_node_params *info = IPA_NODE_REF (cs->caller);
+  ipa_edge_args *args = IPA_EDGE_REF (cs);
   gimple call = cs->call_stmt;
   int n, arg_num = gimple_call_num_args (call);
   bool useful_context = false;
@@ -1909,13 +1908,13 @@  ipa_compute_jump_functions_for_edge (struct func_body_info *fbi,
 
   for (n = 0; n < arg_num; n++)
     {
-      struct ipa_jump_func *jfunc = ipa_get_ith_jump_func (args, n);
+      ipa_jump_func *jfunc = ipa_get_ith_jump_func (args, n);
       tree arg = gimple_call_arg (call, n);
       tree param_type = ipa_get_callee_param_type (cs, n);
       if (flag_devirtualize && POINTER_TYPE_P (TREE_TYPE (arg)))
 	{
 	  tree instance;
-	  struct ipa_polymorphic_call_context context (cs->caller->decl,
+	  ipa_polymorphic_call_context context (cs->caller->decl,
 						       arg, cs->call_stmt,
 						       &instance);
 	  context.get_dynamic_type (instance, arg, NULL, cs->call_stmt);
@@ -2003,15 +2002,15 @@  ipa_compute_jump_functions_for_edge (struct func_body_info *fbi,
    from BB.  */
 
 static void
-ipa_compute_jump_functions_for_bb (struct func_body_info *fbi, basic_block bb)
+ipa_compute_jump_functions_for_bb (func_body_info *fbi, basic_block bb)
 {
-  struct ipa_bb_info *bi = ipa_get_bb_info (fbi, bb);
+  ipa_bb_info *bi = ipa_get_bb_info (fbi, bb);
   int i;
-  struct cgraph_edge *cs;
+  cgraph_edge *cs;
 
   FOR_EACH_VEC_ELT_REVERSE (bi->cg_edges, i, cs)
     {
-      struct cgraph_node *callee = cs->callee;
+      cgraph_node *callee = cs->callee;
 
       if (callee)
 	{
@@ -2093,10 +2092,10 @@  ipa_is_ssa_with_stmt_def (tree t)
    call to a parameter number PARAM_INDEX.  NODE is the caller.  Return the
    indirect call graph edge.  */
 
-static struct cgraph_edge *
-ipa_note_param_call (struct cgraph_node *node, int param_index, gimple stmt)
+static cgraph_edge *
+ipa_note_param_call (cgraph_node *node, int param_index, gimple stmt)
 {
-  struct cgraph_edge *cs;
+  cgraph_edge *cs;
 
   cs = node->get_edge (stmt);
   cs->indirect_info->param_index = param_index;
@@ -2165,10 +2164,10 @@  ipa_note_param_call (struct cgraph_node *node, int param_index, gimple stmt)
    passed by value or reference.  */
 
 static void
-ipa_analyze_indirect_call_uses (struct func_body_info *fbi, gimple call,
+ipa_analyze_indirect_call_uses (func_body_info *fbi, gimple call,
 				tree target)
 {
-  struct ipa_node_params *info = fbi->info;
+  ipa_node_params *info = fbi->info;
   HOST_WIDE_INT offset;
   bool by_ref;
 
@@ -2188,7 +2187,7 @@  ipa_analyze_indirect_call_uses (struct func_body_info *fbi, gimple call,
 				   gimple_assign_rhs1 (def), &index, &offset,
 				   NULL, &by_ref))
     {
-      struct cgraph_edge *cs = ipa_note_param_call (fbi->node, index, call);
+      cgraph_edge *cs = ipa_note_param_call (fbi->node, index, call);
       cs->indirect_info->offset = offset;
       cs->indirect_info->agg_contents = 1;
       cs->indirect_info->by_ref = by_ref;
@@ -2288,7 +2287,7 @@  ipa_analyze_indirect_call_uses (struct func_body_info *fbi, gimple call,
   if (index >= 0
       && parm_preserved_before_stmt_p (fbi, index, call, rec))
     {
-      struct cgraph_edge *cs = ipa_note_param_call (fbi->node, index, call);
+      cgraph_edge *cs = ipa_note_param_call (fbi->node, index, call);
       cs->indirect_info->offset = offset;
       cs->indirect_info->agg_contents = 1;
       cs->indirect_info->member_ptr = 1;
@@ -2303,7 +2302,7 @@  ipa_analyze_indirect_call_uses (struct func_body_info *fbi, gimple call,
    statement.  */
 
 static void
-ipa_analyze_virtual_call_uses (struct func_body_info *fbi,
+ipa_analyze_virtual_call_uses (func_body_info *fbi,
 			       gimple call, tree target)
 {
   tree obj = OBJ_TYPE_REF_OBJECT (target);
@@ -2316,10 +2315,10 @@  ipa_analyze_virtual_call_uses (struct func_body_info *fbi,
   if (TREE_CODE (obj) != SSA_NAME)
     return;
 
-  struct ipa_node_params *info = fbi->info;
+  ipa_node_params *info = fbi->info;
   if (SSA_NAME_IS_DEFAULT_DEF (obj))
     {
-      struct ipa_jump_func jfunc;
+      ipa_jump_func jfunc;
       if (TREE_CODE (SSA_NAME_VAR (obj)) != PARM_DECL)
 	return;
 
@@ -2332,7 +2331,7 @@  ipa_analyze_virtual_call_uses (struct func_body_info *fbi,
     }
   else
     {
-      struct ipa_jump_func jfunc;
+      ipa_jump_func jfunc;
       gimple stmt = SSA_NAME_DEF_STMT (obj);
       tree expr;
 
@@ -2347,8 +2346,8 @@  ipa_analyze_virtual_call_uses (struct func_body_info *fbi,
 	return;
     }
 
-  struct cgraph_edge *cs = ipa_note_param_call (fbi->node, index, call);
-  struct cgraph_indirect_call_info *ii = cs->indirect_info;
+  cgraph_edge *cs = ipa_note_param_call (fbi->node, index, call);
+  cgraph_indirect_call_info *ii = cs->indirect_info;
   ii->offset = anc_offset;
   ii->otr_token = tree_to_uhwi (OBJ_TYPE_REF_TOKEN (target));
   ii->otr_type = obj_type_ref_class (target);
@@ -2360,7 +2359,7 @@  ipa_analyze_virtual_call_uses (struct func_body_info *fbi,
    containing intermediate information about each formal parameter.  */
 
 static void
-ipa_analyze_call_uses (struct func_body_info *fbi, gimple call)
+ipa_analyze_call_uses (func_body_info *fbi, gimple call)
 {
   tree target = gimple_call_fn (call);
 
@@ -2369,7 +2368,7 @@  ipa_analyze_call_uses (struct func_body_info *fbi, gimple call)
           && !virtual_method_call_p (target)))
     return;
 
-  struct cgraph_edge *cs = fbi->node->get_edge (call);
+  cgraph_edge *cs = fbi->node->get_edge (call);
   /* If we previously turned the call into a direct call, there is
      no need to analyze.  */
   if (cs && !cs->indirect_unknown_callee)
@@ -2406,7 +2405,7 @@  ipa_analyze_call_uses (struct func_body_info *fbi, gimple call)
    formal parameters are called.  */
 
 static void
-ipa_analyze_stmt_uses (struct func_body_info *fbi, gimple stmt)
+ipa_analyze_stmt_uses (func_body_info *fbi, gimple stmt)
 {
   if (is_gimple_call (stmt))
     ipa_analyze_call_uses (fbi, stmt);
@@ -2419,7 +2418,7 @@  ipa_analyze_stmt_uses (struct func_body_info *fbi, gimple stmt)
 static bool
 visit_ref_for_mod_analysis (gimple, tree op, tree, void *data)
 {
-  struct ipa_node_params *info = (struct ipa_node_params *) data;
+  ipa_node_params *info = (ipa_node_params *) data;
 
   op = get_base_address (op);
   if (op
@@ -2439,7 +2438,7 @@  visit_ref_for_mod_analysis (gimple, tree op, tree, void *data)
    the function being analyzed.  */
 
 static void
-ipa_analyze_params_uses_in_bb (struct func_body_info *fbi, basic_block bb)
+ipa_analyze_params_uses_in_bb (func_body_info *fbi, basic_block bb)
 {
   gimple_stmt_iterator gsi;
   for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
@@ -2465,9 +2464,9 @@  ipa_analyze_params_uses_in_bb (struct func_body_info *fbi, basic_block bb)
 /* Calculate controlled uses of parameters of NODE.  */
 
 static void
-ipa_analyze_controlled_uses (struct cgraph_node *node)
+ipa_analyze_controlled_uses (cgraph_node *node)
 {
-  struct ipa_node_params *info = IPA_NODE_REF (node);
+  ipa_node_params *info = IPA_NODE_REF (node);
 
   for (int i = 0; i < ipa_get_param_count (info); i++)
     {
@@ -2510,7 +2509,7 @@  ipa_analyze_controlled_uses (struct cgraph_node *node)
 /* Free stuff in BI.  */
 
 static void
-free_ipa_bb_info (struct ipa_bb_info *bi)
+free_ipa_bb_info (ipa_bb_info *bi)
 {
   bi->cg_edges.release ();
   bi->param_aa_statuses.release ();
@@ -2521,13 +2520,13 @@  free_ipa_bb_info (struct ipa_bb_info *bi)
 class analysis_dom_walker : public dom_walker
 {
 public:
-  analysis_dom_walker (struct func_body_info *fbi)
+  analysis_dom_walker (func_body_info *fbi)
     : dom_walker (CDI_DOMINATORS), m_fbi (fbi) {}
 
   virtual void before_dom_children (basic_block);
 
 private:
-  struct func_body_info *m_fbi;
+  func_body_info *m_fbi;
 };
 
 void
@@ -2542,10 +2541,10 @@  analysis_dom_walker::before_dom_children (basic_block bb)
    with actual arguments of calls from within NODE.  */
 
 void
-ipa_analyze_node (struct cgraph_node *node)
+ipa_analyze_node (cgraph_node *node)
 {
-  struct func_body_info fbi;
-  struct ipa_node_params *info;
+  func_body_info fbi;
+  ipa_node_params *info;
 
   ipa_check_create_node_params ();
   ipa_check_create_edge_args ();
@@ -2565,7 +2564,7 @@  ipa_analyze_node (struct cgraph_node *node)
       return;
     }
 
-  struct function *func = DECL_STRUCT_FUNCTION (node->decl);
+  function *func = DECL_STRUCT_FUNCTION (node->decl);
   push_cfun (func);
   calculate_dominance_info (CDI_DOMINATORS);
   ipa_initialize_node_params (node);
@@ -2578,13 +2577,13 @@  ipa_analyze_node (struct cgraph_node *node)
   fbi.param_count = ipa_get_param_count (info);
   fbi.aa_walked = 0;
 
-  for (struct cgraph_edge *cs = node->callees; cs; cs = cs->next_callee)
+  for (cgraph_edge *cs = node->callees; cs; cs = cs->next_callee)
     {
       ipa_bb_info *bi = ipa_get_bb_info (&fbi, gimple_bb (cs->call_stmt));
       bi->cg_edges.safe_push (cs);
     }
 
-  for (struct cgraph_edge *cs = node->indirect_calls; cs; cs = cs->next_callee)
+  for (cgraph_edge *cs = node->indirect_calls; cs; cs = cs->next_callee)
     {
       ipa_bb_info *bi = ipa_get_bb_info (&fbi, gimple_bb (cs->call_stmt));
       bi->cg_edges.safe_push (cs);
@@ -2593,7 +2592,7 @@  ipa_analyze_node (struct cgraph_node *node)
   analysis_dom_walker (&fbi).walk (ENTRY_BLOCK_PTR_FOR_FN (cfun));
 
   int i;
-  struct ipa_bb_info *bi;
+  ipa_bb_info *bi;
   FOR_EACH_VEC_ELT (fbi.bb_infos, i, bi)
     free_ipa_bb_info (bi);
   fbi.bb_infos.release ();
@@ -2606,8 +2605,8 @@  ipa_analyze_node (struct cgraph_node *node)
    type.  */
 
 static void
-combine_known_type_and_ancestor_jfs (struct ipa_jump_func *src,
-				     struct ipa_jump_func *dst)
+combine_known_type_and_ancestor_jfs (ipa_jump_func *src,
+				     ipa_jump_func *dst)
 {
   HOST_WIDE_INT combined_offset;
   tree combined_type;
@@ -2632,25 +2631,25 @@  combine_known_type_and_ancestor_jfs (struct ipa_jump_func *src,
    indirectly) inlined into CS->callee and that E has not been inlined.  */
 
 static void
-update_jump_functions_after_inlining (struct cgraph_edge *cs,
-				      struct cgraph_edge *e)
+update_jump_functions_after_inlining (cgraph_edge *cs,
+				      cgraph_edge *e)
 {
-  struct ipa_edge_args *top = IPA_EDGE_REF (cs);
-  struct ipa_edge_args *args = IPA_EDGE_REF (e);
+  ipa_edge_args *top = IPA_EDGE_REF (cs);
+  ipa_edge_args *args = IPA_EDGE_REF (e);
   int count = ipa_get_cs_argument_count (args);
   int i;
 
   for (i = 0; i < count; i++)
     {
-      struct ipa_jump_func *dst = ipa_get_ith_jump_func (args, i);
-      struct ipa_polymorphic_call_context *dst_ctx
+      ipa_jump_func *dst = ipa_get_ith_jump_func (args, i);
+      ipa_polymorphic_call_context *dst_ctx
 	= ipa_get_ith_polymorhic_call_context (args, i);
 
       if (dst->type == IPA_JF_ANCESTOR)
 	{
-	  struct ipa_jump_func *src;
+	  ipa_jump_func *src;
 	  int dst_fid = dst->value.ancestor.formal_id;
-	  struct ipa_polymorphic_call_context *src_ctx
+	  ipa_polymorphic_call_context *src_ctx
 	    = ipa_get_ith_polymorhic_call_context (top, dst_fid);
 
 	  /* Variable number of arguments can cause havoc if we try to access
@@ -2666,7 +2665,7 @@  update_jump_functions_after_inlining (struct cgraph_edge *cs,
 
 	  if (src_ctx && !src_ctx->useless_p ())
 	    {
-	      struct ipa_polymorphic_call_context ctx = *src_ctx;
+	      ipa_polymorphic_call_context ctx = *src_ctx;
 
 	      /* TODO: Make type preserved safe WRT contexts.  */
 	      if (!dst->value.ancestor.agg_preserved)
@@ -2683,7 +2682,7 @@  update_jump_functions_after_inlining (struct cgraph_edge *cs,
 	  if (src->agg.items
 	      && (dst->value.ancestor.agg_preserved || !src->agg.by_ref))
 	    {
-	      struct ipa_agg_jf_item *item;
+	      ipa_agg_jf_item *item;
 	      int j;
 
 	      /* Currently we do not produce clobber aggregate jump functions,
@@ -2721,7 +2720,7 @@  update_jump_functions_after_inlining (struct cgraph_edge *cs,
 	}
       else if (dst->type == IPA_JF_PASS_THROUGH)
 	{
-	  struct ipa_jump_func *src;
+	  ipa_jump_func *src;
 	  /* We must check range due to calls with variable number of arguments
 	     and we cannot combine jump functions with operations.  */
 	  if (dst->value.pass_through.operation == NOP_EXPR
@@ -2731,12 +2730,12 @@  update_jump_functions_after_inlining (struct cgraph_edge *cs,
 	      int dst_fid = dst->value.pass_through.formal_id;
 	      src = ipa_get_ith_jump_func (top, dst_fid);
 	      bool dst_agg_p = ipa_get_jf_pass_through_agg_preserved (dst);
-	      struct ipa_polymorphic_call_context *src_ctx
+	      ipa_polymorphic_call_context *src_ctx
 		= ipa_get_ith_polymorhic_call_context (top, dst_fid);
 
 	      if (src_ctx && !src_ctx->useless_p ())
 		{
-		  struct ipa_polymorphic_call_context ctx = *src_ctx;
+		  ipa_polymorphic_call_context ctx = *src_ctx;
 
 		  /* TODO: Make type preserved safe WRT contexts.  */
 		  if (!dst->value.ancestor.agg_preserved)
@@ -2833,11 +2832,11 @@  update_jump_functions_after_inlining (struct cgraph_edge *cs,
    (SPECULATIVE)destination of an indirect edge IE and return the edge.
    Otherwise, return NULL.  */
 
-struct cgraph_edge *
-ipa_make_edge_direct_to_target (struct cgraph_edge *ie, tree target,
+cgraph_edge *
+ipa_make_edge_direct_to_target (cgraph_edge *ie, tree target,
 				bool speculative)
 {
-  struct cgraph_node *callee;
+  cgraph_node *callee;
   struct inline_edge_summary *es = inline_edge_summary (ie);
   bool unreachable = false;
 
@@ -2898,8 +2897,8 @@  ipa_make_edge_direct_to_target (struct cgraph_edge *ie, tree target,
   /* If the edge is already speculated.  */
   if (speculative && ie->speculative)
     {
-      struct cgraph_edge *e2;
-      struct ipa_ref *ref;
+      cgraph_edge *e2;
+      ipa_ref *ref;
       ie->speculative_call_info (e2, ie, ref);
       if (e2->callee->ultimate_alias_target ()
 	  != callee->ultimate_alias_target ())
@@ -2987,10 +2986,10 @@  ipa_make_edge_direct_to_target (struct cgraph_edge *ie, tree target,
    be passed by reference or by value.  */
 
 tree
-ipa_find_agg_cst_for_param (struct ipa_agg_jump_function *agg,
+ipa_find_agg_cst_for_param (ipa_agg_jump_function *agg,
 			    HOST_WIDE_INT offset, bool by_ref)
 {
-  struct ipa_agg_jf_item *item;
+  ipa_agg_jf_item *item;
   int i;
 
   if (by_ref != agg->by_ref)
@@ -3012,10 +3011,10 @@  ipa_find_agg_cst_for_param (struct ipa_agg_jump_function *agg,
    successfully found and removed.  */
 
 static bool
-remove_described_reference (symtab_node *symbol, struct ipa_cst_ref_desc *rdesc)
+remove_described_reference (symtab_node *symbol, ipa_cst_ref_desc *rdesc)
 {
-  struct ipa_ref *to_del;
-  struct cgraph_edge *origin;
+  ipa_ref *to_del;
+  cgraph_edge *origin;
 
   origin = rdesc->cs;
   if (!origin)
@@ -3037,10 +3036,10 @@  remove_described_reference (symtab_node *symbol, struct ipa_cst_ref_desc *rdesc)
    IPA_UNDESCRIBED_USE, return the reference description, otherwise return
    NULL.  JFUNC must be a constant jump function.  */
 
-static struct ipa_cst_ref_desc *
-jfunc_rdesc_usable (struct ipa_jump_func *jfunc)
+static ipa_cst_ref_desc *
+jfunc_rdesc_usable (ipa_jump_func *jfunc)
 {
-  struct ipa_cst_ref_desc *rdesc = ipa_get_jf_constant_rdesc (jfunc);
+  ipa_cst_ref_desc *rdesc = ipa_get_jf_constant_rdesc (jfunc);
   if (rdesc && rdesc->refcount != IPA_UNDESCRIBED_USE)
     return rdesc;
   else
@@ -3052,7 +3051,7 @@  jfunc_rdesc_usable (struct ipa_jump_func *jfunc)
    NULL.  */
 
 static cgraph_node *
-cgraph_node_for_jfunc (struct ipa_jump_func *jfunc)
+cgraph_node_for_jfunc (ipa_jump_func *jfunc)
 {
   gcc_checking_assert (jfunc->type == IPA_JF_CONST);
   tree cst = ipa_get_jf_constant (jfunc);
@@ -3070,9 +3069,9 @@  cgraph_node_for_jfunc (struct ipa_jump_func *jfunc)
    reference could not be found, otherwise return true.  */
 
 static bool
-try_decrement_rdesc_refcount (struct ipa_jump_func *jfunc)
+try_decrement_rdesc_refcount (ipa_jump_func *jfunc)
 {
-  struct ipa_cst_ref_desc *rdesc;
+  ipa_cst_ref_desc *rdesc;
   if (jfunc->type == IPA_JF_CONST
       && (rdesc = jfunc_rdesc_usable (jfunc))
       && --rdesc->refcount == 0)
@@ -3092,12 +3091,12 @@  try_decrement_rdesc_refcount (struct ipa_jump_func *jfunc)
    determined, return the newly direct edge, otherwise return NULL.
    NEW_ROOT_INFO is the node info that JFUNC lattices are relative to.  */
 
-static struct cgraph_edge *
-try_make_edge_direct_simple_call (struct cgraph_edge *ie,
-				  struct ipa_jump_func *jfunc,
-				  struct ipa_node_params *new_root_info)
+static cgraph_edge *
+try_make_edge_direct_simple_call (cgraph_edge *ie,
+				  ipa_jump_func *jfunc,
+				  ipa_node_params *new_root_info)
 {
-  struct cgraph_edge *cs;
+  cgraph_edge *cs;
   tree target;
   bool agg_contents = ie->indirect_info->agg_contents;
 
@@ -3130,7 +3129,7 @@  try_make_edge_direct_simple_call (struct cgraph_edge *ie,
    and target (the latter can be NULL) are dumped when dumping is enabled.  */
 
 tree
-ipa_impossible_devirt_target (struct cgraph_edge *ie, tree target)
+ipa_impossible_devirt_target (cgraph_edge *ie, tree target)
 {
   if (dump_file)
     {
@@ -3155,11 +3154,11 @@  ipa_impossible_devirt_target (struct cgraph_edge *ie, tree target)
    Otherwise, return NULL.  NEW_ROOT_INFO is the node info that JFUNC lattices
    are relative to.  */
 
-static struct cgraph_edge *
-try_make_edge_direct_virtual_call (struct cgraph_edge *ie,
-				   struct ipa_jump_func *jfunc,
-				   struct ipa_node_params *new_root_info,
-				   struct ipa_polymorphic_call_context *ctx_ptr)
+static cgraph_edge *
+try_make_edge_direct_virtual_call (cgraph_edge *ie,
+				   ipa_jump_func *jfunc,
+				   ipa_node_params *new_root_info,
+				   ipa_polymorphic_call_context *ctx_ptr)
 {
   tree binfo, target = NULL;
   bool speculative = false;
@@ -3172,7 +3171,7 @@  try_make_edge_direct_virtual_call (struct cgraph_edge *ie,
      based on knowlede of the context.  */
   if (ctx_ptr && !ie->indirect_info->by_ref)
     {
-      struct ipa_polymorphic_call_context ctx = *ctx_ptr;
+      ipa_polymorphic_call_context ctx = *ctx_ptr;
 
       ctx.offset_by (ie->indirect_info->offset);
 
@@ -3221,7 +3220,7 @@  try_make_edge_direct_virtual_call (struct cgraph_edge *ie,
 
   if (binfo && TREE_CODE (binfo) != TREE_BINFO)
     {
-      struct ipa_polymorphic_call_context ctx (binfo,
+      ipa_polymorphic_call_context ctx (binfo,
 					       ie->indirect_info->otr_type,
 					       ie->indirect_info->offset);
       updated |= ie->indirect_info->context.combine_with
@@ -3296,13 +3295,13 @@  try_make_edge_direct_virtual_call (struct cgraph_edge *ie,
    unless NEW_EDGES is NULL.  Return true iff a new edge(s) were created.  */
 
 static bool
-update_indirect_edges_after_inlining (struct cgraph_edge *cs,
-				      struct cgraph_node *node,
+update_indirect_edges_after_inlining (cgraph_edge *cs,
+				      cgraph_node *node,
 				      vec<cgraph_edge *> *new_edges)
 {
-  struct ipa_edge_args *top;
-  struct cgraph_edge *ie, *next_ie, *new_direct_edge;
-  struct ipa_node_params *new_root_info;
+  ipa_edge_args *top;
+  cgraph_edge *ie, *next_ie, *new_direct_edge;
+  ipa_node_params *new_root_info;
   bool res = false;
 
   ipa_check_create_edge_args ();
@@ -3313,8 +3312,8 @@  update_indirect_edges_after_inlining (struct cgraph_edge *cs,
 
   for (ie = node->indirect_calls; ie; ie = next_ie)
     {
-      struct cgraph_indirect_call_info *ici = ie->indirect_info;
-      struct ipa_jump_func *jfunc;
+      cgraph_indirect_call_info *ici = ie->indirect_info;
+      ipa_jump_func *jfunc;
       int param_index;
 
       next_ie = ie->next_callee;
@@ -3408,11 +3407,11 @@  update_indirect_edges_after_inlining (struct cgraph_edge *cs,
    created.  */
 
 static bool
-propagate_info_to_inlined_callees (struct cgraph_edge *cs,
-				   struct cgraph_node *node,
+propagate_info_to_inlined_callees (cgraph_edge *cs,
+				   cgraph_node *node,
 				   vec<cgraph_edge *> *new_edges)
 {
-  struct cgraph_edge *e;
+  cgraph_edge *e;
   bool res;
 
   res = update_indirect_edges_after_inlining (cs, node, new_edges);
@@ -3443,21 +3442,21 @@  combine_controlled_uses_counters (int c, int d)
    tree of inlined nodes.  */
 
 static void
-propagate_controlled_uses (struct cgraph_edge *cs)
+propagate_controlled_uses (cgraph_edge *cs)
 {
-  struct ipa_edge_args *args = IPA_EDGE_REF (cs);
-  struct cgraph_node *new_root = cs->caller->global.inlined_to
+  ipa_edge_args *args = IPA_EDGE_REF (cs);
+  cgraph_node *new_root = cs->caller->global.inlined_to
     ? cs->caller->global.inlined_to : cs->caller;
-  struct ipa_node_params *new_root_info = IPA_NODE_REF (new_root);
-  struct ipa_node_params *old_root_info = IPA_NODE_REF (cs->callee);
+  ipa_node_params *new_root_info = IPA_NODE_REF (new_root);
+  ipa_node_params *old_root_info = IPA_NODE_REF (cs->callee);
   int count, i;
 
   count = MIN (ipa_get_cs_argument_count (args),
 	       ipa_get_param_count (old_root_info));
   for (i = 0; i < count; i++)
     {
-      struct ipa_jump_func *jf = ipa_get_ith_jump_func (args, i);
-      struct ipa_cst_ref_desc *rdesc;
+      ipa_jump_func *jf = ipa_get_ith_jump_func (args, i);
+      ipa_cst_ref_desc *rdesc;
 
       if (jf->type == IPA_JF_PASS_THROUGH)
 	{
@@ -3472,8 +3471,8 @@  propagate_controlled_uses (struct cgraph_edge *cs)
 	  ipa_set_controlled_uses (new_root_info, src_idx, c);
 	  if (c == 0 && new_root_info->ipcp_orig_node)
 	    {
-	      struct cgraph_node *n;
-	      struct ipa_ref *ref;
+	      cgraph_node *n;
+	      ipa_ref *ref;
 	      tree t = new_root_info->known_vals[src_idx];
 
 	      if (t && TREE_CODE (t) == ADDR_EXPR
@@ -3500,14 +3499,14 @@  propagate_controlled_uses (struct cgraph_edge *cs)
 	  if (rdesc->refcount == 0)
 	    {
 	      tree cst = ipa_get_jf_constant (jf);
-	      struct cgraph_node *n;
+	      cgraph_node *n;
 	      gcc_checking_assert (TREE_CODE (cst) == ADDR_EXPR
 				   && TREE_CODE (TREE_OPERAND (cst, 0))
 				   == FUNCTION_DECL);
 	      n = cgraph_node::get (TREE_OPERAND (cst, 0));
 	      if (n)
 		{
-		  struct cgraph_node *clone;
+		  cgraph_node *clone;
 		  bool ok;
 		  ok = remove_described_reference (n, rdesc);
 		  gcc_checking_assert (ok);
@@ -3517,7 +3516,7 @@  propagate_controlled_uses (struct cgraph_edge *cs)
 			 && clone != rdesc->cs->caller
 			 && IPA_NODE_REF (clone)->ipcp_orig_node)
 		    {
-		      struct ipa_ref *ref;
+		      ipa_ref *ref;
 		      ref = clone->find_reference (n, NULL, 0);
 		      if (ref)
 			{
@@ -3542,11 +3541,11 @@  propagate_controlled_uses (struct cgraph_edge *cs)
        i < ipa_get_cs_argument_count (args);
        i++)
     {
-      struct ipa_jump_func *jf = ipa_get_ith_jump_func (args, i);
+      ipa_jump_func *jf = ipa_get_ith_jump_func (args, i);
 
       if (jf->type == IPA_JF_CONST)
 	{
-	  struct ipa_cst_ref_desc *rdesc = jfunc_rdesc_usable (jf);
+	  ipa_cst_ref_desc *rdesc = jfunc_rdesc_usable (jf);
 	  if (rdesc)
 	    rdesc->refcount = IPA_UNDESCRIBED_USE;
 	}
@@ -3564,13 +3563,13 @@  propagate_controlled_uses (struct cgraph_edge *cs)
    created.  */
 
 bool
-ipa_propagate_indirect_call_infos (struct cgraph_edge *cs,
+ipa_propagate_indirect_call_infos (cgraph_edge *cs,
 				   vec<cgraph_edge *> *new_edges)
 {
   bool changed;
   /* Do nothing if the preparation phase has not been carried out yet
      (i.e. during early inlining).  */
-  if (!ipa_node_params_vector.exists ())
+  if (!ipa_node_params_d)
     return false;
   gcc_assert (ipa_edge_args_vector);
 
@@ -3584,7 +3583,7 @@  ipa_propagate_indirect_call_infos (struct cgraph_edge *cs,
    to.  */
 
 void
-ipa_free_edge_args_substructures (struct ipa_edge_args *args)
+ipa_free_edge_args_substructures (ipa_edge_args *args)
 {
   vec_free (args->jump_functions);
   memset (args, 0, sizeof (*args));
@@ -3596,7 +3595,7 @@  void
 ipa_free_all_edge_args (void)
 {
   int i;
-  struct ipa_edge_args *args;
+  ipa_edge_args *args;
 
   if (!ipa_edge_args_vector)
     return;
@@ -3610,15 +3609,21 @@  ipa_free_all_edge_args (void)
 /* Frees all dynamically allocated structures that the param info points
    to.  */
 
-void
-ipa_free_node_params_substructures (struct ipa_node_params *info)
+ipa_node_params::~ipa_node_params ()
 {
-  info->descriptors.release ();
-  free (info->lattices);
+  descriptors.release ();
+  free (lattices);
   /* Lattice values and their sources are deallocated with their alocation
      pool.  */
-  info->known_vals.release ();
-  memset (info, 0, sizeof (*info));
+  known_vals.release ();
+
+  lattices = NULL;
+  ipcp_orig_node = NULL;
+  analysis_done = 0;
+  node_enqueued = 0;
+  do_clone_for_all_contexts = 0;
+  is_all_contexts_clone = 0;
+  node_dead = 0;
 }
 
 /* Free all ipa_node_params structures.  */
@@ -3626,20 +3631,15 @@  ipa_free_node_params_substructures (struct ipa_node_params *info)
 void
 ipa_free_all_node_params (void)
 {
-  int i;
-  struct ipa_node_params *info;
-
-  FOR_EACH_VEC_ELT (ipa_node_params_vector, i, info)
-    ipa_free_node_params_substructures (info);
-
-  ipa_node_params_vector.release ();
+  delete ipa_node_params_d;
+  ipa_node_params_d = NULL;
 }
 
 /* Set the aggregate replacements of NODE to be AGGVALS.  */
 
 void
-ipa_set_node_agg_value_chain (struct cgraph_node *node,
-			      struct ipa_agg_replacement_value *aggvals)
+ipa_set_node_agg_value_chain (const cgraph_node *node,
+			      ipa_agg_replacement_value *aggvals)
 {
   if (vec_safe_length (ipa_node_agg_replacements)
       <= (unsigned) symtab->cgraph_max_uid)
@@ -3652,9 +3652,9 @@  ipa_set_node_agg_value_chain (struct cgraph_node *node,
 /* Hook that is called by cgraph.c when an edge is removed.  */
 
 static void
-ipa_edge_removal_hook (struct cgraph_edge *cs, void *data ATTRIBUTE_UNUSED)
+ipa_edge_removal_hook (cgraph_edge *cs, void *data ATTRIBUTE_UNUSED)
 {
-  struct ipa_edge_args *args;
+  ipa_edge_args *args;
 
   /* During IPA-CP updating we can be called on not-yet analyzed clones.  */
   if (vec_safe_length (ipa_edge_args_vector) <= (unsigned)cs->uid)
@@ -3663,11 +3663,11 @@  ipa_edge_removal_hook (struct cgraph_edge *cs, void *data ATTRIBUTE_UNUSED)
   args = IPA_EDGE_REF (cs);
   if (args->jump_functions)
     {
-      struct ipa_jump_func *jf;
+      ipa_jump_func *jf;
       int i;
       FOR_EACH_VEC_ELT (*args->jump_functions, i, jf)
 	{
-	  struct ipa_cst_ref_desc *rdesc;
+	  ipa_cst_ref_desc *rdesc;
 	  try_decrement_rdesc_refcount (jf);
 	  if (jf->type == IPA_JF_CONST
 	      && (rdesc = ipa_get_jf_constant_rdesc (jf))
@@ -3679,25 +3679,13 @@  ipa_edge_removal_hook (struct cgraph_edge *cs, void *data ATTRIBUTE_UNUSED)
   ipa_free_edge_args_substructures (IPA_EDGE_REF (cs));
 }
 
-/* Hook that is called by cgraph.c when a node is removed.  */
-
-static void
-ipa_node_removal_hook (struct cgraph_node *node, void *data ATTRIBUTE_UNUSED)
-{
-  /* During IPA-CP updating we can be called on not-yet analyze clones.  */
-  if (ipa_node_params_vector.length () > (unsigned)node->uid)
-    ipa_free_node_params_substructures (IPA_NODE_REF (node));
-  if (vec_safe_length (ipa_node_agg_replacements) > (unsigned)node->uid)
-    (*ipa_node_agg_replacements)[(unsigned)node->uid] = NULL;
-}
-
 /* Hook that is called by cgraph.c when an edge is duplicated.  */
 
 static void
-ipa_edge_duplication_hook (struct cgraph_edge *src, struct cgraph_edge *dst,
+ipa_edge_duplication_hook (cgraph_edge *src, cgraph_edge *dst,
 			   __attribute__((unused)) void *data)
 {
-  struct ipa_edge_args *old_args, *new_args;
+  ipa_edge_args *old_args, *new_args;
   unsigned int i;
 
   ipa_check_create_edge_args ();
@@ -3712,20 +3700,20 @@  ipa_edge_duplication_hook (struct cgraph_edge *src, struct cgraph_edge *dst,
 
   for (i = 0; i < vec_safe_length (old_args->jump_functions); i++)
     {
-      struct ipa_jump_func *src_jf = ipa_get_ith_jump_func (old_args, i);
-      struct ipa_jump_func *dst_jf = ipa_get_ith_jump_func (new_args, i);
+      ipa_jump_func *src_jf = ipa_get_ith_jump_func (old_args, i);
+      ipa_jump_func *dst_jf = ipa_get_ith_jump_func (new_args, i);
 
       dst_jf->agg.items = vec_safe_copy (dst_jf->agg.items);
 
       if (src_jf->type == IPA_JF_CONST)
 	{
-	  struct ipa_cst_ref_desc *src_rdesc = jfunc_rdesc_usable (src_jf);
+	  ipa_cst_ref_desc *src_rdesc = jfunc_rdesc_usable (src_jf);
 
 	  if (!src_rdesc)
 	    dst_jf->value.constant.rdesc = NULL;
 	  else if (src->caller == dst->caller)
 	    {
-	      struct ipa_ref *ref;
+	      ipa_ref *ref;
 	      symtab_node *n = cgraph_node_for_jfunc (src_jf);
 	      gcc_checking_assert (n);
 	      ref = src->caller->find_reference (n, src->call_stmt,
@@ -3734,8 +3722,8 @@  ipa_edge_duplication_hook (struct cgraph_edge *src, struct cgraph_edge *dst,
 	      dst->caller->clone_reference (ref, ref->stmt);
 
 	      gcc_checking_assert (ipa_refdesc_pool);
-	      struct ipa_cst_ref_desc *dst_rdesc
-		= (struct ipa_cst_ref_desc *) pool_alloc (ipa_refdesc_pool);
+	      ipa_cst_ref_desc *dst_rdesc
+		= (ipa_cst_ref_desc *) pool_alloc (ipa_refdesc_pool);
 	      dst_rdesc->cs = dst;
 	      dst_rdesc->refcount = src_rdesc->refcount;
 	      dst_rdesc->next_duplicate = NULL;
@@ -3743,10 +3731,10 @@  ipa_edge_duplication_hook (struct cgraph_edge *src, struct cgraph_edge *dst,
 	    }
 	  else if (src_rdesc->cs == src)
 	    {
-	      struct ipa_cst_ref_desc *dst_rdesc;
+	      ipa_cst_ref_desc *dst_rdesc;
 	      gcc_checking_assert (ipa_refdesc_pool);
 	      dst_rdesc
-		= (struct ipa_cst_ref_desc *) pool_alloc (ipa_refdesc_pool);
+		= (ipa_cst_ref_desc *) pool_alloc (ipa_refdesc_pool);
 	      dst_rdesc->cs = dst;
 	      dst_rdesc->refcount = src_rdesc->refcount;
 	      dst_rdesc->next_duplicate = src_rdesc->next_duplicate;
@@ -3755,7 +3743,7 @@  ipa_edge_duplication_hook (struct cgraph_edge *src, struct cgraph_edge *dst,
 	    }
 	  else
 	    {
-	      struct ipa_cst_ref_desc *dst_rdesc;
+	      ipa_cst_ref_desc *dst_rdesc;
 	      /* This can happen during inlining, when a JFUNC can refer to a
 		 reference taken in a function up in the tree of inline clones.
 		 We need to find the duplicate that refers to our tree of
@@ -3766,7 +3754,7 @@  ipa_edge_duplication_hook (struct cgraph_edge *src, struct cgraph_edge *dst,
 		   dst_rdesc;
 		   dst_rdesc = dst_rdesc->next_duplicate)
 		{
-		  struct cgraph_node *top;
+		  cgraph_node *top;
 		  top = dst_rdesc->cs->caller->global.inlined_to
 		    ? dst_rdesc->cs->caller->global.inlined_to
 		    : dst_rdesc->cs->caller;
@@ -3780,9 +3768,9 @@  ipa_edge_duplication_hook (struct cgraph_edge *src, struct cgraph_edge *dst,
       else if (dst_jf->type == IPA_JF_PASS_THROUGH
 	       && src->caller == dst->caller)
 	{
-	  struct cgraph_node *inline_root = dst->caller->global.inlined_to
+	  cgraph_node *inline_root = dst->caller->global.inlined_to
 	    ? dst->caller->global.inlined_to : dst->caller;
-	  struct ipa_node_params *root_info = IPA_NODE_REF (inline_root);
+	  ipa_node_params *root_info = IPA_NODE_REF (inline_root);
 	  int idx = ipa_get_jf_pass_through_formal_id (dst_jf);
 
 	  int c = ipa_get_controlled_uses (root_info, idx);
@@ -3795,18 +3783,23 @@  ipa_edge_duplication_hook (struct cgraph_edge *src, struct cgraph_edge *dst,
     }
 }
 
-/* Hook that is called by cgraph.c when a node is duplicated.  */
+/* Analyze newly added function into callgraph.  */
 
 static void
-ipa_node_duplication_hook (struct cgraph_node *src, struct cgraph_node *dst,
-			   ATTRIBUTE_UNUSED void *data)
+ipa_add_new_function (cgraph_node *node, void *data ATTRIBUTE_UNUSED)
 {
-  struct ipa_node_params *old_info, *new_info;
-  struct ipa_agg_replacement_value *old_av, *new_av;
+  if (node->has_gimple_body_p ())
+    ipa_analyze_node (node);
+}
 
-  ipa_check_create_node_params ();
-  old_info = IPA_NODE_REF (src);
-  new_info = IPA_NODE_REF (dst);
+/* Hook that is called by summary when a node is duplicated.  */
+
+void
+ipa_node_params_t::duplication_hook(cgraph_node *src, cgraph_node *dst,
+				    ipa_node_params *old_info,
+				    ipa_node_params *new_info)
+{
+  ipa_agg_replacement_value *old_av, *new_av;
 
   new_info->descriptors = old_info->descriptors.copy ();
   new_info->lattices = NULL;
@@ -3822,7 +3815,7 @@  ipa_node_duplication_hook (struct cgraph_node *src, struct cgraph_node *dst,
   new_av = NULL;
   while (old_av)
     {
-      struct ipa_agg_replacement_value *v;
+      ipa_agg_replacement_value *v;
 
       v = ggc_alloc<ipa_agg_replacement_value> ();
       memcpy (v, old_av, sizeof (*v));
@@ -3833,33 +3826,19 @@  ipa_node_duplication_hook (struct cgraph_node *src, struct cgraph_node *dst,
   ipa_set_node_agg_value_chain (dst, new_av);
 }
 
-
-/* Analyze newly added function into callgraph.  */
-
-static void
-ipa_add_new_function (struct cgraph_node *node, void *data ATTRIBUTE_UNUSED)
-{
-  if (node->has_gimple_body_p ())
-    ipa_analyze_node (node);
-}
-
 /* Register our cgraph hooks if they are not already there.  */
 
 void
 ipa_register_cgraph_hooks (void)
 {
+  ipa_check_create_node_params ();
+
   if (!edge_removal_hook_holder)
     edge_removal_hook_holder =
       symtab->add_edge_removal_hook (&ipa_edge_removal_hook, NULL);
-  if (!node_removal_hook_holder)
-    node_removal_hook_holder =
-      symtab->add_cgraph_removal_hook (&ipa_node_removal_hook, NULL);
   if (!edge_duplication_hook_holder)
     edge_duplication_hook_holder =
       symtab->add_edge_duplication_hook (&ipa_edge_duplication_hook, NULL);
-  if (!node_duplication_hook_holder)
-    node_duplication_hook_holder =
-      symtab->add_cgraph_duplication_hook (&ipa_node_duplication_hook, NULL);
   function_insertion_hook_holder =
       symtab->add_cgraph_insertion_hook (&ipa_add_new_function, NULL);
 }
@@ -3871,12 +3850,8 @@  ipa_unregister_cgraph_hooks (void)
 {
   symtab->remove_edge_removal_hook (edge_removal_hook_holder);
   edge_removal_hook_holder = NULL;
-  symtab->remove_cgraph_removal_hook (node_removal_hook_holder);
-  node_removal_hook_holder = NULL;
   symtab->remove_edge_duplication_hook (edge_duplication_hook_holder);
   edge_duplication_hook_holder = NULL;
-  symtab->remove_cgraph_duplication_hook (node_duplication_hook_holder);
-  node_duplication_hook_holder = NULL;
   symtab->remove_cgraph_insertion_hook (function_insertion_hook_holder);
   function_insertion_hook_holder = NULL;
 }
@@ -3923,10 +3898,10 @@  ipa_free_all_structures_after_iinln (void)
    callgraph to F.  */
 
 void
-ipa_print_node_params (FILE *f, struct cgraph_node *node)
+ipa_print_node_params (FILE *f, cgraph_node *node)
 {
   int i, count;
-  struct ipa_node_params *info;
+  ipa_node_params *info;
 
   if (!node->definition)
     return;
@@ -3957,7 +3932,7 @@  ipa_print_node_params (FILE *f, struct cgraph_node *node)
 void
 ipa_print_all_params (FILE * f)
 {
-  struct cgraph_node *node;
+  cgraph_node *node;
 
   fprintf (f, "\nFunction parameters:\n");
   FOR_EACH_FUNCTION (node)
@@ -4040,7 +4015,7 @@  ipa_modify_formal_parameters (tree fndecl, ipa_parm_adjustment_vec adjustments)
   tree new_arg_types = NULL;
   for (int i = 0; i < len; i++)
     {
-      struct ipa_parm_adjustment *adj;
+      ipa_parm_adjustment *adj;
       gcc_assert (link);
 
       adj = &adjustments[i];
@@ -4158,10 +4133,10 @@  ipa_modify_formal_parameters (tree fndecl, ipa_parm_adjustment_vec adjustments)
    contain the corresponding call graph edge.  */
 
 void
-ipa_modify_call_arguments (struct cgraph_edge *cs, gimple stmt,
+ipa_modify_call_arguments (cgraph_edge *cs, gimple stmt,
 			   ipa_parm_adjustment_vec adjustments)
 {
-  struct cgraph_node *current_node = cgraph_node::get (current_function_decl);
+  cgraph_node *current_node = cgraph_node::get (current_function_decl);
   vec<tree> vargs;
   vec<tree, va_gc> **debug_args = NULL;
   gimple new_stmt;
@@ -4179,7 +4154,7 @@  ipa_modify_call_arguments (struct cgraph_edge *cs, gimple stmt,
   gsi_prev (&prev_gsi);
   for (i = 0; i < len; i++)
     {
-      struct ipa_parm_adjustment *adj;
+      ipa_parm_adjustment *adj;
 
       adj = &adjustments[i];
 
@@ -4412,7 +4387,7 @@  bool
 ipa_modify_expr (tree *expr, bool convert,
 		 ipa_parm_adjustment_vec adjustments)
 {
-  struct ipa_parm_adjustment *cand
+  ipa_parm_adjustment *cand
     = ipa_get_adjustment_candidate (&expr, &convert, adjustments, false);
   if (!cand)
     return false;
@@ -4500,11 +4475,11 @@  ipa_get_adjustment_candidate (tree **expr, bool *convert,
   if (!base || TREE_CODE (base) != PARM_DECL)
     return NULL;
 
-  struct ipa_parm_adjustment *cand = NULL;
+  ipa_parm_adjustment *cand = NULL;
   unsigned int len = adjustments.length ();
   for (unsigned i = 0; i < len; i++)
     {
-      struct ipa_parm_adjustment *adj = &adjustments[i];
+      ipa_parm_adjustment *adj = &adjustments[i];
 
       if (adj->base == base
 	  && (adj->offset == offset || adj->op == IPA_PARM_OP_REMOVE))
@@ -4530,7 +4505,7 @@  index_in_adjustments_multiple_times_p (int base_index,
 
   for (i = 0; i < len; i++)
     {
-      struct ipa_parm_adjustment *adj;
+      ipa_parm_adjustment *adj;
       adj = &adjustments[i];
 
       if (adj->base_index == base_index)
@@ -4561,7 +4536,7 @@  ipa_combine_adjustments (ipa_parm_adjustment_vec inner,
   tmp.create (inlen);
   for (i = 0; i < inlen; i++)
     {
-      struct ipa_parm_adjustment *n;
+      ipa_parm_adjustment *n;
       n = &inner[i];
 
       if (n->op == IPA_PARM_OP_REMOVE)
@@ -4577,9 +4552,9 @@  ipa_combine_adjustments (ipa_parm_adjustment_vec inner,
   adjustments.create (outlen + removals);
   for (i = 0; i < outlen; i++)
     {
-      struct ipa_parm_adjustment r;
-      struct ipa_parm_adjustment *out = &outer[i];
-      struct ipa_parm_adjustment *in = &tmp[out->base_index];
+      ipa_parm_adjustment r;
+      ipa_parm_adjustment *out = &outer[i];
+      ipa_parm_adjustment *in = &tmp[out->base_index];
 
       memset (&r, 0, sizeof (r));
       gcc_assert (in->op != IPA_PARM_OP_REMOVE);
@@ -4616,7 +4591,7 @@  ipa_combine_adjustments (ipa_parm_adjustment_vec inner,
 
   for (i = 0; i < inlen; i++)
     {
-      struct ipa_parm_adjustment *n = &inner[i];
+      ipa_parm_adjustment *n = &inner[i];
 
       if (n->op == IPA_PARM_OP_REMOVE)
 	adjustments.quick_push (*n);
@@ -4640,7 +4615,7 @@  ipa_dump_param_adjustments (FILE *file, ipa_parm_adjustment_vec adjustments,
   fprintf (file, "IPA param adjustments: ");
   for (i = 0; i < len; i++)
     {
-      struct ipa_parm_adjustment *adj;
+      ipa_parm_adjustment *adj;
       adj = &adjustments[i];
 
       if (!first)
@@ -4683,7 +4658,7 @@  ipa_dump_param_adjustments (FILE *file, ipa_parm_adjustment_vec adjustments,
 /* Dump the AV linked list.  */
 
 void
-ipa_dump_agg_replacement_values (FILE *f, struct ipa_agg_replacement_value *av)
+ipa_dump_agg_replacement_values (FILE *f, ipa_agg_replacement_value *av)
 {
   bool comma = false;
   fprintf (f, "     Aggregate replacements:");
@@ -4700,11 +4675,11 @@  ipa_dump_agg_replacement_values (FILE *f, struct ipa_agg_replacement_value *av)
 /* Stream out jump function JUMP_FUNC to OB.  */
 
 static void
-ipa_write_jump_function (struct output_block *ob,
-			 struct ipa_jump_func *jump_func)
+ipa_write_jump_function (output_block *ob,
+			 ipa_jump_func *jump_func)
 {
-  struct ipa_agg_jf_item *item;
-  struct bitpack_d bp;
+  ipa_agg_jf_item *item;
+  bitpack_d bp;
   int i, count;
 
   streamer_write_uhwi (ob, jump_func->type);
@@ -4768,10 +4743,10 @@  ipa_write_jump_function (struct output_block *ob,
 /* Read in jump function JUMP_FUNC from IB.  */
 
 static void
-ipa_read_jump_function (struct lto_input_block *ib,
-			struct ipa_jump_func *jump_func,
-			struct cgraph_edge *cs,
-			struct data_in *data_in)
+ipa_read_jump_function (lto_input_block *ib,
+			ipa_jump_func *jump_func,
+			cgraph_edge *cs,
+			data_in *data_in)
 {
   enum jump_func_type jftype;
   enum tree_code operation;
@@ -4800,7 +4775,7 @@  ipa_read_jump_function (struct lto_input_block *ib,
       if (operation == NOP_EXPR)
 	{
 	  int formal_id =  streamer_read_uhwi (ib);
-	  struct bitpack_d bp = streamer_read_bitpack (ib);
+	  bitpack_d bp = streamer_read_bitpack (ib);
 	  bool agg_preserved = bp_unpack_value (&bp, 1);
 	  bool type_preserved = bp_unpack_value (&bp, 1);
 	  ipa_set_jf_simple_pass_through (jump_func, formal_id, agg_preserved,
@@ -4819,7 +4794,7 @@  ipa_read_jump_function (struct lto_input_block *ib,
 	HOST_WIDE_INT offset = streamer_read_uhwi (ib);
 	tree type = stream_read_tree (ib, data_in);
 	int formal_id = streamer_read_uhwi (ib);
-	struct bitpack_d bp = streamer_read_bitpack (ib);
+	bitpack_d bp = streamer_read_bitpack (ib);
 	bool agg_preserved = bp_unpack_value (&bp, 1);
 	bool type_preserved = bp_unpack_value (&bp, 1);
 
@@ -4833,12 +4808,12 @@  ipa_read_jump_function (struct lto_input_block *ib,
   vec_alloc (jump_func->agg.items, count);
   if (count)
     {
-      struct bitpack_d bp = streamer_read_bitpack (ib);
+      bitpack_d bp = streamer_read_bitpack (ib);
       jump_func->agg.by_ref = bp_unpack_value (&bp, 1);
     }
   for (i = 0; i < count; i++)
     {
-      struct ipa_agg_jf_item item;
+      ipa_agg_jf_item item;
       item.offset = streamer_read_uhwi (ib);
       item.value = stream_read_tree (ib, data_in);
       jump_func->agg.items->quick_push (item);
@@ -4849,11 +4824,11 @@  ipa_read_jump_function (struct lto_input_block *ib,
    relevant to indirect inlining to OB.  */
 
 static void
-ipa_write_indirect_edge_info (struct output_block *ob,
-			      struct cgraph_edge *cs)
+ipa_write_indirect_edge_info (output_block *ob,
+			      cgraph_edge *cs)
 {
-  struct cgraph_indirect_call_info *ii = cs->indirect_info;
-  struct bitpack_d bp;
+  cgraph_indirect_call_info *ii = cs->indirect_info;
+  bitpack_d bp;
 
   streamer_write_hwi (ob, ii->param_index);
   bp = bitpack_create (ob->main_stream);
@@ -4880,12 +4855,12 @@  ipa_write_indirect_edge_info (struct output_block *ob,
    relevant to indirect inlining from IB.  */
 
 static void
-ipa_read_indirect_edge_info (struct lto_input_block *ib,
-			     struct data_in *data_in,
-			     struct cgraph_edge *cs)
+ipa_read_indirect_edge_info (lto_input_block *ib,
+			     data_in *data_in,
+			     cgraph_edge *cs)
 {
-  struct cgraph_indirect_call_info *ii = cs->indirect_info;
-  struct bitpack_d bp;
+  cgraph_indirect_call_info *ii = cs->indirect_info;
+  bitpack_d bp;
 
   ii->param_index = (int) streamer_read_hwi (ib);
   bp = streamer_read_bitpack (ib);
@@ -4909,14 +4884,14 @@  ipa_read_indirect_edge_info (struct lto_input_block *ib,
 /* Stream out NODE info to OB.  */
 
 static void
-ipa_write_node_info (struct output_block *ob, struct cgraph_node *node)
+ipa_write_node_info (output_block *ob, cgraph_node *node)
 {
   int node_ref;
   lto_symtab_encoder_t encoder;
-  struct ipa_node_params *info = IPA_NODE_REF (node);
+  ipa_node_params *info = IPA_NODE_REF (node);
   int j;
-  struct cgraph_edge *e;
-  struct bitpack_d bp;
+  cgraph_edge *e;
+  bitpack_d bp;
 
   encoder = ob->decl_state->symtab_node_encoder;
   node_ref = lto_symtab_encoder_encode (encoder, node);
@@ -4937,7 +4912,7 @@  ipa_write_node_info (struct output_block *ob, struct cgraph_node *node)
     streamer_write_hwi (ob, ipa_get_controlled_uses (info, j));
   for (e = node->callees; e; e = e->next_callee)
     {
-      struct ipa_edge_args *args = IPA_EDGE_REF (e);
+      ipa_edge_args *args = IPA_EDGE_REF (e);
 
       streamer_write_uhwi (ob,
 			   ipa_get_cs_argument_count (args) * 2
@@ -4951,7 +4926,7 @@  ipa_write_node_info (struct output_block *ob, struct cgraph_node *node)
     }
   for (e = node->indirect_calls; e; e = e->next_callee)
     {
-      struct ipa_edge_args *args = IPA_EDGE_REF (e);
+      ipa_edge_args *args = IPA_EDGE_REF (e);
 
       streamer_write_uhwi (ob,
 			   ipa_get_cs_argument_count (args) * 2
@@ -4969,13 +4944,13 @@  ipa_write_node_info (struct output_block *ob, struct cgraph_node *node)
 /* Stream in NODE info from IB.  */
 
 static void
-ipa_read_node_info (struct lto_input_block *ib, struct cgraph_node *node,
-		    struct data_in *data_in)
+ipa_read_node_info (lto_input_block *ib, cgraph_node *node,
+		    data_in *data_in)
 {
-  struct ipa_node_params *info = IPA_NODE_REF (node);
+  ipa_node_params *info = IPA_NODE_REF (node);
   int k;
-  struct cgraph_edge *e;
-  struct bitpack_d bp;
+  cgraph_edge *e;
+  bitpack_d bp;
 
   ipa_alloc_node_params (node, streamer_read_uhwi (ib));
 
@@ -4992,7 +4967,7 @@  ipa_read_node_info (struct lto_input_block *ib, struct cgraph_node *node,
     ipa_set_controlled_uses (info, k, streamer_read_hwi (ib));
   for (e = node->callees; e; e = e->next_callee)
     {
-      struct ipa_edge_args *args = IPA_EDGE_REF (e);
+      ipa_edge_args *args = IPA_EDGE_REF (e);
       int count = streamer_read_uhwi (ib);
       bool contexts_computed = count & 1;
       count /= 2;
@@ -5013,7 +4988,7 @@  ipa_read_node_info (struct lto_input_block *ib, struct cgraph_node *node,
     }
   for (e = node->indirect_calls; e; e = e->next_callee)
     {
-      struct ipa_edge_args *args = IPA_EDGE_REF (e);
+      ipa_edge_args *args = IPA_EDGE_REF (e);
       int count = streamer_read_uhwi (ib);
       bool contexts_computed = count & 1;
       count /= 2;
@@ -5040,14 +5015,13 @@  ipa_read_node_info (struct lto_input_block *ib, struct cgraph_node *node,
 void
 ipa_prop_write_jump_functions (void)
 {
-  struct cgraph_node *node;
-  struct output_block *ob;
+  cgraph_node *node;
+  output_block *ob;
   unsigned int count = 0;
   lto_symtab_encoder_iterator lsei;
   lto_symtab_encoder_t encoder;
 
-
-  if (!ipa_node_params_vector.exists ())
+  if (!ipa_node_params_d)
     return;
 
   ob = create_output_block (LTO_section_jump_functions);
@@ -5081,15 +5055,15 @@  ipa_prop_write_jump_functions (void)
 /* Read section in file FILE_DATA of length LEN with data DATA.  */
 
 static void
-ipa_prop_read_section (struct lto_file_decl_data *file_data, const char *data,
+ipa_prop_read_section (lto_file_decl_data *file_data, const char *data,
 		       size_t len)
 {
-  const struct lto_function_header *header =
-    (const struct lto_function_header *) data;
-  const int cfg_offset = sizeof (struct lto_function_header);
+  const lto_function_header *header =
+    (const lto_function_header *) data;
+  const int cfg_offset = sizeof (lto_function_header);
   const int main_offset = cfg_offset + header->cfg_size;
   const int string_offset = main_offset + header->main_size;
-  struct data_in *data_in;
+  data_in *data_in;
   unsigned int i;
   unsigned int count;
 
@@ -5104,7 +5078,7 @@  ipa_prop_read_section (struct lto_file_decl_data *file_data, const char *data,
   for (i = 0; i < count; i++)
     {
       unsigned int index;
-      struct cgraph_node *node;
+      cgraph_node *node;
       lto_symtab_encoder_t encoder;
 
       index = streamer_read_uhwi (&ib_main);
@@ -5124,8 +5098,8 @@  ipa_prop_read_section (struct lto_file_decl_data *file_data, const char *data,
 void
 ipa_prop_read_jump_functions (void)
 {
-  struct lto_file_decl_data **file_data_vec = lto_get_file_decl_data ();
-  struct lto_file_decl_data *file_data;
+  lto_file_decl_data **file_data_vec = lto_get_file_decl_data ();
+  lto_file_decl_data *file_data;
   unsigned int j = 0;
 
   ipa_check_create_node_params ();
@@ -5154,12 +5128,12 @@  ipa_update_after_lto_read (void)
 }
 
 void
-write_agg_replacement_chain (struct output_block *ob, struct cgraph_node *node)
+write_agg_replacement_chain (output_block *ob, cgraph_node *node)
 {
   int node_ref;
   unsigned int count = 0;
   lto_symtab_encoder_t encoder;
-  struct ipa_agg_replacement_value *aggvals, *av;
+  ipa_agg_replacement_value *aggvals, *av;
 
   aggvals = ipa_get_agg_replacements_for_node (node);
   encoder = ob->decl_state->symtab_node_encoder;
@@ -5172,7 +5146,7 @@  write_agg_replacement_chain (struct output_block *ob, struct cgraph_node *node)
 
   for (av = aggvals; av; av = av->next)
     {
-      struct bitpack_d bp;
+      bitpack_d bp;
 
       streamer_write_uhwi (ob, av->offset);
       streamer_write_uhwi (ob, av->index);
@@ -5187,18 +5161,18 @@  write_agg_replacement_chain (struct output_block *ob, struct cgraph_node *node)
 /* Stream in the aggregate value replacement chain for NODE from IB.  */
 
 static void
-read_agg_replacement_chain (struct lto_input_block *ib,
-			    struct cgraph_node *node,
-			    struct data_in *data_in)
+read_agg_replacement_chain (lto_input_block *ib,
+			    cgraph_node *node,
+			    data_in *data_in)
 {
-  struct ipa_agg_replacement_value *aggvals = NULL;
+  ipa_agg_replacement_value *aggvals = NULL;
   unsigned int count, i;
 
   count = streamer_read_uhwi (ib);
   for (i = 0; i <count; i++)
     {
-      struct ipa_agg_replacement_value *av;
-      struct bitpack_d bp;
+      ipa_agg_replacement_value *av;
+      bitpack_d bp;
 
       av = ggc_alloc<ipa_agg_replacement_value> ();
       av->offset = streamer_read_uhwi (ib);
@@ -5217,8 +5191,8 @@  read_agg_replacement_chain (struct lto_input_block *ib,
 void
 ipa_prop_write_all_agg_replacement (void)
 {
-  struct cgraph_node *node;
-  struct output_block *ob;
+  cgraph_node *node;
+  output_block *ob;
   unsigned int count = 0;
   lto_symtab_encoder_iterator lsei;
   lto_symtab_encoder_t encoder;
@@ -5257,16 +5231,16 @@  ipa_prop_write_all_agg_replacement (void)
    DATA.  */
 
 static void
-read_replacements_section (struct lto_file_decl_data *file_data,
+read_replacements_section (lto_file_decl_data *file_data,
 			   const char *data,
 			   size_t len)
 {
-  const struct lto_function_header *header =
-    (const struct lto_function_header *) data;
-  const int cfg_offset = sizeof (struct lto_function_header);
+  const lto_function_header *header =
+    (const lto_function_header *) data;
+  const int cfg_offset = sizeof (lto_function_header);
   const int main_offset = cfg_offset + header->cfg_size;
   const int string_offset = main_offset + header->main_size;
-  struct data_in *data_in;
+  data_in *data_in;
   unsigned int i;
   unsigned int count;
 
@@ -5280,7 +5254,7 @@  read_replacements_section (struct lto_file_decl_data *file_data,
   for (i = 0; i < count; i++)
     {
       unsigned int index;
-      struct cgraph_node *node;
+      cgraph_node *node;
       lto_symtab_encoder_t encoder;
 
       index = streamer_read_uhwi (&ib_main);
@@ -5300,8 +5274,8 @@  read_replacements_section (struct lto_file_decl_data *file_data,
 void
 ipa_prop_read_all_agg_replacement (void)
 {
-  struct lto_file_decl_data **file_data_vec = lto_get_file_decl_data ();
-  struct lto_file_decl_data *file_data;
+  lto_file_decl_data **file_data_vec = lto_get_file_decl_data ();
+  lto_file_decl_data *file_data;
   unsigned int j = 0;
 
   while ((file_data = file_data_vec[j++]))
@@ -5319,10 +5293,10 @@  ipa_prop_read_all_agg_replacement (void)
    NODE.  */
 
 static void
-adjust_agg_replacement_values (struct cgraph_node *node,
-			       struct ipa_agg_replacement_value *aggval)
+adjust_agg_replacement_values (cgraph_node *node,
+			       ipa_agg_replacement_value *aggval)
 {
-  struct ipa_agg_replacement_value *v;
+  ipa_agg_replacement_value *v;
   int i, c = 0, d = 0, *adj;
 
   if (!node->clone.combined_args_to_skip)
@@ -5355,9 +5329,9 @@  adjust_agg_replacement_values (struct cgraph_node *node,
 class ipcp_modif_dom_walker : public dom_walker
 {
 public:
-  ipcp_modif_dom_walker (struct func_body_info *fbi,
+  ipcp_modif_dom_walker (func_body_info *fbi,
 			 vec<ipa_param_descriptor> descs,
-			 struct ipa_agg_replacement_value *av,
+			 ipa_agg_replacement_value *av,
 			 bool *sc, bool *cc)
     : dom_walker (CDI_DOMINATORS), m_fbi (fbi), m_descriptors (descs),
       m_aggval (av), m_something_changed (sc), m_cfg_changed (cc) {}
@@ -5365,9 +5339,9 @@  public:
   virtual void before_dom_children (basic_block);
 
 private:
-  struct func_body_info *m_fbi;
+  func_body_info *m_fbi;
   vec<ipa_param_descriptor> m_descriptors;
-  struct ipa_agg_replacement_value *m_aggval;
+  ipa_agg_replacement_value *m_aggval;
   bool *m_something_changed, *m_cfg_changed;
 };
 
@@ -5377,7 +5351,7 @@  ipcp_modif_dom_walker::before_dom_children (basic_block bb)
   gimple_stmt_iterator gsi;
   for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
     {
-      struct ipa_agg_replacement_value *v;
+      ipa_agg_replacement_value *v;
       gimple stmt = gsi_stmt (gsi);
       tree rhs, val, t;
       HOST_WIDE_INT offset, size;
@@ -5468,11 +5442,11 @@  ipcp_modif_dom_walker::before_dom_children (basic_block bb)
 /* IPCP transformation phase doing propagation of aggregate values.  */
 
 unsigned int
-ipcp_transform_function (struct cgraph_node *node)
+ipcp_transform_function (cgraph_node *node)
 {
   vec<ipa_param_descriptor> descriptors = vNULL;
-  struct func_body_info fbi;
-  struct ipa_agg_replacement_value *aggval;
+  func_body_info fbi;
+  ipa_agg_replacement_value *aggval;
   int param_count;
   bool cfg_changed = false, something_changed = false;
 
@@ -5507,7 +5481,7 @@  ipcp_transform_function (struct cgraph_node *node)
 			 &cfg_changed).walk (ENTRY_BLOCK_PTR_FOR_FN (cfun));
 
   int i;
-  struct ipa_bb_info *bi;
+  ipa_bb_info *bi;
   FOR_EACH_VEC_ELT (fbi.bb_infos, i, bi)
     free_ipa_bb_info (bi);
   fbi.bb_infos.release ();
diff --git a/gcc/ipa-prop.h b/gcc/ipa-prop.h
index 165fc1a..5e25fd8 100644
--- a/gcc/ipa-prop.h
+++ b/gcc/ipa-prop.h
@@ -20,7 +20,6 @@  along with GCC; see the file COPYING3.  If not see
 #ifndef IPA_PROP_H
 #define IPA_PROP_H
 
-
 /* The following definitions and interfaces are used by
    interprocedural analyses or parameters.  */
 
@@ -356,6 +355,8 @@  struct ipcp_lattice;
 
 struct ipa_node_params
 {
+  ~ipa_node_params ();
+
   /* Information about individual formal parameters that are gathered when
      summaries are generated. */
   vec<ipa_param_descriptor> descriptors;
@@ -364,7 +365,7 @@  struct ipa_node_params
   struct ipcp_param_lattices *lattices;
   /* Only for versioned nodes this field would not be NULL,
      it points to the node that IPA cp cloned from.  */
-  struct cgraph_node *ipcp_orig_node;
+  cgraph_node *ipcp_orig_node;
   /* If this node is an ipa-cp clone, these are the known values that describe
      what it has been specialized for.  */
   vec<tree> known_vals;
@@ -470,7 +471,7 @@  struct GTY(()) ipa_agg_replacement_value
 
 typedef struct ipa_agg_replacement_value *ipa_agg_replacement_value_p;
 
-void ipa_set_node_agg_value_chain (struct cgraph_node *node,
+void ipa_set_node_agg_value_chain (const cgraph_node *node,
 				   struct ipa_agg_replacement_value *aggvals);
 
 /* ipa_edge_args stores information related to a callsite and particularly its
@@ -513,10 +514,22 @@  ipa_get_ith_polymorhic_call_context (struct ipa_edge_args *args, int i)
   return &(*args->polymorphic_call_contexts)[i];
 }
 
-/* Types of vectors holding the infos.  */
+/* Callgraph summary for ipa_node_params.  */
+class ipa_node_params_t: public function_summary <ipa_node_params *>
+{
+public:
+  ipa_node_params_t (symbol_table *table):
+    function_summary<ipa_node_params *> (table) { }
 
-/* Vector where the parameter infos are actually stored. */
-extern vec<ipa_node_params> ipa_node_params_vector;
+  /* Hook that is called by summary when a node is duplicated.  */
+  virtual void duplication_hook (cgraph_node *node,
+				 cgraph_node *node2,
+				 ipa_node_params *data,
+				 ipa_node_params *data2);
+};
+
+/* Function summary where the parameter infos are actually stored. */
+extern ipa_node_params_t *ipa_node_params_d;
 /* Vector of known aggregate values in cloned nodes.  */
 extern GTY(()) vec<ipa_agg_replacement_value_p, va_gc> *ipa_node_agg_replacements;
 /* Vector where the parameter infos are actually stored. */
@@ -524,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_vector[(NODE)->uid])
+#define IPA_NODE_REF(NODE) ((*ipa_node_params_d)[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.  */
@@ -534,11 +547,11 @@  extern GTY(()) vec<ipa_edge_args, va_gc> *ipa_edge_args_vector;
 void ipa_create_all_node_params (void);
 void ipa_create_all_edge_args (void);
 void ipa_free_edge_args_substructures (struct ipa_edge_args *);
-void ipa_free_node_params_substructures (struct ipa_node_params *);
 void ipa_free_all_node_params (void);
 void ipa_free_all_edge_args (void);
 void ipa_free_all_structures_after_ipa_cp (void);
 void ipa_free_all_structures_after_iinln (void);
+
 void ipa_register_cgraph_hooks (void);
 int count_formal_params (tree fndecl);
 
@@ -548,11 +561,8 @@  int count_formal_params (tree fndecl);
 static inline void
 ipa_check_create_node_params (void)
 {
-  if (!ipa_node_params_vector.exists ())
-    ipa_node_params_vector.create (symtab->cgraph_max_uid);
-
-  if (ipa_node_params_vector.length () <= (unsigned) symtab->cgraph_max_uid)
-    ipa_node_params_vector.safe_grow_cleared (symtab->cgraph_max_uid + 1);
+  if (!ipa_node_params_d)
+    ipa_node_params_d = new ipa_node_params_t (symtab);
 }
 
 /* This function ensures the array of edge arguments infos is big enough to
@@ -579,7 +589,7 @@  ipa_edge_args_info_available_for_edge_p (struct cgraph_edge *edge)
 /* Return the aggregate replacements for NODE, if there are any.  */
 
 static inline struct ipa_agg_replacement_value *
-ipa_get_agg_replacements_for_node (struct cgraph_node *node)
+ipa_get_agg_replacements_for_node (const cgraph_node *node)
 {
   if ((unsigned) node->uid >= vec_safe_length (ipa_node_agg_replacements))
     return NULL;
@@ -587,7 +597,7 @@  ipa_get_agg_replacements_for_node (struct cgraph_node *node)
 }
 
 /* Function formal parameters related computations.  */
-void ipa_initialize_node_params (struct cgraph_node *node);
+void ipa_initialize_node_params (const cgraph_node *node);
 bool ipa_propagate_indirect_call_infos (struct cgraph_edge *cs,
 					vec<cgraph_edge *> *new_edges);
 
@@ -602,7 +612,7 @@  tree ipa_binfo_from_known_type_jfunc (struct ipa_jump_func *);
 tree ipa_impossible_devirt_target (struct cgraph_edge *, tree);
 
 /* Functions related to both.  */
-void ipa_analyze_node (struct cgraph_node *);
+void ipa_analyze_node (cgraph_node *);
 
 /* Aggregate jump function related functions.  */
 tree ipa_find_agg_cst_for_param (struct ipa_agg_jump_function *, HOST_WIDE_INT,
@@ -611,9 +621,9 @@  bool ipa_load_from_parm_agg (struct ipa_node_params *, gimple, tree, int *,
 			     HOST_WIDE_INT *, bool *);
 
 /* Debugging interface.  */
-void ipa_print_node_params (FILE *, struct cgraph_node *node);
+void ipa_print_node_params (FILE *, cgraph_node *node);
 void ipa_print_all_params (FILE *);
-void ipa_print_node_jump_functions (FILE *f, struct cgraph_node *node);
+void ipa_print_node_jump_functions (FILE *f, cgraph_node *node);
 void ipa_print_all_jump_functions (FILE * f);
 void ipcp_verify_propagated_values (void);
 
@@ -717,7 +727,7 @@  void ipa_update_after_lto_read (void);
 int ipa_get_param_decl_index (struct ipa_node_params *, tree);
 tree ipa_value_from_jfunc (struct ipa_node_params *info,
 			   struct ipa_jump_func *jfunc);
-unsigned int ipcp_transform_function (struct cgraph_node *node);
+unsigned int ipcp_transform_function (cgraph_node *node);
 void ipa_dump_param (FILE *, struct ipa_node_params *info, int i);
 bool ipa_modify_expr (tree *, bool, ipa_parm_adjustment_vec);
 ipa_parm_adjustment *ipa_get_adjustment_candidate (tree **, bool *,
diff --git a/gcc/ipa-split.c b/gcc/ipa-split.c
index 98dbc63..16684e2 100644
--- a/gcc/ipa-split.c
+++ b/gcc/ipa-split.c
@@ -109,6 +109,7 @@  along with GCC; see the file COPYING3.  If not see
 #include "ipa-ref.h"
 #include "cgraph.h"
 #include "alloc-pool.h"
+#include "symbol-summary.h"
 #include "ipa-prop.h"
 #include "gimple-ssa.h"
 #include "tree-cfg.h"
diff --git a/gcc/ipa-utils.c b/gcc/ipa-utils.c
index 22900cc..e2f8bd2 100644
--- a/gcc/ipa-utils.c
+++ b/gcc/ipa-utils.c
@@ -55,6 +55,7 @@  along with GCC; see the file COPYING3.  If not see
 #include "langhooks.h"
 #include "lto-streamer.h"
 #include "alloc-pool.h"
+#include "symbol-summary.h"
 #include "ipa-prop.h"
 #include "ipa-inline.h"
 
diff --git a/gcc/ipa.c b/gcc/ipa.c
index a6086d8..80b8561 100644
--- a/gcc/ipa.c
+++ b/gcc/ipa.c
@@ -46,6 +46,7 @@  along with GCC; see the file COPYING3.  If not see
 #include "tree-iterator.h"
 #include "ipa-utils.h"
 #include "alloc-pool.h"
+#include "symbol-summary.h"
 #include "ipa-prop.h"
 #include "ipa-inline.h"
 #include "tree-inline.h"
diff --git a/gcc/lto/lto-partition.c b/gcc/lto/lto-partition.c
index 0e1a95b..3a2f9ed 100644
--- a/gcc/lto/lto-partition.c
+++ b/gcc/lto/lto-partition.c
@@ -45,6 +45,7 @@  along with GCC; see the file COPYING3.  If not see
 #include "timevar.h"
 #include "params.h"
 #include "alloc-pool.h"
+#include "symbol-summary.h"
 #include "ipa-prop.h"
 #include "ipa-inline.h"
 #include "ipa-utils.h"
diff --git a/gcc/lto/lto-symtab.c b/gcc/lto/lto-symtab.c
index 4c4e48a..1afdf73 100644
--- a/gcc/lto/lto-symtab.c
+++ b/gcc/lto/lto-symtab.c
@@ -45,6 +45,7 @@  along with GCC; see the file COPYING3.  If not see
 #include "lto-streamer.h"
 #include "ipa-utils.h"
 #include "alloc-pool.h"
+#include "symbol-summary.h"
 #include "ipa-prop.h"
 #include "ipa-inline.h"
 #include "builtins.h"
diff --git a/gcc/lto/lto.c b/gcc/lto/lto.c
index d8519d9..d151522 100644
--- a/gcc/lto/lto.c
+++ b/gcc/lto/lto.c
@@ -47,6 +47,7 @@  along with GCC; see the file COPYING3.  If not see
 #include "bitmap.h"
 #include "inchash.h"
 #include "alloc-pool.h"
+#include "symbol-summary.h"
 #include "ipa-prop.h"
 #include "common.h"
 #include "debug.h"
diff --git a/gcc/omp-low.c b/gcc/omp-low.c
index b59d069..cf51306 100644
--- a/gcc/omp-low.c
+++ b/gcc/omp-low.c
@@ -82,6 +82,7 @@  along with GCC; see the file COPYING3.  If not see
 #include "tree-cfgcleanup.h"
 #include "pretty-print.h"
 #include "alloc-pool.h"
+#include "symbol-summary.h"
 #include "ipa-prop.h"
 #include "tree-nested.h"
 #include "tree-eh.h"
diff --git a/gcc/tree-inline.c b/gcc/tree-inline.c
index 8cb9510..d49d952 100644
--- a/gcc/tree-inline.c
+++ b/gcc/tree-inline.c
@@ -74,6 +74,7 @@  along with GCC; see the file COPYING3.  If not see
 #include "ipa-ref.h"
 #include "cgraph.h"
 #include "alloc-pool.h"
+#include "symbol-summary.h"
 #include "ipa-prop.h"
 #include "value-prof.h"
 #include "tree-pass.h"
diff --git a/gcc/tree-sra.c b/gcc/tree-sra.c
index 1e629bc..e0c375d 100644
--- a/gcc/tree-sra.c
+++ b/gcc/tree-sra.c
@@ -115,6 +115,7 @@  along with GCC; see the file COPYING3.  If not see
 #include "plugin-api.h"
 #include "ipa-ref.h"
 #include "cgraph.h"
+#include "symbol-summary.h"
 #include "ipa-prop.h"
 #include "statistics.h"
 #include "params.h"
diff --git a/gcc/tree-ssa-pre.c b/gcc/tree-ssa-pre.c
index ea99198..c2e5907 100644
--- a/gcc/tree-ssa-pre.c
+++ b/gcc/tree-ssa-pre.c
@@ -77,6 +77,7 @@  along with GCC; see the file COPYING3.  If not see
 #include "plugin-api.h"
 #include "ipa-ref.h"
 #include "cgraph.h"
+#include "symbol-summary.h"
 #include "ipa-prop.h"
 #include "tree-ssa-propagate.h"
 #include "ipa-utils.h"
-- 
2.1.2