ipa-split.c (execute_split_functions): Split externally visible functions called...
authorJan Hubicka <jh@suse.cz>
Mon, 2 Sep 2013 20:17:10 +0000 (22:17 +0200)
committerJan Hubicka <hubicka@gcc.gnu.org>
Mon, 2 Sep 2013 20:17:10 +0000 (20:17 +0000)
* ipa-split.c (execute_split_functions): Split externally visible
functions called once.
* gcc.dg/tree-ssa/fnsplit-1.c: New testcase.

From-SVN: r202185

gcc/ChangeLog
gcc/ipa-split.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/tree-ssa/fnsplit-1.c [new file with mode: 0644]

index ab141db880ffe89da5eb3013dfdce6ea50dafaa2..359b9d844d92125277459989780e9e9567646dd1 100644 (file)
@@ -1,3 +1,8 @@
+2013-09-02  Jan Hubicka  <jh@suse.cz>
+
+       * ipa-split.c (execute_split_functions): Split externally visible
+       functions called once.
+
 2013-09-02  Martin Jambor  <mjambor@suse.cz>
 
        PR ipa/58106
index faf7c8480c96171d88f49366d9604e0586f877e9..5c3ee4fa2cebc21959d0e21120e079cf490f253c 100644 (file)
@@ -1537,7 +1537,9 @@ execute_split_functions (void)
      Note that we are not completely conservative about disqualifying functions
      called once.  It is possible that the caller is called more then once and
      then inlining would still benefit.  */
-  if ((!node->callers || !node->callers->next_caller)
+  if ((!node->callers
+       /* Local functions called once will be completely inlined most of time.  */
+       || (!node->callers->next_caller && node->local.local))
       && !node->symbol.address_taken
       && (!flag_lto || !node->symbol.externally_visible))
     {
index dd53ef667e38089424031e6fddc4ba9a8cc3816b..c01c48c22837e1e86e847914df95b3d85b27292b 100644 (file)
@@ -1,3 +1,7 @@
+2013-09-02  Jan Hubicka  <jh@suse.cz>
+
+       * gcc.dg/tree-ssa/fnsplit-1.c: New testcase.
+
 2013-09-02  Martin Jambor  <mjambor@suse.cz>
 
        PR ipa/58106
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/fnsplit-1.c b/gcc/testsuite/gcc.dg/tree-ssa/fnsplit-1.c
new file mode 100644 (file)
index 0000000..0c81d92
--- /dev/null
@@ -0,0 +1,23 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-fnsplit" } */
+#include <stdio.h>
+int a[1000];
+
+void
+t(int a)
+{
+  if (a)
+    printf ("I Am Completely Operational,"),
+    printf ("And All My Circuits Are Functioning Perfectly\n");
+}
+int
+main(void)
+{
+  int i;
+  for (i = 0; i < 1000; i++)
+    t(a[i]);
+  return 0;
+}
+/* { dg-final { scan-tree-dump-times "Splitting function at:" 1 "fnsplit"} } */
+
+/* { dg-final { cleanup-tree-dump "fnsplit" } } */