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;
21 int main ()
22 {
23 recurser_void ();
24 exit (0);
25 }
26
27 void
28 recurser_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__ ((noipa))
42 track ()
43 {
44 char stackpos[1];
45
46 if (n == 0)
47 trackpoint = stackpos;
48 else if (n != 7 || trackpoint != stackpos)
49 abort ();
50 }