Hi,
this patch should fix cgrpah verifier ICE that occurs for speculative calls
with call site hash in caller.   Here we manage to wrong non-speculative
edge into the hash from time to time, when the edges are copied by inliner.

This patch fixes the problema and also fixes problem in
cgraph_turn_edge_to_speculative I noticed independently where
can_throw_external is not cleared when callee is nothrow.

Bootstrapped/regtested x86_64-linux and also profiledbootstrapped.
Will commit it shortly.
I get occasional ICE in verifier for dead refs after saving inline
body.  I will look into that next.

Honza

        PR bootstrap/58186
        * cgraph.c (cgraph_add_edge_to_call_site_hash): Overwrite hash
        entry for direct edges.
        (cgraph_turn_edge_to_speculative): Fix setting of can_throw_external.
        
Index: cgraph.c
===================================================================
--- cgraph.c    (revision 201838)
+++ cgraph.c    (working copy)
@@ -701,6 +701,8 @@ cgraph_add_edge_to_call_site_hash (struc
   if (*slot)
     {
       gcc_assert (((struct cgraph_edge *)*slot)->speculative);
+      if (e->callee)
+       *slot = e;
       return;
     }
   gcc_assert (!*slot || e->speculative);
@@ -1083,8 +1085,10 @@ cgraph_turn_edge_to_speculative (struct
   e2 = cgraph_create_edge (n, n2, e->call_stmt, direct_count, 
direct_frequency);
   initialize_inline_failed (e2);
   e2->speculative = true;
-  e2->call_stmt = e->call_stmt;
-  e2->can_throw_external = e->can_throw_external;
+  if (TREE_NOTHROW (n2->symbol.decl))
+    e2->can_throw_external = false;
+  else
+    e2->can_throw_external = e->can_throw_external;
   e2->lto_stmt_uid = e->lto_stmt_uid;
   e->count -= e2->count;
   e->frequency -= e2->frequency;

Reply via email to