1 /* { dg-do run } */
2 /* { dg-options "-fno-omit-frame-pointer" } */
3 /* { dg-require-effective-target alloca } */
4
5 #define alloca __builtin_alloca
6 extern void abort (void);
7
8 __attribute__ ((noinline)) static double
bar(double a,double b,double c,double d,char * h)9 bar (double a, double b, double c, double d, char *h)
10 {
11 *h = 0;
12 return a * b + b + c;
13 }
14
15 __attribute__ ((noinline)) static int
boo(double a,double b,double c,double d)16 boo (double a, double b, double c, double d)
17 {
18 return c * b + a + b;
19 }
20
21 __attribute__ ((noinline)) static double
foo(double a,double b,double c,double d)22 foo (double a, double b, double c, double d)
23 {
24 int aa = boo (b, c, d, a);
25 return bar (a, b, c, d, (char *) alloca (aa))
26 + bar (d, c, b, a, (char *) alloca (aa));
27 }
28
main()29 int main ()
30 {
31 double a = 2.0, b = 3.0, c = 4.0, d = 5.0;
32 double r1, r2;
33 int aa;
34
35 aa = boo (b, c, d, a);
36 r1 = bar (a, b, c, d, (char *) alloca (aa))
37 + bar (d, c, b, a, (char *) alloca (aa));
38 r2 = foo (a, b, c, d);
39
40 if (r1 != r2)
41 abort ();
42 return 0;
43 }
44
45