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