aboutsummaryrefslogtreecommitdiff
path: root/gcc/cgraph.c
diff options
context:
space:
mode:
authorMartin Jambor <mjambor@suse.cz>2019-10-02 14:44:35 +0200
committerMartin Jambor <jamborm@gcc.gnu.org>2019-10-02 14:44:35 +0200
commit3187c8a5010f4245ff008a0fc2fb746a8bce4a00 (patch)
tree57403e651339babab9bbb759ade26ac1ce118719 /gcc/cgraph.c
parent569651fd6fdb6455da58f7811e6296c22ce34df7 (diff)
downloadgcc-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.c48
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))