annotate gcc/testsuite/gcc.dg/pr84503-1.c @ 158:494b0b89df80 default tip

...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Mon, 25 May 2020 18:13:55 +0900
parents 84e7813d76e9
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
131
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
1 /* PR tree-optimization/84503 */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
2 /* { dg-do run } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
3 /* { dg-options "-O3" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
4
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
5 typedef __SIZE_TYPE__ size_t;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
6 typedef __UINTPTR_TYPE__ uintptr_t;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
7
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
8 struct S { int a; unsigned short b; int c, d, e; long f, g, h; int i, j; };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
9 static struct S *k;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
10 static size_t l = 0;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
11 int m;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
12
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
13 static int
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
14 bar (void)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
15 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
16 unsigned i;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
17 int j;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
18 if (k[0].c == 0)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
19 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
20 ++m;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
21 size_t n = l * 2;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
22 struct S *o;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
23 o = (struct S *) __builtin_realloc (k, sizeof (struct S) * n);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
24 if (!o)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
25 __builtin_exit (0);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
26 k = o;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
27 for (i = l; i < n; i++)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
28 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
29 void *p = (void *) &k[i];
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
30 int q = 0;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
31 size_t r = sizeof (struct S);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
32 if ((((uintptr_t) p) % __alignof__ (long)) == 0
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
33 && r % sizeof (long) == 0)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
34 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
35 long __attribute__ ((may_alias)) *s = (long *) p;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
36 long *t = (long *) ((char *) s + r);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
37 while (s < t)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
38 *s++ = 0;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
39 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
40 else
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
41 __builtin_memset (p, q, r);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
42 k[i].c = i + 1;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
43 k[i].a = -1;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
44 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
45 k[n - 1].c = 0;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
46 k[0].c = l;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
47 l = n;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
48 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
49 j = k[0].c;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
50 k[0].c = k[j].c;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
51 return j;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
52 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
53
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
54 int
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
55 main ()
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
56 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
57 k = (struct S *) __builtin_malloc (sizeof (struct S));
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
58 if (!k)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
59 __builtin_exit (0);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
60 __builtin_memset (k, '\0', sizeof (struct S));
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
61 k->a = -1;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
62 l = 1;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
63 for (int i = 0; i < 15; ++i)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
64 bar ();
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
65 if (m != 4)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
66 __builtin_abort ();
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
67 return 0;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
68 }