flatten-2.c: Disable early inlining; add comment.
authorJan Hubicka <jh@suse.cz>
Fri, 15 May 2009 15:23:06 +0000 (17:23 +0200)
committerJan Hubicka <hubicka@gcc.gnu.org>
Fri, 15 May 2009 15:23:06 +0000 (15:23 +0000)
* flatten-2.c: Disable early inlining; add comment.
* flatten-3.c: New test based on flatten-2.c.

From-SVN: r147582

gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/tree-ssa/flatten-2.c
gcc/testsuite/gcc.dg/tree-ssa/flatten-3.c [new file with mode: 0644]

index 63c8e671b8dee3967462cdf4b349e5137fc2046b..1cd470bbe7a22d1e27bdda668ea0c2e43f5ebbac 100644 (file)
@@ -1,3 +1,8 @@
+2009-05-15  Jan Hubicka  <jh@suse.cz>
+
+       * flatten-2.c: Disable early inlining; add comment.
+       * flatten-3.c: New test based on flatten-2.c.
+
 2009-05-15  Richard Guenther  <rguenther@suse.de>
 
        PR tree-optimization/39999
index 52a865dbd7ca5554d865630c04b5d9e93452e8d2..ffed23cf4546c08c6c98e3fd72d9ba21f736b4d7 100644 (file)
@@ -1,11 +1,16 @@
 /* { dg-do compile } */
-/* { dg-options -O2 } */
+/* { dg-options "-O2 -fno-early-inlining" } */
 
 extern void do_something_usefull();
 /* Check that we finish compiling even if instructed to
    flatten a cyclic callgraph.  Verify we correctly
    flatten with another function marked flatten in the
-   callgraph.  */
+   callgraph. 
+
+   Main inline is cureful about indirect calls giving
+   precedence to breaking cycle at indirect call sites.
+   Early inliner can't do similar analysis, so we need
+   to disable it if we want cycles to be broken consistently.  */
 
 void __attribute__((flatten)) direct(void)
 {
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/flatten-3.c b/gcc/testsuite/gcc.dg/tree-ssa/flatten-3.c
new file mode 100644 (file)
index 0000000..a1edb91
--- /dev/null
@@ -0,0 +1,79 @@
+/* { dg-do compile } */
+/* { dg-options -O2 } */
+
+extern void do_something_usefull();
+/* Check that we finish compiling even if instructed to
+   flatten a cyclic callgraph.  Verify we correctly
+   flatten with another function marked flatten in the
+   callgraph.  */
+
+void __attribute__((flatten)) direct(void)
+{
+  direct();
+}
+
+
+void __attribute__((flatten)) indirect(void);
+static void indirect1(void)
+{
+  indirect();
+}
+void __attribute__((flatten)) indirect(void)
+{
+  indirect1();
+}
+
+
+void __attribute__((flatten)) doubleindirect(void);
+static void doubleindirect2(void)
+{
+  doubleindirect();
+  do_something_usefull ();
+}
+static void doubleindirect1(void)
+{
+  doubleindirect2();
+}
+void __attribute__((flatten)) doubleindirect(void)
+{
+  doubleindirect1();
+}
+
+
+static void subcycle1(void);
+static void subcycle2(void)
+{
+  subcycle1();
+  do_something_usefull ();
+}
+static void subcycle1(void)
+{
+  subcycle2();
+}
+void __attribute__((flatten)) subcycle(void)
+{
+  subcycle1();
+}
+
+
+static void doublesubcycle1(void);
+static void doublesubcycle2(void);
+static void doublesubcycle3(void)
+{
+  doublesubcycle1();
+  do_something_usefull ();
+}
+static void doublesubcycle2(void)
+{
+  doublesubcycle3();
+}
+static void doublesubcycle1(void)
+{
+  doublesubcycle2();
+}
+void __attribute__((flatten)) doublesubcycle(void)
+{
+  doublesubcycle1();
+}
+
+/* { dg-final { scan-assembler "cycle\[123\]\[: \t\n\]" } } */