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>
PR c++/91222
......
......@@ -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))
......
......@@ -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. */
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
statement destination is a formal parameter of the caller with index
PARAM_INDEX. */
cgraph_edge *create_indirect_edge (gcall *call_stmt, int ecf_flags,
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
same function body. If clones already have edge for OLD_STMT; only
......@@ -2381,11 +2382,12 @@ private:
inline cgraph_node * allocate_cgraph_symbol (void);
/* 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). */
parameters of which only CALLEE can be NULL (when creating an indirect
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,
gcall *call_stmt, profile_count count,
bool indir_unknown_callee);
bool indir_unknown_callee, bool cloning_p);
/* Put the edge onto the free list. */
void free_edge (cgraph_edge *e);
......
......@@ -104,19 +104,19 @@ cgraph_edge::clone (cgraph_node *n, gcall *call_stmt, unsigned stmt_uid,
{
cgraph_node *callee = cgraph_node::get (decl);
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
{
new_edge = n->create_indirect_edge (call_stmt,
indirect_info->ecf_flags,
prof_count, false);
prof_count, true);
*new_edge->indirect_info = *indirect_info;
}
}
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)
{
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