1 /* Simple check that sibling calls are performed from a 2 void non-leaf-function taking no arguments calling itself. 3 4 Copyright (C) 2002 Free Software Foundation Inc. 5 Contributed by Hans-Peter Nilsson <hp@bitrange.com> */ 6 7 /* { dg-do run } */ 8 /* { dg-options "-O2 -foptimize-sibling-calls" } */ 9 10 /* The option -foptimize-sibling-calls is the default, but serves as 11 marker. Self-recursion tail calls are optimized for all targets, 12 regardless of presence of sibcall patterns. */ 13 14 extern void abort (void); 15 extern void exit (int); 16 17 extern void recurser_void (void); 18 extern void track (void); 19 20 int n = 0; main()21int main () 22 { 23 recurser_void (); 24 exit (0); 25 } 26 27 void recurser_void(void)28recurser_void (void) 29 { 30 if (n == 0 || n == 7) 31 track (); 32 33 if (n == 10) 34 return; 35 n++; 36 recurser_void (); 37 } 38 39 void *trackpoint; 40 41 void __attribute__ ((noinline)) track()42track () 43 { 44 char stackpos[1]; 45 46 if (n == 0) 47 trackpoint = stackpos; 48 else if (n != 7 || trackpoint != stackpos) 49 abort (); 50 } 51