Commit 28307164 by Jan Hubicka

Fix updating of call_stmt_site_hash

This patch fixes ICE causes by call stmt site hash going out of sync.  For
speculative edges it is assumed to contain a direct call so if we are
removing it hashtable needs to be updated.  I realize that the code is ugly
but I will leave cleanup for next stage1.

Bootstrapped/regtested x86_64-linux. This patch makes it possible to build
Firefox again.

	PR lto/93318
	* cgraph.c (cgraph_edge::resolve_speculation,
	cgraph_edge::redirect_call_stmt_to_callee): Fix update of
	call_stmt_site_hash.
parent 8158a464
2020-01-18 Jan Hubicka <hubicka@ucw.cz>
PR lto/93318
* cgraph.c (cgraph_edge::resolve_speculation,
cgraph_edge::redirect_call_stmt_to_callee): Fix update of
call_stmt_site_hash.
2020-01-21 Martin Liska <mliska@suse.cz>
* config/rs6000/rs6000.c (common_mode_defined): Remove
......
......@@ -1248,7 +1248,22 @@ cgraph_edge::resolve_speculation (cgraph_edge *edge, tree callee_decl)
else
e2->callee->remove_symbol_and_inline_clones ();
if (edge->caller->call_site_hash)
{
/* We always maintain direct edge in the call site hash, if one
exists. */
if (!edge->num_speculative_call_targets_p ())
cgraph_update_edge_in_call_site_hash (edge);
else
{
cgraph_edge *e;
for (e = edge->caller->callees;
e->call_stmt != edge->call_stmt
|| e->lto_stmt_uid != edge->lto_stmt_uid;
e = e->next_callee)
;
cgraph_update_edge_in_call_site_hash (e);
}
}
return edge;
}
......@@ -1414,7 +1429,20 @@ cgraph_edge::redirect_call_stmt_to_callee (cgraph_edge *e)
/* Indirect edges are not both in the call site hash.
get it updated. */
if (e->caller->call_site_hash)
{
if (!e2->num_speculative_call_targets_p ())
cgraph_update_edge_in_call_site_hash (e2);
else
{
cgraph_edge *e;
for (e = e2->caller->callees;
e->call_stmt != e2->call_stmt
|| e->lto_stmt_uid != e2->lto_stmt_uid;
e = e->next_callee)
;
cgraph_update_edge_in_call_site_hash (e);
}
}
pop_cfun ();
/* Continue redirecting E to proper target. */
}
......
......@@ -391,17 +391,20 @@ symbol_table::remove_unreachable_nodes (FILE *file)
n->used_as_abstract_origin = true;
}
}
/* If any symbol in a comdat group is reachable, force
all externally visible symbols in the same comdat
/* If any non-external and non-local symbol in a comdat group is
reachable, force all externally visible symbols in the same comdat
group to be reachable as well. Comdat-local symbols
can be discarded if all uses were inlined. */
if (node->same_comdat_group)
if (node->same_comdat_group
&& node->externally_visible
&& !DECL_EXTERNAL (node->decl))
{
symtab_node *next;
for (next = node->same_comdat_group;
next != node;
next = next->same_comdat_group)
if (!next->comdat_local_p ()
&& !DECL_EXTERNAL (next->decl)
&& !reachable.add (next))
enqueue_node (next, &first, &reachable);
}
......
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