1 /* { dg-do compile } */ 2 /* { dg-options "-O2 -fno-ipa-icf" } */ 3 4 extern void do_something_usefull(); 5 /* Check that we finish compiling even if instructed to 6 flatten a cyclic callgraph. Verify we correctly 7 flatten with another function marked flatten in the 8 callgraph. */ 9 direct(void)10void __attribute__((flatten)) direct(void) 11 { 12 direct(); 13 } 14 15 16 void __attribute__((flatten)) indirect(void); indirect1(void)17static void indirect1(void) 18 { 19 indirect(); 20 } indirect(void)21void __attribute__((flatten)) indirect(void) 22 { 23 indirect1(); 24 } 25 26 27 void __attribute__((flatten)) doubleindirect(void); doubleindirect2(void)28static void doubleindirect2(void) 29 { 30 doubleindirect(); 31 do_something_usefull (); 32 } doubleindirect1(void)33static void doubleindirect1(void) 34 { 35 doubleindirect2(); 36 } doubleindirect(void)37void __attribute__((flatten)) doubleindirect(void) 38 { 39 doubleindirect1(); 40 } 41 42 43 static void subcycle1(void); subcycle2(void)44static void subcycle2(void) 45 { 46 subcycle1(); 47 do_something_usefull (); 48 } subcycle1(void)49static void subcycle1(void) 50 { 51 subcycle2(); 52 } subcycle(void)53void __attribute__((flatten)) subcycle(void) 54 { 55 subcycle1(); 56 } 57 58 59 static void doublesubcycle1(void); 60 static void doublesubcycle2(void); doublesubcycle3(void)61static void doublesubcycle3(void) 62 { 63 doublesubcycle1(); 64 do_something_usefull (); 65 } doublesubcycle2(void)66static void doublesubcycle2(void) 67 { 68 doublesubcycle3(); 69 } doublesubcycle1(void)70static void doublesubcycle1(void) 71 { 72 doublesubcycle2(); 73 } doublesubcycle(void)74void __attribute__((flatten)) doublesubcycle(void) 75 { 76 doublesubcycle1(); 77 } 78 79 /* { dg-final { scan-assembler "cycle\[123\]\[: \t\n\]" } } */ 80