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)11g1 (void) 12 { 13 f (1); 14 } 15 16 /* Not a tail call. */ 17 void g2(void)18g2 (void) 19 { 20 global = f (2); 21 } 22 23 /* Not a tail call. */ 24 void g3(struct s * ptr)25g3 (struct s *ptr) 26 { 27 *ptr = f (3); 28 } 29 30 /* Tail call. */ 31 struct s g4(struct s param)32g4 (struct s param) 33 { 34 param = f (4); 35 return param; 36 } 37 38 /* Tail call. */ 39 struct s g5(void)40g5 (void) 41 { 42 struct s local = f (5); 43 return local; 44 } 45 46 /* Tail call. */ 47 struct s g6(void)48g6 (void) 49 { 50 return f (6); 51 } 52 53 /* Not a tail call. */ 54 struct s g7(void)55g7 (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)64g8 (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)73g9 (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)82g10 (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