blob: 03fb2fbd9a522c7c11da7d2dcad60d6484e36c89 [file] [log] [blame]
/* 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;
}