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
6static inline void
7foo (int *b, int *i, int *j, int x)
8{
9  *b = *b + x + (*i - *i) + (*j - *j);
10}
11
12int
13main ()
14{
15  int i, j, b, c = 0;
16  i = 4; j = 4; b = 7;
17  #pragma omp simd linear(b:2) reduction(+:c)
18  for (i = 0; i < 64; i++)
19    {
20      c = c + (b != 7 + 2 * i);
21      foo (&b, &i, &j, 2);
22    }
23  if (c || i != 64 || b != 7 + 64 * 2)
24    __builtin_abort ();
25  i = 4; j = 4; b = 7;
26  #pragma omp simd linear(b:3) reduction(+:c)
27  for (i = 0; i < 64; i += 4)
28    {
29      c = c + (b != 7 + i / 4 * 3);
30      foo (&b, &i, &j, 3);
31    }
32  if (c || i != 64 || b != 7 + 16 * 3)
33    __builtin_abort ();
34  i = 4; j = 4; b = 7;
35  #pragma omp simd linear(i) linear(b:2) reduction(+:c)
36  for (i = 0; i < 64; i++)
37    {
38      c = c + (b != 7 + 2 * i);
39      foo (&b, &i, &j, 2);
40    }
41  if (c || i != 64 || b != 7 + 64 * 2)
42    __builtin_abort ();
43  i = 4; j = 4; b = 7;
44  #pragma omp simd linear(i:4) linear(b:3) reduction(+:c)
45  for (i = 0; i < 64; i += 4)
46    {
47      c = c + (b != 7 + i / 4 * 3);
48      foo (&b, &i, &j, 3);
49    }
50  if (c || i != 64 || b != 7 + 16 * 3)
51    __builtin_abort ();
52  i = 4; j = 4; b = 7;
53  #pragma omp simd collapse (2) linear(b:2) reduction(+:c)
54  for (i = 0; i < 8; i++)
55    for (j = 0; j < 8; j++)
56      {
57	c = c + (b != 7 + 2 * j + 2 * 8 * i);
58	foo (&b, &i, &j, 2);
59      }
60  if (c || i != 8 || j != 8 || b != 7 + 64 * 2)
61    __builtin_abort ();
62  i = 4; j = 4; b = 7;
63  #pragma omp simd collapse (2) lastprivate (i, j) linear(b:2) reduction(+:c)
64  for (i = 0; i < 8; i++)
65    for (j = 0; j < 8; j++)
66      {
67	c = c + (b != 7 + 2 * j + 2 * 8 * i);
68	foo (&b, &i, &j, 2);
69      }
70  if (c || i != 8 || j != 8 || b != 7 + 64 * 2)
71    __builtin_abort ();
72  i = 4; j = 4; b = 7;
73  #pragma omp parallel for simd schedule (static, 4) linear(b:2) reduction(+:c)
74  for (i = 0; i < 64; i++)
75    {
76      c = c + (b != 7 + 2 * i);
77      foo (&b, &i, &j, 2);
78    }
79  if (c || i != 64 || b != 7 + 64 * 2)
80    __builtin_abort ();
81  i = 4; j = 4; b = 7;
82  #pragma omp parallel for simd schedule (static, 4) linear(b:3) reduction(+:c)
83  for (i = 0; i < 64; i += 4)
84    {
85      c = c + (b != 7 + i / 4 * 3);
86      foo (&b, &i, &j, 3);
87    }
88  if (c || i != 64 || b != 7 + 16 * 3)
89    __builtin_abort ();
90  i = 4; j = 4; b = 7;
91  #pragma omp parallel for simd schedule (static, 4) linear(i) linear(b:2) reduction(+:c)
92  for (i = 0; i < 64; i++)
93    {
94      c = c + (b != 7 + 2 * i);
95      foo (&b, &i, &j, 2);
96    }
97  if (c || i != 64 || b != 7 + 64 * 2)
98    __builtin_abort ();
99  i = 4; j = 4; b = 7;
100  #pragma omp parallel for simd schedule (static, 4) linear(i:4) linear(b:3) reduction(+:c)
101  for (i = 0; i < 64; i += 4)
102    {
103      c = c + (b != 7 + i / 4 * 3);
104      foo (&b, &i, &j, 3);
105    }
106  if (c || i != 64 || b != 7 + 16 * 3)
107    __builtin_abort ();
108  i = 4; j = 4; b = 7;
109  #pragma omp parallel for simd lastprivate (i, j) collapse (2) schedule (static, 4) linear(b:2) reduction(+:c)
110  for (i = 0; i < 8; i++)
111    for (j = 0; j < 8; j++)
112      {
113	c = c + (b != 7 + 2 * j + 2 * 8 * i);
114	foo (&b, &i, &j, 2);
115      }
116  if (c || i != 8 || j != 8 || b != 7 + 64 * 2)
117    __builtin_abort ();
118  i = 4; j = 4; b = 7;
119  #pragma omp parallel for simd collapse (2) schedule (static, 4) linear(b:2) reduction(+:c)
120  for (i = 0; i < 8; i++)
121    for (j = 0; j < 8; j++)
122      {
123	c = c + (b != 7 + 2 * j + 2 * 8 * i);
124	foo (&b, &i, &j, 2);
125      }
126  if (c || i != 8 || j != 8 || b != 7 + 64 * 2)
127    __builtin_abort ();
128  return 0;
129}
130