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