flatten-2.c: Disable early inlining; add comment.

* flatten-2.c: Disable early inlining; add comment.
	* flatten-3.c: New test based on flatten-2.c.

From-SVN: r147582
This commit is contained in:
Jan Hubicka 2009-05-15 17:23:06 +02:00 committed by Jan Hubicka
parent b51c6a2c92
commit febbad93b1
3 changed files with 91 additions and 2 deletions

View 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

View 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)
{

View File

@ -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\]" } } */