Zero local estimated benefit for cloning extern inline function
authorMartin Jambor <mjambor@suse.cz>
Thu, 7 Mar 2019 16:42:20 +0000 (17:42 +0100)
committerMartin Jambor <jamborm@gcc.gnu.org>
Thu, 7 Mar 2019 16:42:20 +0000 (17:42 +0100)
2019-03-07  Martin Jambor  <mjambor@suse.cz>

PR lto/87525
* ipa-cp.c (perform_estimation_of_a_value): Account zero time benefit
for extern inline functions.

testsuite/
* gcc.dg/ipa/ipcp-5.c: New test.

From-SVN: r269464

gcc/ChangeLog
gcc/ipa-cp.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/ipa/ipcp-5.c [new file with mode: 0644]

index b8774f253919c3653161d2f943ffbdd2f0119bcc..148360523eda8219aeeddeac4534006b896e776f 100644 (file)
@@ -1,3 +1,9 @@
+2019-03-07  Martin Jambor  <mjambor@suse.cz>
+
+       PR lto/87525
+       * ipa-cp.c (perform_estimation_of_a_value): Account zero time benefit
+       for extern inline functions.
+
 2019-03-07  Martin Jambor  <mjambor@suse.cz>
 
        PR ipa/88235
index 442d5c63effa0854f2011b0f00f9f16ff062e40d..59b15fa7362c87de3e063f5b727d1279456b6cd6 100644 (file)
@@ -2818,11 +2818,18 @@ perform_estimation_of_a_value (cgraph_node *node, vec<tree> known_csts,
   base_time -= time;
   if (base_time > 65535)
     base_time = 65535;
-  time_benefit = base_time.to_int ()
-    + devirtualization_time_bonus (node, known_csts, known_contexts,
-                                  known_aggs_ptrs)
-    + hint_time_bonus (hints)
-    + removable_params_cost + est_move_cost;
+
+  /* Extern inline functions have no cloning local time benefits because they
+     will be inlined anyway.  The only reason to clone them is if it enables
+     optimization in any of the functions they call.  */
+  if (DECL_EXTERNAL (node->decl) && DECL_DECLARED_INLINE_P (node->decl))
+    time_benefit = 0;
+  else
+    time_benefit = base_time.to_int ()
+      + devirtualization_time_bonus (node, known_csts, known_contexts,
+                                    known_aggs_ptrs)
+      + hint_time_bonus (hints)
+      + removable_params_cost + est_move_cost;
 
   gcc_checking_assert (size >=0);
   /* The inliner-heuristics based estimates may think that in certain
index d0bd73432e0d60fa30e1596bc0124aa6adbd2f70..bf1546b639b46c383f67ce3644eba1b78d0ff55e 100644 (file)
@@ -1,3 +1,8 @@
+2019-03-07  Martin Jambor  <mjambor@suse.cz>
+
+       PR lto/87525
+       * gcc.dg/ipa/ipcp-5.c: New test.
+
 2019-03-07  Martin Jambor  <mjambor@suse.cz>
 
        PR ipa/88235
diff --git a/gcc/testsuite/gcc.dg/ipa/ipcp-5.c b/gcc/testsuite/gcc.dg/ipa/ipcp-5.c
new file mode 100644 (file)
index 0000000..6786c51
--- /dev/null
@@ -0,0 +1,45 @@
+/* Test that estimated local cloning time benefit of extern inline functions is
+   zero.  */
+
+/* { dg-do compile } */
+/* { dg-options "-O3 -fdump-ipa-cp -fno-early-inlining"  } */
+/* { dg-add-options bind_pic_locally } */
+
+extern int get_int (void);
+extern void use_stuff (int);
+
+int arr[10];
+
+inline void
+f (int a)
+{
+  arr[0] += a + 5;
+  arr[1] += a + 50;
+  arr[2] += a - 3;
+  arr[3] += a;
+  arr[4] += a + 21;
+  arr[5] += a + 900;
+  arr[6] += a + 2;
+  arr[7] += a + 3456;
+  arr[8] += a + 3;
+  arr[9] += a + 32;
+  use_stuff (a);
+}
+
+
+int
+entry (void)
+{
+  int i;
+  for (i = 0; i < 100; i++)
+    f (7);
+  for (i = 0; i < 100; i++)
+    f (get_int ());
+  return 0;
+}
+
+
+/* { dg-final { scan-ipa-dump "loc_time: 0" "cp" } } */
+/* { dg-final { scan-ipa-dump-not "replacing param.*with const" "cp"  } } */
+
+