On January 21, 2020 4:37:31 PM GMT+01:00, Jan Hubicka <hubi...@ucw.cz> 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. */ > }