summaryrefslogtreecommitdiff
path: root/gcc/cgraph.c
diff options
context:
space:
mode:
authorMartin Jambor <mjambor@suse.cz>2019-09-20 00:25:04 +0200
committerMartin Jambor <jamborm@gcc.gnu.org>2019-09-20 00:25:04 +0200
commitff6686d2e5f797d6c6a36ad14a7084bc1dc350e4 (patch)
tree21de4e26dd766dab8b60b2be7190a6b86bad2b38 /gcc/cgraph.c
parent6889a3acfeed47265886676c6d43b04ef799fb82 (diff)
New IPA-SRA
2019-09-20 Martin Jambor <mjambor@suse.cz> * coretypes.h (cgraph_edge): Declare. * ipa-param-manipulation.c: Rewrite. * ipa-param-manipulation.h: Likewise. * Makefile.in (GTFILES): Added ipa-param-manipulation.h and ipa-sra.c. (OBJS): Added ipa-sra.o. * cgraph.h (ipa_replace_map): Removed fields old_tree, replace_p and ref_p, added fields param_adjustments and performed_splits. (struct cgraph_clone_info): Remove ags_to_skip and combined_args_to_skip, new field param_adjustments. (cgraph_node::create_clone): Changed parameters to use ipa_param_adjustments. (cgraph_node::create_virtual_clone): Likewise. (cgraph_node::create_virtual_clone_with_body): Likewise. (tree_function_versioning): Likewise. (cgraph_build_function_type_skip_args): Removed. * cgraph.c (cgraph_edge::redirect_call_stmt_to_callee): Convert to using ipa_param_adjustments. (clone_of_p): Likewise. * cgraphclones.c (cgraph_build_function_type_skip_args): Removed. (build_function_decl_skip_args): Likewise. (duplicate_thunk_for_node): Adjust parameters using ipa_param_body_adjustments, copy param_adjustments instead of args_to_skip. (cgraph_node::create_clone): Convert to using ipa_param_adjustments. (cgraph_node::create_virtual_clone): Likewise. (cgraph_node::create_version_clone_with_body): Likewise. (cgraph_materialize_clone): Likewise. (symbol_table::materialize_all_clones): Likewise. * ipa-fnsummary.c (ipa_fn_summary_t::duplicate): Simplify ipa_replace_map check. * ipa-cp.c (get_replacement_map): Do not initialize removed fields. (initialize_node_lattices): Make aware that some parameters might have already been removed. (want_remove_some_param_p): New function. (create_specialized_node): Convert to using ipa_param_adjustments and deal with possibly pre-existing adjustments. * lto-cgraph.c (output_cgraph_opt_summary_p): Likewise. (output_node_opt_summary): Do not stream removed fields. Stream parameter adjustments instead of argumetns to skip. (input_node_opt_summary): Likewise. (input_node_opt_summary): Likewise. * lto-section-in.c (lto_section_name): Added ipa-sra section. * lto-streamer.h (lto_section_type): Likewise. * tree-inline.h (copy_body_data): New fields killed_new_ssa_names and param_body_adjs. (copy_decl_to_var): Declare. * tree-inline.c (update_clone_info): Do not remap old_tree. (remap_gimple_stmt): Use ipa_param_body_adjustments to modify gimple statements, walk all extra generated statements and remap their operands. (redirect_all_calls): Add killed SSA names to a hash set. (remap_ssa_name): Do not remap killed SSA names. (copy_arguments_for_versioning): Renames to copy_arguments_nochange, half of functionality moved to ipa_param_body_adjustments. (copy_decl_to_var): Make exported. (copy_body): Destroy killed_new_ssa_names hash set. (expand_call_inline): Remap performed splits. (update_clone_info): Likewise. (tree_function_versioning): Simplify tree_map processing. Updated to accept ipa_param_adjustments and use ipa_param_body_adjustments. * omp-simd-clone.c (simd_clone_vector_of_formal_parm_types): Adjust for the new interface. (simd_clone_clauses_extract): Likewise, make args an auto_vec. (simd_clone_compute_base_data_type): Likewise. (simd_clone_init_simd_arrays): Adjust for the new interface. (simd_clone_adjust_argument_types): Likewise. (struct modify_stmt_info): Likewise. (ipa_simd_modify_stmt_ops): Likewise. (ipa_simd_modify_function_body): Likewise. (simd_clone_adjust): Likewise. * tree-sra.c: Removed IPA-SRA. Include tree-sra.h. (type_internals_preclude_sra_p): Make public. * tree-sra.h: New file. * ipa-inline-transform.c (save_inline_function_body): Update to refelct new tree_function_versioning signature. * ipa-prop.c (adjust_agg_replacement_values): Use a helper from ipa_param_adjustments to get current parameter indices. (ipcp_modif_dom_walker::before_dom_children): Likewise. (ipcp_update_bits): Likewise. (ipcp_update_vr): Likewise. * ipa-split.c (split_function): Convert to using ipa_param_adjustments. * ipa-sra.c: New file. * multiple_target.c (create_target_clone): Update to reflet new type of create_version_clone_with_body. * trans-mem.c (ipa_tm_create_version): Update to reflect new type of tree_function_versioning. (modify_function): Update to reflect new type of tree_function_versioning. * params.def (PARAM_IPA_SRA_MAX_REPLACEMENTS): New. * passes.def: Remove old IPA-SRA and add new one. * tree-pass.h (make_pass_early_ipa_sra): Remove declaration. (make_pass_ipa_sra): Declare. * dbgcnt.def: Remove eipa_sra. Added ipa_sra_params and ipa_sra_retvalues. * doc/invoke.texi (ipa-sra-max-replacements): New. testsuite/ * g++.dg/ipa/pr81248.C: Adjust dg-options and dump-scan. * gcc.dg/ipa/ipa-sra-1.c: Likewise. * gcc.dg/ipa/ipa-sra-10.c: Likewise. * gcc.dg/ipa/ipa-sra-11.c: Likewise. * gcc.dg/ipa/ipa-sra-3.c: Likewise. * gcc.dg/ipa/ipa-sra-4.c: Likewise. * gcc.dg/ipa/ipa-sra-5.c: Likewise. * gcc.dg/ipa/ipacost-2.c: Disable ipa-sra. * gcc.dg/ipa/ipcp-agg-9.c: Likewise. * gcc.dg/ipa/pr78121.c: Adjust scan pattern. * gcc.dg/ipa/vrp1.c: Likewise. * gcc.dg/ipa/vrp2.c: Likewise. * gcc.dg/ipa/vrp3.c: Likewise. * gcc.dg/ipa/vrp7.c: Likewise. * gcc.dg/ipa/vrp8.c: Likewise. * gcc.dg/noreorder.c: use noipa attribute instead of noinline. * gcc.dg/ipa/20040703-wpa.c: New test. * gcc.dg/ipa/ipa-sra-12.c: New test. * gcc.dg/ipa/ipa-sra-13.c: Likewise. * gcc.dg/ipa/ipa-sra-14.c: Likewise. * gcc.dg/ipa/ipa-sra-15.c: Likewise. * gcc.dg/ipa/ipa-sra-16.c: Likewise. * gcc.dg/ipa/ipa-sra-17.c: Likewise. * gcc.dg/ipa/ipa-sra-18.c: Likewise. * gcc.dg/ipa/ipa-sra-19.c: Likewise. * gcc.dg/ipa/ipa-sra-20.c: Likewise. * gcc.dg/ipa/ipa-sra-21.c: Likewise. * gcc.dg/ipa/ipa-sra-22.c: Likewise. * gcc.dg/sso/ipa-sra-1.c: Likewise. * g++.dg/ipa/ipa-sra-2.C: Likewise. * g++.dg/ipa/ipa-sra-3.C: Likewise. * gcc.dg/tree-ssa/ipa-cp-1.c: Make return value used. * g++.dg/ipa/devirt-19.C: Add missing return, add -fipa-cp-clone option. * g++.dg/lto/devirt-19_0.C: Add -fipa-cp-clone option. * gcc.dg/ipa/ipa-sra-2.c: Removed. * gcc.dg/ipa/ipa-sra-6.c: Likewise. From-SVN: r275982
Diffstat (limited to 'gcc/cgraph.c')
-rw-r--r--gcc/cgraph.c127
1 files changed, 29 insertions, 98 deletions
diff --git a/gcc/cgraph.c b/gcc/cgraph.c
index 843891e9e56..331b363c175 100644
--- a/gcc/cgraph.c
+++ b/gcc/cgraph.c
@@ -1342,7 +1342,7 @@ cgraph_edge::redirect_call_stmt_to_callee (void)
if (flag_checking && decl)
{
cgraph_node *node = cgraph_node::get (decl);
- gcc_assert (!node || !node->clone.combined_args_to_skip);
+ gcc_assert (!node || !node->clone.param_adjustments);
}
if (symtab->dump_file)
@@ -1350,25 +1350,36 @@ cgraph_edge::redirect_call_stmt_to_callee (void)
fprintf (symtab->dump_file, "updating call of %s -> %s: ",
e->caller->dump_name (), e->callee->dump_name ());
print_gimple_stmt (symtab->dump_file, e->call_stmt, 0, dump_flags);
- if (e->callee->clone.combined_args_to_skip)
+ if (e->callee->clone.param_adjustments)
+ e->callee->clone.param_adjustments->dump (symtab->dump_file);
+ unsigned performed_len
+ = vec_safe_length (e->caller->clone.performed_splits);
+ if (performed_len > 0)
+ fprintf (symtab->dump_file, "Performed splits records:\n");
+ for (unsigned i = 0; i < performed_len; i++)
{
- fprintf (symtab->dump_file, " combined args to skip: ");
- dump_bitmap (symtab->dump_file,
- e->callee->clone.combined_args_to_skip);
+ ipa_param_performed_split *sm
+ = &(*e->caller->clone.performed_splits)[i];
+ print_node_brief (symtab->dump_file, " dummy_decl: ", sm->dummy_decl,
+ TDF_UID);
+ fprintf (symtab->dump_file, ", unit_offset: %u\n", sm->unit_offset);
}
}
- if (e->callee->clone.combined_args_to_skip)
+ if (ipa_param_adjustments *padjs = e->callee->clone.param_adjustments)
{
- int lp_nr;
+ /* We need to defer cleaning EH info on the new statement to
+ fixup-cfg. We may not have dominator information at this point
+ and thus would end up with unreachable blocks and have no way
+ to communicate that we need to run CFG cleanup then. */
+ int lp_nr = lookup_stmt_eh_lp (e->call_stmt);
+ if (lp_nr != 0)
+ remove_stmt_from_eh_lp (e->call_stmt);
- new_stmt = e->call_stmt;
- if (e->callee->clone.combined_args_to_skip)
- new_stmt
- = gimple_call_copy_skip_args (new_stmt,
- e->callee->clone.combined_args_to_skip);
tree old_fntype = gimple_call_fntype (e->call_stmt);
- gimple_call_set_fndecl (new_stmt, e->callee->decl);
+ new_stmt = padjs->modify_call (e->call_stmt,
+ e->caller->clone.performed_splits,
+ e->callee->decl, false);
cgraph_node *origin = e->callee;
while (origin->clone_of)
origin = origin->clone_of;
@@ -1379,92 +1390,12 @@ cgraph_edge::redirect_call_stmt_to_callee (void)
gimple_call_set_fntype (new_stmt, TREE_TYPE (e->callee->decl));
else
{
- bitmap skip = e->callee->clone.combined_args_to_skip;
- tree t = cgraph_build_function_type_skip_args (old_fntype, skip,
- false);
- gimple_call_set_fntype (new_stmt, t);
- }
-
- if (gimple_vdef (new_stmt)
- && TREE_CODE (gimple_vdef (new_stmt)) == SSA_NAME)
- SSA_NAME_DEF_STMT (gimple_vdef (new_stmt)) = new_stmt;
-
- gsi = gsi_for_stmt (e->call_stmt);
-
- /* For optimized away parameters, add on the caller side
- before the call
- DEBUG D#X => parm_Y(D)
- stmts and associate D#X with parm in decl_debug_args_lookup
- vector to say for debug info that if parameter parm had been passed,
- it would have value parm_Y(D). */
- if (e->callee->clone.combined_args_to_skip && MAY_HAVE_DEBUG_BIND_STMTS)
- {
- vec<tree, va_gc> **debug_args
- = decl_debug_args_lookup (e->callee->decl);
- tree old_decl = gimple_call_fndecl (e->call_stmt);
- if (debug_args && old_decl)
- {
- tree parm;
- unsigned i = 0, num;
- unsigned len = vec_safe_length (*debug_args);
- unsigned nargs = gimple_call_num_args (e->call_stmt);
- for (parm = DECL_ARGUMENTS (old_decl), num = 0;
- parm && num < nargs;
- parm = DECL_CHAIN (parm), num++)
- if (bitmap_bit_p (e->callee->clone.combined_args_to_skip, num)
- && is_gimple_reg (parm))
- {
- unsigned last = i;
-
- while (i < len && (**debug_args)[i] != DECL_ORIGIN (parm))
- i += 2;
- if (i >= len)
- {
- i = 0;
- while (i < last
- && (**debug_args)[i] != DECL_ORIGIN (parm))
- i += 2;
- if (i >= last)
- continue;
- }
- tree ddecl = (**debug_args)[i + 1];
- tree arg = gimple_call_arg (e->call_stmt, num);
- if (!useless_type_conversion_p (TREE_TYPE (ddecl),
- TREE_TYPE (arg)))
- {
- tree rhs1;
- if (!fold_convertible_p (TREE_TYPE (ddecl), arg))
- continue;
- if (TREE_CODE (arg) == SSA_NAME
- && gimple_assign_cast_p (SSA_NAME_DEF_STMT (arg))
- && (rhs1
- = gimple_assign_rhs1 (SSA_NAME_DEF_STMT (arg)))
- && useless_type_conversion_p (TREE_TYPE (ddecl),
- TREE_TYPE (rhs1)))
- arg = rhs1;
- else
- arg = fold_convert (TREE_TYPE (ddecl), arg);
- }
-
- gimple *def_temp
- = gimple_build_debug_bind (ddecl, unshare_expr (arg),
- e->call_stmt);
- gsi_insert_before (&gsi, def_temp, GSI_SAME_STMT);
- }
- }
+ tree new_fntype = padjs->build_new_function_type (old_fntype, true);
+ gimple_call_set_fntype (new_stmt, new_fntype);
}
- gsi_replace (&gsi, new_stmt, false);
- /* We need to defer cleaning EH info on the new statement to
- fixup-cfg. We may not have dominator information at this point
- and thus would end up with unreachable blocks and have no way
- to communicate that we need to run CFG cleanup then. */
- lp_nr = lookup_stmt_eh_lp (e->call_stmt);
if (lp_nr != 0)
- {
- remove_stmt_from_eh_lp (e->call_stmt);
- add_stmt_to_eh_lp (new_stmt, lp_nr);
- }
+ add_stmt_to_eh_lp (new_stmt, lp_nr);
}
else
{
@@ -3014,8 +2945,8 @@ clone_of_p (cgraph_node *node, cgraph_node *node2)
return true;
node = node->callees->callee->ultimate_alias_target ();
- if (!node2->clone.args_to_skip
- || !bitmap_bit_p (node2->clone.args_to_skip, 0))
+ if (!node2->clone.param_adjustments
+ || node2->clone.param_adjustments->first_param_intact_p ())
return false;
if (node2->former_clone_of == node->decl)
return true;