https://gcc.gnu.org/g:9765a730758e53f499004aad48646fb410e7fb6d

commit r16-7319-g9765a730758e53f499004aad48646fb410e7fb6d
Author: Jan Hubicka <[email protected]>
Date:   Thu Feb 5 12:30:50 2026 +0100

    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:
---
 gcc/cgraph.cc | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/gcc/cgraph.cc b/gcc/cgraph.cc
index 91ff2775de13..508a5559569d 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

Reply via email to