mirror of
https://github.com/gcc-mirror/gcc.git
synced 2026-05-06 14:59:39 +02:00
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
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user