1 /* { dg-do compile { target trampolines } } */
2 /* { dg-options "-O2 -fdump-tree-tailc-details" } */
3 
4 struct s { int x; };
5 struct s f (int);
6 struct s global;
7 void callit (void (*) (void));
8 
9 /* Tail call.  */
10 void
g1(void)11 g1 (void)
12 {
13   f (1);
14 }
15 
16 /* Not a tail call.  */
17 void
g2(void)18 g2 (void)
19 {
20   global = f (2);
21 }
22 
23 /* Not a tail call.  */
24 void
g3(struct s * ptr)25 g3 (struct s *ptr)
26 {
27   *ptr = f (3);
28 }
29 
30 /* Tail call.  */
31 struct s
g4(struct s param)32 g4 (struct s param)
33 {
34   param = f (4);
35   return param;
36 }
37 
38 /* Tail call.  */
39 struct s
g5(void)40 g5 (void)
41 {
42   struct s local = f (5);
43   return local;
44 }
45 
46 /* Tail call.  */
47 struct s
g6(void)48 g6 (void)
49 {
50   return f (6);
51 }
52 
53 /* Not a tail call.  */
54 struct s
g7(void)55 g7 (void)
56 {
57   struct s local = f (7);
58   global = local;
59   return local;
60 }
61 
62 /* Not a tail call.  */
63 struct s
g8(struct s * ptr)64 g8 (struct s *ptr)
65 {
66   struct s local = f (8);
67   *ptr = local;
68   return local;
69 }
70 
71 /* Not a tail call.  */
72 int
g9(struct s param)73 g9 (struct s param)
74 {
75   void inner (void) { param = f (9); }
76   callit (inner);
77   return 9;
78 }
79 
80 /* Tail call.  */
81 int
g10(int param)82 g10 (int param)
83 {
84   void inner (void) { f (param); }
85   callit (inner);
86   return 10;
87 }
88 
89 /* { dg-final { scan-tree-dump-times "Found tail call" 5 "tailc" } } */
90