Commit 0c04043e by Martin Liska Committed by Martin Liska

Properly register dead cgraph_nodes in passes.c.

2019-08-15  Martin Liska  <mliska@suse.cz>

	PR ipa/91404
	* passes.c (order): Remove.
	(uid_hash_t): Likewise).
	(remove_cgraph_node_from_order): Remove from set
	of pointers (cgraph_node *).
	(insert_cgraph_node_to_order): New.
	(duplicate_cgraph_node_to_order): New.
	(do_per_function_toporder): Register all 3 cgraph hooks.
	Skip removed_nodes now as we know about all of them.

From-SVN: r274502
parent 304e8bcb
2019-08-15 Martin Liska <mliska@suse.cz>
PR ipa/91404
* passes.c (order): Remove.
(uid_hash_t): Likewise).
(remove_cgraph_node_from_order): Remove from set
of pointers (cgraph_node *).
(insert_cgraph_node_to_order): New.
(duplicate_cgraph_node_to_order): New.
(do_per_function_toporder): Register all 3 cgraph hooks.
Skip removed_nodes now as we know about all of them.
2019-08-14 Uroš Bizjak <ubizjak@gmail.com> 2019-08-14 Uroš Bizjak <ubizjak@gmail.com>
* config/i386/i386-expand.c (ix86_expand_vector_init_one_nonzero) * config/i386/i386-expand.c (ix86_expand_vector_init_one_nonzero)
......
...@@ -1646,24 +1646,39 @@ do_per_function (void (*callback) (function *, void *data), void *data) ...@@ -1646,24 +1646,39 @@ do_per_function (void (*callback) (function *, void *data), void *data)
} }
} }
/* Because inlining might remove no-longer reachable nodes, we need to
keep the array visible to garbage collector to avoid reading collected
out nodes. */
static int nnodes;
static GTY ((length ("nnodes"))) cgraph_node **order;
#define uid_hash_t hash_set<int_hash <int, 0, -1> >
/* Hook called when NODE is removed and therefore should be /* Hook called when NODE is removed and therefore should be
excluded from order vector. DATA is a hash set with removed nodes. */ excluded from order vector. DATA is a hash set with removed nodes. */
static void static void
remove_cgraph_node_from_order (cgraph_node *node, void *data) remove_cgraph_node_from_order (cgraph_node *node, void *data)
{ {
uid_hash_t *removed_nodes = (uid_hash_t *)data; hash_set<cgraph_node *> *removed_nodes = (hash_set<cgraph_node *> *)data;
removed_nodes->add (node->get_uid ()); removed_nodes->add (node);
}
/* Hook called when NODE is insert and therefore should be
excluded from removed_nodes. DATA is a hash set with removed nodes. */
static void
insert_cgraph_node_to_order (cgraph_node *node, void *data)
{
hash_set<cgraph_node *> *removed_nodes = (hash_set<cgraph_node *> *)data;
removed_nodes->remove (node);
} }
/* Hook called when NODE is duplicated and therefore should be
excluded from removed_nodes. DATA is a hash set with removed nodes. */
static void
duplicate_cgraph_node_to_order (cgraph_node *node, cgraph_node *node2,
void *data)
{
hash_set<cgraph_node *> *removed_nodes = (hash_set<cgraph_node *> *)data;
gcc_checking_assert (!removed_nodes->contains (node));
removed_nodes->remove (node2);
}
/* If we are in IPA mode (i.e., current_function_decl is NULL), call /* If we are in IPA mode (i.e., current_function_decl is NULL), call
function CALLBACK for every function in the call graph. Otherwise, function CALLBACK for every function in the call graph. Otherwise,
call CALLBACK on the current function. call CALLBACK on the current function.
...@@ -1677,26 +1692,30 @@ do_per_function_toporder (void (*callback) (function *, void *data), void *data) ...@@ -1677,26 +1692,30 @@ do_per_function_toporder (void (*callback) (function *, void *data), void *data)
callback (cfun, data); callback (cfun, data);
else else
{ {
cgraph_node_hook_list *hook; hash_set<cgraph_node *> removed_nodes;
uid_hash_t removed_nodes; unsigned nnodes = symtab->cgraph_count;
gcc_assert (!order); cgraph_node **order = XNEWVEC (cgraph_node *, nnodes);
order = ggc_vec_alloc<cgraph_node *> (symtab->cgraph_count);
nnodes = ipa_reverse_postorder (order); nnodes = ipa_reverse_postorder (order);
for (i = nnodes - 1; i >= 0; i--) for (i = nnodes - 1; i >= 0; i--)
order[i]->process = 1; order[i]->process = 1;
hook = symtab->add_cgraph_removal_hook (remove_cgraph_node_from_order, cgraph_node_hook_list *removal_hook
&removed_nodes); = symtab->add_cgraph_removal_hook (remove_cgraph_node_from_order,
&removed_nodes);
cgraph_node_hook_list *insertion_hook
= symtab->add_cgraph_insertion_hook (insert_cgraph_node_to_order,
&removed_nodes);
cgraph_2node_hook_list *duplication_hook
= symtab->add_cgraph_duplication_hook (duplicate_cgraph_node_to_order,
&removed_nodes);
for (i = nnodes - 1; i >= 0; i--) for (i = nnodes - 1; i >= 0; i--)
{ {
cgraph_node *node = order[i]; cgraph_node *node = order[i];
/* Function could be inlined and removed as unreachable. */ /* Function could be inlined and removed as unreachable. */
if (node == NULL || removed_nodes.contains (node->get_uid ())) if (node == NULL || removed_nodes.contains (node))
continue; continue;
/* Allow possibly removed nodes to be garbage collected. */
order[i] = NULL;
node->process = 0; node->process = 0;
if (node->has_gimple_body_p ()) if (node->has_gimple_body_p ())
{ {
...@@ -1706,11 +1725,12 @@ do_per_function_toporder (void (*callback) (function *, void *data), void *data) ...@@ -1706,11 +1725,12 @@ do_per_function_toporder (void (*callback) (function *, void *data), void *data)
pop_cfun (); pop_cfun ();
} }
} }
symtab->remove_cgraph_removal_hook (hook); symtab->remove_cgraph_removal_hook (removal_hook);
symtab->remove_cgraph_insertion_hook (insertion_hook);
symtab->remove_cgraph_duplication_hook (duplication_hook);
free (order);
} }
ggc_free (order);
order = NULL;
nnodes = 0;
} }
/* Helper function to perform function body dump. */ /* Helper function to perform function body dump. */
...@@ -3046,5 +3066,3 @@ function_called_by_processed_nodes_p (void) ...@@ -3046,5 +3066,3 @@ function_called_by_processed_nodes_p (void)
} }
return e != NULL; return e != NULL;
} }
#include "gt-passes.h"
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