Commit 7c710777 by Jan Hubicka

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.
parent 87c3fcfa
2020-01-28 Jan Hubicka <hubicka@ucw.cz>
* 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.
2020-01-29 Richard Biener <rguenther@suse.de> 2020-01-29 Richard Biener <rguenther@suse.de>
PR tree-optimization/93428 PR tree-optimization/93428
......
...@@ -1189,7 +1189,10 @@ cgraph_edge::resolve_speculation (cgraph_edge *edge, tree callee_decl) ...@@ -1189,7 +1189,10 @@ cgraph_edge::resolve_speculation (cgraph_edge *edge, tree callee_decl)
ipa_ref *ref; ipa_ref *ref;
gcc_assert (edge->speculative && (!callee_decl || edge->callee)); 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 (); ref = e2->speculative_call_target_ref ();
edge = edge->speculative_call_indirect_edge (); edge = edge->speculative_call_indirect_edge ();
if (!callee_decl if (!callee_decl
...@@ -1364,7 +1367,8 @@ cgraph_edge::redirect_call_stmt_to_callee (cgraph_edge *e) ...@@ -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 /* If there already is an direct call (i.e. as a result of inliner's
substitution), forget about speculating. */ substitution), forget about speculating. */
if (decl) if (decl)
e = make_direct (e, cgraph_node::get (decl)); e = make_direct (e->speculative_call_indirect_edge (),
cgraph_node::get (decl));
else else
{ {
/* Be sure we redirect all speculative targets before poking /* Be sure we redirect all speculative targets before poking
......
2020-01-28 Jan Hubicka <hubicka@ucw.cz>
* gcc.dg/tree-prof/indir-call-prof-2.c: New testcase.
2020-01-29 Richard Sandiford <richard.sandiford@arm.com> 2020-01-29 Richard Sandiford <richard.sandiford@arm.com>
PR testsuite/93393 PR testsuite/93393
......
/* { dg-options "-O2 -fno-early-inlining -fdump-ipa-profile-optimized -fdump-ipa-afdo" } */
volatile int one;
static int
add1 (int val)
{
return val += one;
}
static int
sub1 (int val)
{
return val -= one;
}
static int
do_op (int val, int (*fnptr) (int))
{
return fnptr (val);
}
int
main (void)
{
int i, val = 0;
for (i = 0; i < 100000; i++)
{
val = do_op (val, add1);
val = do_op (val, sub1);
}
return val;
}
/* { dg-final-use-not-autofdo { scan-ipa-dump "Indirect call -> direct call.* add1 .will resolve by ipa-profile" "profile"} } */
/* { dg-final-use-not-autofdo { scan-ipa-dump "Indirect call -> direct call.* sub1 .will resolve by ipa-profile" "profile"} } */
/* { dg-final-use-autofdo { scan-ipa-dump "Indirect call -> direct call.* add1 .will resolve by ipa-profile" "afdo"} } */
/* { dg-final-use-autofdo { scan-ipa-dump "Indirect call -> direct call.* sub1 .will resolve by ipa-profile" "afdo"} } */
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment