ipa: Fix removal of multi-target speculation.
authorJan Hubicka <jh@suse.cz>
Wed, 29 Jan 2020 11:43:10 +0000 (12:43 +0100)
committerJan Hubicka <jh@suse.cz>
Wed, 29 Jan 2020 11:43:10 +0000 (12:43 +0100)
* 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.

gcc/ChangeLog
gcc/cgraph.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/tree-prof/indir-call-prof-2.c [new file with mode: 0644]

index f6959ef6ebfe44f59d94ee6dbb1c3e6a368cd67b..504486cb444cca4269842eb5f22a74758b753cff 100644 (file)
@@ -1,3 +1,10 @@
+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>
 
        PR tree-optimization/93428
index 3e50b0bc38087582167f5b7c3a36fbd4236b0029..294b2d392fdbec82363175f8bc4f7e8720a66f44 100644 (file)
@@ -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
index 01769a8453c1694f05a5177c21000c97fd1eb222..055188488293a26709a05317c07954eba2008ac3 100644 (file)
@@ -1,3 +1,7 @@
+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>
 
        PR testsuite/93393
diff --git a/gcc/testsuite/gcc.dg/tree-prof/indir-call-prof-2.c b/gcc/testsuite/gcc.dg/tree-prof/indir-call-prof-2.c
new file mode 100644 (file)
index 0000000..bbba052
--- /dev/null
@@ -0,0 +1,35 @@
+/* { 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"} } */