diff options
author | Martin Jambor <mjambor@suse.cz> | 2019-10-02 14:44:35 +0200 |
---|---|---|
committer | Martin Jambor <jamborm@gcc.gnu.org> | 2019-10-02 14:44:35 +0200 |
commit | 3187c8a5010f4245ff008a0fc2fb746a8bce4a00 (patch) | |
tree | 57403e651339babab9bbb759ade26ac1ce118719 /gcc/cgraph.c | |
parent | 569651fd6fdb6455da58f7811e6296c22ce34df7 (diff) | |
download | gcc-3187c8a5010f4245ff008a0fc2fb746a8bce4a00.zip gcc-3187c8a5010f4245ff008a0fc2fb746a8bce4a00.tar.gz gcc-3187c8a5010f4245ff008a0fc2fb746a8bce4a00.tar.bz2 |
[PATCH] Do not check call type compatibility when cloning cgraph-edges
2019-10-02 Martin Jambor <mjambor@suse.cz>
* cgraph.c (symbol_table::create_edge): New parameter cloning_p,
do not compute some stuff when set.
(cgraph_node::create_edge): Likewise.
(cgraph_node::create_indirect_edge): Renamed last parameter to
coning_p and flipped its meaning, don't even calculate
inline_failed when set.
* cgraph.h (cgraph_node::create_edge): Add new parameter.
(symbol_table::::create_edge): Likewise.
(cgraph_node::create_indirect_edge): Rename last parameter, flip
the default value.
* cgraphclones.c (cgraph_edge::clone): Pass true cloning_p to all
call graph edge creating functions.
From-SVN: r276455
Diffstat (limited to 'gcc/cgraph.c')
-rw-r--r-- | gcc/cgraph.c | 48 |
1 files changed, 29 insertions, 19 deletions
diff --git a/gcc/cgraph.c b/gcc/cgraph.c index 19158f0..7748cef 100644 --- a/gcc/cgraph.c +++ b/gcc/cgraph.c @@ -824,12 +824,13 @@ cgraph_edge::set_call_stmt (gcall *new_stmt, bool update_speculative) /* Allocate a cgraph_edge structure and fill it with data according to the parameters of which only CALLEE can be NULL (when creating an indirect call - edge). */ + edge). CLONING_P should be set if properties that are copied from an + original edge should not be calculated. */ cgraph_edge * symbol_table::create_edge (cgraph_node *caller, cgraph_node *callee, gcall *call_stmt, profile_count count, - bool indir_unknown_callee) + bool indir_unknown_callee, bool cloning_p) { cgraph_edge *edge; @@ -862,8 +863,17 @@ symbol_table::create_edge (cgraph_node *caller, cgraph_node *callee, edge->lto_stmt_uid = 0; edge->count = count; - edge->call_stmt = call_stmt; + edge->indirect_info = NULL; + edge->indirect_inlining_edge = 0; + edge->speculative = false; + edge->indirect_unknown_callee = indir_unknown_callee; + if (call_stmt && caller->call_site_hash) + cgraph_add_edge_to_call_site_hash (edge); + + if (cloning_p) + return edge; + edge->can_throw_external = call_stmt ? stmt_can_throw_external (DECL_STRUCT_FUNCTION (caller->decl), call_stmt) : false; @@ -881,10 +891,6 @@ symbol_table::create_edge (cgraph_node *caller, cgraph_node *callee, edge->call_stmt_cannot_inline_p = false; } - edge->indirect_info = NULL; - edge->indirect_inlining_edge = 0; - edge->speculative = false; - edge->indirect_unknown_callee = indir_unknown_callee; if (opt_for_fn (edge->caller->decl, flag_devirtualize) && call_stmt && DECL_STRUCT_FUNCTION (caller->decl)) edge->in_polymorphic_cdtor @@ -892,22 +898,23 @@ symbol_table::create_edge (cgraph_node *caller, cgraph_node *callee, caller->decl); else edge->in_polymorphic_cdtor = caller->thunk.thunk_p; - if (call_stmt && caller->call_site_hash) - cgraph_add_edge_to_call_site_hash (edge); return edge; } -/* Create edge from a given function to CALLEE in the cgraph. */ +/* Create edge from a given function to CALLEE in the cgraph. CLONING_P should + be set if properties that are copied from an original edge should not be + calculated. */ cgraph_edge * cgraph_node::create_edge (cgraph_node *callee, - gcall *call_stmt, profile_count count) + gcall *call_stmt, profile_count count, bool cloning_p) { cgraph_edge *edge = symtab->create_edge (this, callee, call_stmt, count, - false); + false, cloning_p); - initialize_inline_failed (edge); + if (!cloning_p) + initialize_inline_failed (edge); edge->next_caller = callee->callers; if (callee->callers) @@ -935,25 +942,28 @@ cgraph_allocate_init_indirect_info (void) /* Create an indirect edge with a yet-undetermined callee where the call statement destination is a formal parameter of the caller with index - PARAM_INDEX. */ + PARAM_INDEX. CLONING_P should be set if properties that are copied from an + original edge should not be calculated and indirect_info structure should + not be calculated. */ cgraph_edge * cgraph_node::create_indirect_edge (gcall *call_stmt, int ecf_flags, profile_count count, - bool compute_indirect_info) + bool cloning_p) { - cgraph_edge *edge = symtab->create_edge (this, NULL, call_stmt, - count, true); + cgraph_edge *edge = symtab->create_edge (this, NULL, call_stmt, count, true, + cloning_p); tree target; - initialize_inline_failed (edge); + if (!cloning_p) + initialize_inline_failed (edge); edge->indirect_info = cgraph_allocate_init_indirect_info (); edge->indirect_info->ecf_flags = ecf_flags; edge->indirect_info->vptr_changed = true; /* Record polymorphic call info. */ - if (compute_indirect_info + if (!cloning_p && call_stmt && (target = gimple_call_fn (call_stmt)) && virtual_method_call_p (target)) |