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