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