1/* { dg-do run } */
2/* { dg-options "-O2" } */
3/* { dg-additional-options "-msse2" { target sse2_runtime } } */
4/* { dg-additional-options "-mavx" { target avx_runtime } } */
5
6extern void abort ();
7int a[1024] __attribute__((aligned (32))) = { 1 };
8int b[1024] __attribute__((aligned (32))) = { 1 };
9int k, m;
10struct U { int u; };
11struct V { int v; };
12
13__attribute__((noinline, noclone)) int
14foo (int *p)
15{
16  int i, s = 0;
17  struct U u;
18  struct V v;
19  #pragma omp simd aligned(a, p : 32) linear(k: m + 1) \
20		   linear(i) reduction(+:s) lastprivate(u, v)
21  for (i = 0; i < 1024; i++)
22    {
23      int *q = &i;
24      a[i] *= p[i];
25      u.u = p[i] + k;
26      k += m + 1;
27      v.v = p[i] + k;
28      s += p[i] + k;
29    }
30  if (u.u != 36 + 4 + 3 * 1023 || v.v != 36 + 4 + 3 * 1024 || i != 1024)
31    abort ();
32  return s;
33}
34
35__attribute__((noinline, noclone)) int
36bar (int *p)
37{
38  int i, s = 0;
39  struct U u;
40  struct V v;
41  #pragma omp simd aligned(a, p : 32) linear(k: m + 1) \
42		   reduction(+:s) lastprivate(u, v)
43  for (i = 0; i < 1024; i++)
44    {
45      int *q = &i;
46      a[i] *= p[i];
47      u.u = p[i] + k;
48      k += m + 1;
49      v.v = p[i] + k;
50      s += p[i] + k;
51    }
52  if (u.u != 36 + 4 + 3 * 1023 || v.v != 36 + 4 + 3 * 1024 || i != 1024)
53    abort ();
54  return s;
55}
56
57int
58main ()
59{
60#if __SIZEOF_INT__ >= 4
61  int i;
62  k = 4;
63  m = 2;
64  for (i = 0; i < 1024; i++)
65    {
66      a[i] = i - 512;
67      b[i] = (i - 51) % 39;
68    }
69  int s = foo (b);
70  for (i = 0; i < 1024; i++)
71    {
72      if (b[i] != (i - 51) % 39
73	  || a[i] != (i - 512) * b[i])
74	abort ();
75    }
76  if (k != 4 + 3 * 1024 || s != 1596127)
77    abort ();
78  k = 4;
79  m = 2;
80  for (i = 0; i < 1024; i++)
81    {
82      a[i] = i - 512;
83      b[i] = (i - 51) % 39;
84    }
85  s = bar (b);
86  for (i = 0; i < 1024; i++)
87    {
88      if (b[i] != (i - 51) % 39
89	  || a[i] != (i - 512) * b[i])
90	abort ();
91    }
92  if (k != 4 + 3 * 1024 || s != 1596127)
93    abort ();
94#endif
95  return 0;
96}
97