Commit 3187c8a5 by Martin Jambor Committed by Martin Jambor

[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
parent 569651fd
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.
2019-10-01 Jan Hubicka <hubicka@ucw.cz> 2019-10-01 Jan Hubicka <hubicka@ucw.cz>
PR c++/91222 PR c++/91222
......
...@@ -824,12 +824,13 @@ cgraph_edge::set_call_stmt (gcall *new_stmt, bool update_speculative) ...@@ -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 /* 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 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 * cgraph_edge *
symbol_table::create_edge (cgraph_node *caller, cgraph_node *callee, symbol_table::create_edge (cgraph_node *caller, cgraph_node *callee,
gcall *call_stmt, profile_count count, gcall *call_stmt, profile_count count,
bool indir_unknown_callee) bool indir_unknown_callee, bool cloning_p)
{ {
cgraph_edge *edge; cgraph_edge *edge;
...@@ -862,8 +863,17 @@ symbol_table::create_edge (cgraph_node *caller, cgraph_node *callee, ...@@ -862,8 +863,17 @@ symbol_table::create_edge (cgraph_node *caller, cgraph_node *callee,
edge->lto_stmt_uid = 0; edge->lto_stmt_uid = 0;
edge->count = count; edge->count = count;
edge->call_stmt = call_stmt; 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 edge->can_throw_external
= call_stmt ? stmt_can_throw_external (DECL_STRUCT_FUNCTION (caller->decl), = call_stmt ? stmt_can_throw_external (DECL_STRUCT_FUNCTION (caller->decl),
call_stmt) : false; call_stmt) : false;
...@@ -881,10 +891,6 @@ symbol_table::create_edge (cgraph_node *caller, cgraph_node *callee, ...@@ -881,10 +891,6 @@ symbol_table::create_edge (cgraph_node *caller, cgraph_node *callee,
edge->call_stmt_cannot_inline_p = false; 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) if (opt_for_fn (edge->caller->decl, flag_devirtualize)
&& call_stmt && DECL_STRUCT_FUNCTION (caller->decl)) && call_stmt && DECL_STRUCT_FUNCTION (caller->decl))
edge->in_polymorphic_cdtor edge->in_polymorphic_cdtor
...@@ -892,22 +898,23 @@ symbol_table::create_edge (cgraph_node *caller, cgraph_node *callee, ...@@ -892,22 +898,23 @@ symbol_table::create_edge (cgraph_node *caller, cgraph_node *callee,
caller->decl); caller->decl);
else else
edge->in_polymorphic_cdtor = caller->thunk.thunk_p; 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; 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_edge *
cgraph_node::create_edge (cgraph_node *callee, 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, 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; edge->next_caller = callee->callers;
if (callee->callers) if (callee->callers)
...@@ -935,25 +942,28 @@ cgraph_allocate_init_indirect_info (void) ...@@ -935,25 +942,28 @@ cgraph_allocate_init_indirect_info (void)
/* Create an indirect edge with a yet-undetermined callee where the call /* Create an indirect edge with a yet-undetermined callee where the call
statement destination is a formal parameter of the caller with index 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_edge *
cgraph_node::create_indirect_edge (gcall *call_stmt, int ecf_flags, cgraph_node::create_indirect_edge (gcall *call_stmt, int ecf_flags,
profile_count count, profile_count count,
bool compute_indirect_info) bool cloning_p)
{ {
cgraph_edge *edge = symtab->create_edge (this, NULL, call_stmt, cgraph_edge *edge = symtab->create_edge (this, NULL, call_stmt, count, true,
count, true); cloning_p);
tree target; tree target;
initialize_inline_failed (edge); if (!cloning_p)
initialize_inline_failed (edge);
edge->indirect_info = cgraph_allocate_init_indirect_info (); edge->indirect_info = cgraph_allocate_init_indirect_info ();
edge->indirect_info->ecf_flags = ecf_flags; edge->indirect_info->ecf_flags = ecf_flags;
edge->indirect_info->vptr_changed = true; edge->indirect_info->vptr_changed = true;
/* Record polymorphic call info. */ /* Record polymorphic call info. */
if (compute_indirect_info if (!cloning_p
&& call_stmt && call_stmt
&& (target = gimple_call_fn (call_stmt)) && (target = gimple_call_fn (call_stmt))
&& virtual_method_call_p (target)) && virtual_method_call_p (target))
......
...@@ -1161,14 +1161,15 @@ struct GTY((tag ("SYMTAB_FUNCTION"))) cgraph_node : public symtab_node ...@@ -1161,14 +1161,15 @@ struct GTY((tag ("SYMTAB_FUNCTION"))) cgraph_node : public symtab_node
/* Create edge from a given function to CALLEE in the cgraph. */ /* Create edge from a given function to CALLEE in the cgraph. */
cgraph_edge *create_edge (cgraph_node *callee, cgraph_edge *create_edge (cgraph_node *callee,
gcall *call_stmt, profile_count count); gcall *call_stmt, profile_count count,
bool cloning_p = false);
/* Create an indirect edge with a yet-undetermined callee where the call /* Create an indirect edge with a yet-undetermined callee where the call
statement destination is a formal parameter of the caller with index statement destination is a formal parameter of the caller with index
PARAM_INDEX. */ PARAM_INDEX. */
cgraph_edge *create_indirect_edge (gcall *call_stmt, int ecf_flags, cgraph_edge *create_indirect_edge (gcall *call_stmt, int ecf_flags,
profile_count count, profile_count count,
bool compute_indirect_info = true); bool cloning_p = false);
/* Like cgraph_create_edge walk the clone tree and update all clones sharing /* Like cgraph_create_edge walk the clone tree and update all clones sharing
same function body. If clones already have edge for OLD_STMT; only same function body. If clones already have edge for OLD_STMT; only
...@@ -2381,11 +2382,12 @@ private: ...@@ -2381,11 +2382,12 @@ private:
inline cgraph_node * allocate_cgraph_symbol (void); inline cgraph_node * allocate_cgraph_symbol (void);
/* Allocate a cgraph_edge structure and fill it with data according to the /* 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 parameters of which only CALLEE can be NULL (when creating an indirect
edge). */ call edge). CLONING_P should be set if properties that are copied from an
original edge should not be calculated. */
cgraph_edge *create_edge (cgraph_node *caller, cgraph_node *callee, cgraph_edge *create_edge (cgraph_node *caller, cgraph_node *callee,
gcall *call_stmt, profile_count count, gcall *call_stmt, profile_count count,
bool indir_unknown_callee); bool indir_unknown_callee, bool cloning_p);
/* Put the edge onto the free list. */ /* Put the edge onto the free list. */
void free_edge (cgraph_edge *e); void free_edge (cgraph_edge *e);
......
...@@ -104,19 +104,19 @@ cgraph_edge::clone (cgraph_node *n, gcall *call_stmt, unsigned stmt_uid, ...@@ -104,19 +104,19 @@ cgraph_edge::clone (cgraph_node *n, gcall *call_stmt, unsigned stmt_uid,
{ {
cgraph_node *callee = cgraph_node::get (decl); cgraph_node *callee = cgraph_node::get (decl);
gcc_checking_assert (callee); gcc_checking_assert (callee);
new_edge = n->create_edge (callee, call_stmt, prof_count); new_edge = n->create_edge (callee, call_stmt, prof_count, true);
} }
else else
{ {
new_edge = n->create_indirect_edge (call_stmt, new_edge = n->create_indirect_edge (call_stmt,
indirect_info->ecf_flags, indirect_info->ecf_flags,
prof_count, false); prof_count, true);
*new_edge->indirect_info = *indirect_info; *new_edge->indirect_info = *indirect_info;
} }
} }
else else
{ {
new_edge = n->create_edge (callee, call_stmt, prof_count); new_edge = n->create_edge (callee, call_stmt, prof_count, true);
if (indirect_info) if (indirect_info)
{ {
new_edge->indirect_info new_edge->indirect_info
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment