From: Jan Hubicka Date: Thu, 5 Feb 2026 11:30:50 +0000 (+0100) Subject: Fix speculative devirtualization ICE X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=9765a730758e53f499004aad48646fb410e7fb6d;p=thirdparty%2Fgcc.git Fix speculative devirtualization ICE this patch fixes cgraph verifier ICE about missing indirect call in the speculative call sequence. This is triggered when tree-inline manages to devirtualize call during folding it does and the call has multiple specualtive targets. cgraph_update_edges_for_call_stmt_node calls cgraph_edge::resolve_speculation which resolves one edge, but it should make the whole sequence direct which is done by cgraph_edge::make_direct. The code was also handling the case that call changed but it is not direct. This should be impossible (and would require similar updating) so I added unreachable. Bootstrapped/regtested x86_64-linux and also tested with autofdo and spec2017. gcc/ChangeLog: PR ipa/123226 * cgraph.cc (cgraph_update_edges_for_call_stmt_node): Fix handling of multi-target speculations resolved at clone materialization time --- diff --git a/gcc/cgraph.cc b/gcc/cgraph.cc index 91ff2775de1..508a5559569 100644 --- a/gcc/cgraph.cc +++ b/gcc/cgraph.cc @@ -2014,10 +2014,11 @@ cgraph_update_edges_for_call_stmt_node (cgraph_node *node, { tree decl = gimple_call_fndecl (new_stmt); if (decl) - e = cgraph_edge::resolve_speculation (e, decl); + e = cgraph_edge::make_direct + (e, cgraph_node::get_create (decl)); } else - e = cgraph_edge::resolve_speculation (e, NULL); + gcc_unreachable (); } /* Keep calls marked as dead dead. */ if (new_stmt && is_gimple_call (new_stmt) && e->callee