| /* PR tree-optimization/84503 */ |
| /* { dg-do run } */ |
| /* { dg-options "-O3" } */ |
| |
| typedef __SIZE_TYPE__ size_t; |
| typedef __UINTPTR_TYPE__ uintptr_t; |
| |
| struct S { int a; unsigned short b; int c, d, e; long f, g, h; int i, j; }; |
| static struct S *k; |
| static size_t l = 0; |
| int m; |
| |
| static int |
| bar (void) |
| { |
| unsigned i; |
| int j; |
| if (k[0].c == 0) |
| { |
| ++m; |
| size_t n = l * 2; |
| struct S *o; |
| o = (struct S *) __builtin_realloc (k, sizeof (struct S) * n); |
| if (!o) |
| __builtin_exit (0); |
| k = o; |
| for (i = l; i < n; i++) |
| { |
| void *p = (void *) &k[i]; |
| int q = 0; |
| size_t r = sizeof (struct S); |
| if ((((uintptr_t) p) % __alignof__ (long)) == 0 |
| && r % sizeof (long) == 0) |
| { |
| long __attribute__ ((may_alias)) *s = (long *) p; |
| long *t = (long *) ((char *) s + r); |
| while (s < t) |
| *s++ = 0; |
| } |
| else |
| __builtin_memset (p, q, r); |
| k[i].c = i + 1; |
| k[i].a = -1; |
| } |
| k[n - 1].c = 0; |
| k[0].c = l; |
| l = n; |
| } |
| j = k[0].c; |
| k[0].c = k[j].c; |
| return j; |
| } |
| |
| int |
| main () |
| { |
| k = (struct S *) __builtin_malloc (sizeof (struct S)); |
| if (!k) |
| __builtin_exit (0); |
| __builtin_memset (k, '\0', sizeof (struct S)); |
| k->a = -1; |
| l = 1; |
| for (int i = 0; i < 15; ++i) |
| bar (); |
| if (m != 4) |
| __builtin_abort (); |
| return 0; |
| } |