80 lines
1.4 KiB
C
80 lines
1.4 KiB
C
/* { 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\]" } } */
|