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.

        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.  */
        }

Reply via email to