2018-04-09 Richard Biener <rguenther@suse.de>
[official-gcc.git] / gcc / testsuite / gcc.dg / pr33136-3.c
blobfcb5972ebf0c9631964bfcb5ccf25e8447dfc1aa
1 /* PR tree-optimization/33136 */
2 /* { dg-do run } */
3 /* { dg-options "-O2" } */
5 extern void abort (void);
7 struct S
9 void *a;
10 int b[3];
11 double *c;
13 static double d, e;
15 static struct S s;
17 static int *
18 __attribute__((noinline, const))
19 foo (void)
21 return (int *) &s.b;
24 double *
25 __attribute__((noinline))
26 bar (double **f)
28 s.c = &d;
29 *f = &e;
30 /* As nothing ever takes the address of any double * field in struct S,
31 the write to *f can't alias with the s.c field. */
32 return s.c;
35 int
36 __attribute__((noinline))
37 baz (int *x)
39 s.b[0] = 1;
40 *x = 4;
41 /* Function foo takes address of an int array field in struct S,
42 so *x can alias with the s.b field (and it does in this testcase). */
43 return s.b[0];
46 int
47 __attribute__((noinline))
48 t (void)
50 double *f = (double *) 0;
51 return 10 * (bar (&f) != &d) + baz (foo ());
54 int
55 main (void)
57 if (t () != 4)
58 abort ();
59 return 0;