diff options
author | Jan Hubicka <jh@suse.cz> | 2020-01-29 12:43:10 +0100 |
---|---|---|
committer | Jan Hubicka <jh@suse.cz> | 2020-01-29 12:43:10 +0100 |
commit | 7c7107778f16c2db6e97e73fdec6d6606b619864 (patch) | |
tree | cde725b3ee08653f39c58d1c724feb3f6a2b94d9 /gcc/cgraph.c | |
parent | 87c3fcfa6bbb5c372d4e275276d21f601d0b62b0 (diff) |
ipa: Fix removal of multi-target speculation.
* cgraph.c (cgraph_edge::resolve_speculation): Only lookup direct edge
if called on indirect edge.
(cgraph_edge::redirect_call_stmt_to_callee): Lookup indirect edge of
speculative call if needed.
* gcc.dg/tree-prof/indir-call-prof-2.c: New testcase.
Diffstat (limited to 'gcc/cgraph.c')
-rw-r--r-- | gcc/cgraph.c | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/gcc/cgraph.c b/gcc/cgraph.c index 3e50b0bc380..294b2d392fd 100644 --- a/gcc/cgraph.c +++ b/gcc/cgraph.c @@ -1189,7 +1189,10 @@ cgraph_edge::resolve_speculation (cgraph_edge *edge, tree callee_decl) ipa_ref *ref; gcc_assert (edge->speculative && (!callee_decl || edge->callee)); - e2 = edge->first_speculative_call_target (); + if (!edge->callee) + e2 = edge->first_speculative_call_target (); + else + e2 = edge; ref = e2->speculative_call_target_ref (); edge = edge->speculative_call_indirect_edge (); if (!callee_decl @@ -1364,7 +1367,8 @@ cgraph_edge::redirect_call_stmt_to_callee (cgraph_edge *e) /* If there already is an direct call (i.e. as a result of inliner's substitution), forget about speculating. */ if (decl) - e = make_direct (e, cgraph_node::get (decl)); + e = make_direct (e->speculative_call_indirect_edge (), + cgraph_node::get (decl)); else { /* Be sure we redirect all speculative targets before poking |