1 /* Simple check that sibling calls are performed from a 2 void non-leaf-function taking one int argument 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 (int); 18 extern void track (int); 19 main()20int main () 21 { 22 recurser_void (0); 23 exit (0); 24 } 25 26 void recurser_void(int n)27recurser_void (int n) 28 { 29 if (n == 0 || n == 7) 30 track (n); 31 32 if (n == 10) 33 return; 34 35 recurser_void (n + 1); 36 } 37 38 void *trackpoint; 39 40 void __attribute__ ((noinline)) track(int n)41track (int n) 42 { 43 char stackpos[1]; 44 45 if (n == 0) 46 trackpoint = stackpos; 47 else if (n != 7 || trackpoint != stackpos) 48 abort (); 49 } 50