+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
ipa_param_adjustments *param_adjustments,
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
replaced by other inline clone. */
cgraph_node *find_replacement (void);
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. */
static void
dump_function_to_file (node->decl, symtab->dump_file, dump_flags);
}
+ cgraph_node *clone_of = node->clone_of;
/* Function is no longer clone. */
- if (node->next_sibling_clone)
- node->next_sibling_clone->prev_sibling_clone = node->prev_sibling_clone;
- 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->remove_from_clone_tree ();
+ if (!clone_of->analyzed && !clone_of->clones)
{
- node->clone_of->release_body ();
- node->clone_of->remove_callees ();
- node->clone_of->remove_all_references ();
+ clone_of->release_body ();
+ clone_of->remove_callees ();
+ clone_of->remove_all_references ();
}
- node->clone_of = NULL;
bitmap_obstack_release (NULL);
}
reliably. */
if (node->alias || node->thunk.thunk_p)
;
- else if (!body_needed_for_clonning.contains (node->decl)
- && !node->alias && !node->thunk.thunk_p)
- node->release_body ();
+ else if (!body_needed_for_clonning.contains (node->decl))
+ {
+ /* 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)
gcc_assert (in_lto_p || DECL_RESULT (node->decl));
if (node->definition && !node->alias && !node->thunk.thunk_p)