Commit d0b1b67a by Martin Jambor Committed by Martin Jambor

ipa: Prevent materialization of clones with removed bodies (PR 92109)

2019-11-25  Martin Jambor  <mjambor@suse.cz>

	PR ipa/92109
	* cgraph.h (cgraph_node::remove_from_clone_tree): Declare.
	* cgraphclones.c (cgraph_node::remove_from_clone_tree): New method.
	(cgraph_materialize_clone): Move removel from clone tree to the
	the new method and use it instead.
	* ipa.c (symbol_table::remove_unreachable_nodes): When removing
	bodies of clones, also remove it from the clone tree.

From-SVN: r278670
parent ed649cda
2019-11-25 Martin Jambor <mjambor@suse.cz> 2019-11-25 Martin Jambor <mjambor@suse.cz>
PR ipa/92109
* cgraph.h (cgraph_node::remove_from_clone_tree): Declare.
* cgraphclones.c (cgraph_node::remove_from_clone_tree): New method.
(cgraph_materialize_clone): Move removel from clone tree to the
the new method and use it instead.
* ipa.c (symbol_table::remove_unreachable_nodes): When removing
bodies of clones, also remove it from the clone tree.
2019-11-25 Martin Jambor <mjambor@suse.cz>
PR ipa/91956 PR ipa/91956
* ipa-sra.c (process_isra_node_results): Put the new node to the * ipa-sra.c (process_isra_node_results): Put the new node to the
same comdat group as the original node. same comdat group as the original node.
...@@ -967,6 +967,10 @@ struct GTY((tag ("SYMTAB_FUNCTION"))) cgraph_node : public symtab_node ...@@ -967,6 +967,10 @@ struct GTY((tag ("SYMTAB_FUNCTION"))) cgraph_node : public symtab_node
ipa_param_adjustments *param_adjustments, ipa_param_adjustments *param_adjustments,
const char * suffix, unsigned num_suffix); const char * suffix, unsigned num_suffix);
/* Remove the node from the tree of virtual and inline clones and make it a
standalone node - not a clone any more. */
void remove_from_clone_tree ();
/* cgraph node being removed from symbol table; see if its entry can be /* cgraph node being removed from symbol table; see if its entry can be
replaced by other inline clone. */ replaced by other inline clone. */
cgraph_node *find_replacement (void); cgraph_node *find_replacement (void);
......
...@@ -1013,6 +1013,22 @@ cgraph_node::create_version_clone_with_body ...@@ -1013,6 +1013,22 @@ cgraph_node::create_version_clone_with_body
return new_version_node; return new_version_node;
} }
/* Remove the node from the tree of virtual and inline clones and make it a
standalone node - not a clone any more. */
void cgraph_node::remove_from_clone_tree ()
{
if (next_sibling_clone)
next_sibling_clone->prev_sibling_clone = prev_sibling_clone;
if (prev_sibling_clone)
prev_sibling_clone->next_sibling_clone = next_sibling_clone;
else
clone_of->clones = next_sibling_clone;
next_sibling_clone = NULL;
prev_sibling_clone = NULL;
clone_of = NULL;
}
/* Given virtual clone, turn it into actual clone. */ /* Given virtual clone, turn it into actual clone. */
static void static void
...@@ -1033,22 +1049,15 @@ cgraph_materialize_clone (cgraph_node *node) ...@@ -1033,22 +1049,15 @@ cgraph_materialize_clone (cgraph_node *node)
dump_function_to_file (node->decl, symtab->dump_file, dump_flags); dump_function_to_file (node->decl, symtab->dump_file, dump_flags);
} }
cgraph_node *clone_of = node->clone_of;
/* Function is no longer clone. */ /* Function is no longer clone. */
if (node->next_sibling_clone) node->remove_from_clone_tree ();
node->next_sibling_clone->prev_sibling_clone = node->prev_sibling_clone; if (!clone_of->analyzed && !clone_of->clones)
if (node->prev_sibling_clone)
node->prev_sibling_clone->next_sibling_clone = node->next_sibling_clone;
else
node->clone_of->clones = node->next_sibling_clone;
node->next_sibling_clone = NULL;
node->prev_sibling_clone = NULL;
if (!node->clone_of->analyzed && !node->clone_of->clones)
{ {
node->clone_of->release_body (); clone_of->release_body ();
node->clone_of->remove_callees (); clone_of->remove_callees ();
node->clone_of->remove_all_references (); clone_of->remove_all_references ();
} }
node->clone_of = NULL;
bitmap_obstack_release (NULL); bitmap_obstack_release (NULL);
} }
......
...@@ -520,9 +520,14 @@ symbol_table::remove_unreachable_nodes (FILE *file) ...@@ -520,9 +520,14 @@ symbol_table::remove_unreachable_nodes (FILE *file)
reliably. */ reliably. */
if (node->alias || node->thunk.thunk_p) if (node->alias || node->thunk.thunk_p)
; ;
else if (!body_needed_for_clonning.contains (node->decl) else if (!body_needed_for_clonning.contains (node->decl))
&& !node->alias && !node->thunk.thunk_p) {
node->release_body (); /* Make the node a non-clone so that we do not attempt to
materialize it later. */
if (node->clone_of)
node->remove_from_clone_tree ();
node->release_body ();
}
else if (!node->clone_of) else if (!node->clone_of)
gcc_assert (in_lto_p || DECL_RESULT (node->decl)); gcc_assert (in_lto_p || DECL_RESULT (node->decl));
if (node->definition && !node->alias && !node->thunk.thunk_p) if (node->definition && !node->alias && !node->thunk.thunk_p)
......
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