111
|
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
|
|
10 void __attribute__((flatten)) direct(void)
|
|
11 {
|
|
12 direct();
|
|
13 }
|
|
14
|
|
15
|
|
16 void __attribute__((flatten)) indirect(void);
|
|
17 static void indirect1(void)
|
|
18 {
|
|
19 indirect();
|
|
20 }
|
|
21 void __attribute__((flatten)) indirect(void)
|
|
22 {
|
|
23 indirect1();
|
|
24 }
|
|
25
|
|
26
|
|
27 void __attribute__((flatten)) doubleindirect(void);
|
|
28 static void doubleindirect2(void)
|
|
29 {
|
|
30 doubleindirect();
|
|
31 do_something_usefull ();
|
|
32 }
|
|
33 static void doubleindirect1(void)
|
|
34 {
|
|
35 doubleindirect2();
|
|
36 }
|
|
37 void __attribute__((flatten)) doubleindirect(void)
|
|
38 {
|
|
39 doubleindirect1();
|
|
40 }
|
|
41
|
|
42
|
|
43 static void subcycle1(void);
|
|
44 static void subcycle2(void)
|
|
45 {
|
|
46 subcycle1();
|
|
47 do_something_usefull ();
|
|
48 }
|
|
49 static void subcycle1(void)
|
|
50 {
|
|
51 subcycle2();
|
|
52 }
|
|
53 void __attribute__((flatten)) subcycle(void)
|
|
54 {
|
|
55 subcycle1();
|
|
56 }
|
|
57
|
|
58
|
|
59 static void doublesubcycle1(void);
|
|
60 static void doublesubcycle2(void);
|
|
61 static void doublesubcycle3(void)
|
|
62 {
|
|
63 doublesubcycle1();
|
|
64 do_something_usefull ();
|
|
65 }
|
|
66 static void doublesubcycle2(void)
|
|
67 {
|
|
68 doublesubcycle3();
|
|
69 }
|
|
70 static void doublesubcycle1(void)
|
|
71 {
|
|
72 doublesubcycle2();
|
|
73 }
|
|
74 void __attribute__((flatten)) doublesubcycle(void)
|
|
75 {
|
|
76 doublesubcycle1();
|
|
77 }
|
|
78
|
|
79 /* { dg-final { scan-assembler "cycle\[123\]\[: \t\n\]" } } */
|