diff options
author | Jan Hubicka <jh@suse.cz> | 2020-01-21 16:33:43 +0100 |
---|---|---|
committer | Jan Hubicka <jh@suse.cz> | 2020-01-21 16:33:43 +0100 |
commit | 28307164dfed294855bf3d55bed357de560f083b (patch) | |
tree | 0c424dd708b166a638eb9e71247de2b0e667c586 /gcc/cgraph.c | |
parent | 8158a4640819dbb3210326e37786fb874f450272 (diff) | |
download | gcc-28307164dfed294855bf3d55bed357de560f083b.zip gcc-28307164dfed294855bf3d55bed357de560f083b.tar.gz gcc-28307164dfed294855bf3d55bed357de560f083b.tar.bz2 |
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.
Diffstat (limited to 'gcc/cgraph.c')
-rw-r--r-- | gcc/cgraph.c | 32 |
1 files changed, 30 insertions, 2 deletions
diff --git a/gcc/cgraph.c b/gcc/cgraph.c index 187f6ed..f7ebcc9 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. */ } |