This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Fix updating of call_stmt_site_hash


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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]