This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Fix updating of call_stmt_site_hash
- From: Jan Hubicka <hubicka at ucw dot cz>
- To: gcc-patches at gcc dot gnu dot org
- Date: Tue, 21 Jan 2020 16:37:31 +0100
- Subject: Fix updating of call_stmt_site_hash
Hi,
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.
diff --git a/gcc/cgraph.c b/gcc/cgraph.c
index 187f6ed30ba..f7ebcc917d1 100644
--- a/gcc/cgraph.c
+++ b/gcc/cgraph.c
@@ -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)
- 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;
}
@@ -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)
- 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 ();
/* Continue redirecting E to proper target. */
}