1 /* { dg-do compile } */ 2 /* { dg-options "-O2 -fno-early-inlining" } */ 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 10 Main inline is cureful about indirect calls giving 11 precedence to breaking cycle at indirect call sites. 12 Early inliner can't do similar analysis, so we need 13 to disable it if we want cycles to be broken consistently. */ 14 direct(void)15void __attribute__((flatten)) direct(void) 16 { 17 direct(); 18 } 19 20 21 void __attribute__((flatten)) indirect(void); indirect1(void)22static void indirect1(void) 23 { 24 indirect(); 25 } indirect(void)26void __attribute__((flatten)) indirect(void) 27 { 28 indirect1(); 29 } 30 31 32 void __attribute__((flatten)) doubleindirect(void); doubleindirect2(void)33static void doubleindirect2(void) 34 { 35 doubleindirect(); 36 do_something_usefull (); 37 } doubleindirect1(void)38static void doubleindirect1(void) 39 { 40 doubleindirect2(); 41 } doubleindirect(void)42void __attribute__((flatten)) doubleindirect(void) 43 { 44 doubleindirect1(); 45 } 46 47 48 static void subcycle1(void); subcycle2(void)49static void subcycle2(void) 50 { 51 subcycle1(); 52 do_something_usefull (); 53 } subcycle1(void)54static void subcycle1(void) 55 { 56 subcycle2(); 57 } subcycle(void)58void __attribute__((flatten)) subcycle(void) 59 { 60 subcycle1(); 61 } 62 63 64 static void doublesubcycle1(void); 65 static void doublesubcycle2(void); doublesubcycle3(void)66static void doublesubcycle3(void) 67 { 68 doublesubcycle1(); 69 do_something_usefull (); 70 } doublesubcycle2(void)71static void doublesubcycle2(void) 72 { 73 doublesubcycle3(); 74 } doublesubcycle1(void)75static void doublesubcycle1(void) 76 { 77 doublesubcycle2(); 78 } doublesubcycle(void)79void __attribute__((flatten)) doublesubcycle(void) 80 { 81 doublesubcycle1(); 82 } 83 84 /* { dg-final { scan-assembler "cycle\[123\]\[: \t\n\]" } } */ 85 /* { dg-final { scan-assembler-not "indirect\[12\]\[: \t\n\]" } } */ 86