1/* PR tree-optimization/37573 */
2/* { dg-require-effective-target int32plus } */
3
4struct S
5{
6  unsigned int *a;
7  unsigned int b;
8  unsigned int c[624];
9};
10
11static unsigned char __attribute__((noinline))
12foo (struct S *s)
13{
14  unsigned int r;
15  if (!--s->b)
16    {
17      unsigned int *c = s->c;
18      unsigned int i;
19      s->a = c;
20      for (i = 0; i < 227; i++)
21	c[i] = ((((c[i] ^ c[i + 1]) & 0x7ffffffe) ^ c[i]) >> 1)
22	    ^ ((0 - (c[i + 1] & 1)) & 0x9908b0df) ^ c[i + 397];
23    }
24  r = *(s->a++);
25  r ^= (r >> 11);
26  r ^= ((r & 0xff3a58ad) << 7);
27  r ^= ((r & 0xffffdf8c) << 15);
28  r ^= (r >> 18);
29  return (unsigned char) (r >> 1);
30}
31
32static void __attribute__((noinline))
33bar (unsigned char *p, unsigned int q, unsigned int r)
34{
35  struct S s;
36  unsigned int i;
37  unsigned int *c = s.c;
38  *c = r;
39  for (i = 1; i < 624; i++)
40    c[i] = i + 0x6c078965 * ((c[i - 1] >> 30) ^ c[i - 1]);
41  s.b = 1;
42  while (q--)
43    *p++ ^= foo (&s);
44};
45
46static unsigned char p[23] = {
47  0xc0, 0x49, 0x17, 0x32, 0x62, 0x1e, 0x2e, 0xd5, 0x4c, 0x19, 0x28, 0x49,
48  0x91, 0xe4, 0x72, 0x83, 0x91, 0x3d, 0x93, 0x83, 0xb3, 0x61, 0x38
49};
50
51static unsigned char q[23] = {
52  0x3e, 0x41, 0x55, 0x54, 0x4f, 0x49, 0x54, 0x20, 0x55, 0x4e, 0x49, 0x43,
53  0x4f, 0x44, 0x45, 0x20, 0x53, 0x43, 0x52, 0x49, 0x50, 0x54, 0x3c
54};
55
56int
57main (void)
58{
59  unsigned int s;
60  s = 23;
61  bar (p, s, s + 0xa25e);
62  if (__builtin_memcmp (p, q, s) != 0)
63    __builtin_abort ();
64  return 0;
65}
66
67