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

Reply via email to