On January 21, 2020 4:37:31 PM GMT+01:00, Jan Hubicka <[email protected]> wrote:
>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.
It even looks quadratic? Can't you simply lookup the stmt?
> 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. */
> }