1#include <omp.h>
2#include <stdlib.h>
3#include <string.h>
4
5int
6test1 ()
7{
8  short int buf[64], *p;
9  int i;
10  memset (buf, '\0', sizeof (buf));
11#pragma omp parallel for
12  for (p = &buf[10]; &buf[54] > p; p++)
13    *p = 5;
14  for (i = 0; i < 64; i++)
15    if (buf[i] != 5 * (i >= 10 && i < 54))
16      abort ();
17  memset (buf, '\0', sizeof (buf));
18#pragma omp parallel for
19  for (p = &buf[3]; &buf[63] >= p; p += 2)
20    p[-2] = 6;
21  for (i = 0; i < 64; i++)
22    if (buf[i] != 6 * ((i & 1) && i <= 61))
23      abort ();
24  memset (buf, '\0', sizeof (buf));
25#pragma omp parallel for
26  for (p = &buf[16]; &buf[51] > p; p = 4 + p)
27    p[2] = 7;
28  for (i = 0; i < 64; i++)
29    if (buf[i] != 7 * ((i & 3) == 2 && i >= 18 && i < 53))
30      abort ();
31  memset (buf, '\0', sizeof (buf));
32#pragma omp parallel for
33  for (p = &buf[16]; &buf[40] >= p; p = p + 4ULL)
34    p[2] = -7;
35  for (i = 0; i < 64; i++)
36    if (buf[i] != -7 * ((i & 3) == 2 && i >= 18 && i <= 42))
37      abort ();
38  memset (buf, '\0', sizeof (buf));
39#pragma omp parallel for
40  for (p = &buf[53]; &buf[9] < p; --p)
41    *p = 5;
42  for (i = 0; i < 64; i++)
43    if (buf[i] != 5 * (i >= 10 && i < 54))
44      abort ();
45  memset (buf, '\0', sizeof (buf));
46#pragma omp parallel for
47  for (p = &buf[63]; &buf[3] <= p; p -= 2)
48    p[-2] = 6;
49  for (i = 0; i < 64; i++)
50    if (buf[i] != 6 * ((i & 1) && i <= 61))
51      abort ();
52  memset (buf, '\0', sizeof (buf));
53#pragma omp parallel for
54  for (p = &buf[48]; &buf[15] < p; p = -4 + p)
55    p[2] = 7;
56  for (i = 0; i < 64; i++)
57    if (buf[i] != 7 * ((i & 3) == 2 && i >= 18 && i < 53))
58      abort ();
59  memset (buf, '\0', sizeof (buf));
60#pragma omp parallel for
61  for (p = &buf[40]; &buf[16] <= p; p = p - 4ULL)
62    p[2] = -7;
63  for (i = 0; i < 64; i++)
64    if (buf[i] != -7 * ((i & 3) == 2 && i >= 18 && i <= 42))
65      abort ();
66  return 0;
67}
68
69int
70test2 ()
71{
72  int buf[64], *p;
73  int i;
74  memset (buf, '\0', sizeof (buf));
75#pragma omp parallel for schedule (static, 3)
76  for (p = &buf[10]; &buf[54] > p; p++)
77    *p = 5;
78  for (i = 0; i < 64; i++)
79    if (buf[i] != 5 * (i >= 10 && i < 54))
80      abort ();
81  memset (buf, '\0', sizeof (buf));
82#pragma omp parallel for schedule (static, 3)
83  for (p = &buf[3]; &buf[63] >= p; p += 2)
84    p[-2] = 6;
85  for (i = 0; i < 64; i++)
86    if (buf[i] != 6 * ((i & 1) && i <= 61))
87      abort ();
88  memset (buf, '\0', sizeof (buf));
89#pragma omp parallel for schedule (static, 3)
90  for (p = &buf[16]; &buf[51] > p; p = 4 + p)
91    p[2] = 7;
92  for (i = 0; i < 64; i++)
93    if (buf[i] != 7 * ((i & 3) == 2 && i >= 18 && i < 53))
94      abort ();
95  memset (buf, '\0', sizeof (buf));
96#pragma omp parallel for schedule (static, 3)
97  for (p = &buf[16]; &buf[40] >= p; p = p + 4ULL)
98    p[2] = -7;
99  for (i = 0; i < 64; i++)
100    if (buf[i] != -7 * ((i & 3) == 2 && i >= 18 && i <= 42))
101      abort ();
102  memset (buf, '\0', sizeof (buf));
103#pragma omp parallel for schedule (static, 3)
104  for (p = &buf[53]; &buf[9] < p; --p)
105    *p = 5;
106  for (i = 0; i < 64; i++)
107    if (buf[i] != 5 * (i >= 10 && i < 54))
108      abort ();
109  memset (buf, '\0', sizeof (buf));
110#pragma omp parallel for schedule (static, 3)
111  for (p = &buf[63]; &buf[3] <= p; p -= 2)
112    p[-2] = 6;
113  for (i = 0; i < 64; i++)
114    if (buf[i] != 6 * ((i & 1) && i <= 61))
115      abort ();
116  memset (buf, '\0', sizeof (buf));
117#pragma omp parallel for schedule (static, 3)
118  for (p = &buf[48]; &buf[15] < p; p = -4 + p)
119    p[2] = 7;
120  for (i = 0; i < 64; i++)
121    if (buf[i] != 7 * ((i & 3) == 2 && i >= 18 && i < 53))
122      abort ();
123  memset (buf, '\0', sizeof (buf));
124#pragma omp parallel for schedule (static, 3)
125  for (p = &buf[40]; &buf[16] <= p; p = p - 4ULL)
126    p[2] = -7;
127  for (i = 0; i < 64; i++)
128    if (buf[i] != -7 * ((i & 3) == 2 && i >= 18 && i <= 42))
129      abort ();
130  return 0;
131}
132
133int
134test3 ()
135{
136  int buf[64], *p;
137  int i;
138  memset (buf, '\0', sizeof (buf));
139#pragma omp parallel for schedule (dynamic, 3)
140  for (p = &buf[10]; &buf[54] > p; p++)
141    *p = 5;
142  for (i = 0; i < 64; i++)
143    if (buf[i] != 5 * (i >= 10 && i < 54))
144      abort ();
145  memset (buf, '\0', sizeof (buf));
146#pragma omp parallel for schedule (dynamic, 3)
147  for (p = &buf[3]; &buf[63] >= p; p += 2)
148    p[-2] = 6;
149  for (i = 0; i < 64; i++)
150    if (buf[i] != 6 * ((i & 1) && i <= 61))
151      abort ();
152  memset (buf, '\0', sizeof (buf));
153#pragma omp parallel for schedule (dynamic, 3)
154  for (p = &buf[16]; &buf[51] > p; p = 4 + p)
155    p[2] = 7;
156  for (i = 0; i < 64; i++)
157    if (buf[i] != 7 * ((i & 3) == 2 && i >= 18 && i < 53))
158      abort ();
159  memset (buf, '\0', sizeof (buf));
160#pragma omp parallel for schedule (dynamic, 3)
161  for (p = &buf[16]; &buf[40] >= p; p = p + 4ULL)
162    p[2] = -7;
163  for (i = 0; i < 64; i++)
164    if (buf[i] != -7 * ((i & 3) == 2 && i >= 18 && i <= 42))
165      abort ();
166  memset (buf, '\0', sizeof (buf));
167#pragma omp parallel for schedule (dynamic, 3)
168  for (p = &buf[53]; &buf[9] < p; --p)
169    *p = 5;
170  for (i = 0; i < 64; i++)
171    if (buf[i] != 5 * (i >= 10 && i < 54))
172      abort ();
173  memset (buf, '\0', sizeof (buf));
174#pragma omp parallel for schedule (dynamic, 3)
175  for (p = &buf[63]; &buf[3] <= p; p -= 2)
176    p[-2] = 6;
177  for (i = 0; i < 64; i++)
178    if (buf[i] != 6 * ((i & 1) && i <= 61))
179      abort ();
180  memset (buf, '\0', sizeof (buf));
181#pragma omp parallel for schedule (dynamic, 3)
182  for (p = &buf[48]; &buf[15] < p; p = -4 + p)
183    p[2] = 7;
184  for (i = 0; i < 64; i++)
185    if (buf[i] != 7 * ((i & 3) == 2 && i >= 18 && i < 53))
186      abort ();
187  memset (buf, '\0', sizeof (buf));
188#pragma omp parallel for schedule (dynamic, 3)
189  for (p = &buf[40]; &buf[16] <= p; p = p - 4ULL)
190    p[2] = -7;
191  for (i = 0; i < 64; i++)
192    if (buf[i] != -7 * ((i & 3) == 2 && i >= 18 && i <= 42))
193      abort ();
194  return 0;
195}
196
197int
198test4 ()
199{
200  int buf[64], *p;
201  int i;
202  memset (buf, '\0', sizeof (buf));
203#pragma omp parallel for schedule (runtime)
204  for (p = &buf[10]; &buf[54] > p; p++)
205    *p = 5;
206  for (i = 0; i < 64; i++)
207    if (buf[i] != 5 * (i >= 10 && i < 54))
208      abort ();
209  memset (buf, '\0', sizeof (buf));
210#pragma omp parallel for schedule (runtime)
211  for (p = &buf[3]; &buf[63] >= p; p += 2)
212    p[-2] = 6;
213  for (i = 0; i < 64; i++)
214    if (buf[i] != 6 * ((i & 1) && i <= 61))
215      abort ();
216  memset (buf, '\0', sizeof (buf));
217#pragma omp parallel for schedule (runtime)
218  for (p = &buf[16]; &buf[51] > p; p = 4 + p)
219    p[2] = 7;
220  for (i = 0; i < 64; i++)
221    if (buf[i] != 7 * ((i & 3) == 2 && i >= 18 && i < 53))
222      abort ();
223  memset (buf, '\0', sizeof (buf));
224#pragma omp parallel for schedule (runtime)
225  for (p = &buf[16]; &buf[40] >= p; p = p + 4ULL)
226    p[2] = -7;
227  for (i = 0; i < 64; i++)
228    if (buf[i] != -7 * ((i & 3) == 2 && i >= 18 && i <= 42))
229      abort ();
230  memset (buf, '\0', sizeof (buf));
231#pragma omp parallel for schedule (runtime)
232  for (p = &buf[53]; &buf[9] < p; --p)
233    *p = 5;
234  for (i = 0; i < 64; i++)
235    if (buf[i] != 5 * (i >= 10 && i < 54))
236      abort ();
237  memset (buf, '\0', sizeof (buf));
238#pragma omp parallel for schedule (runtime)
239  for (p = &buf[63]; &buf[3] <= p; p -= 2)
240    p[-2] = 6;
241  for (i = 0; i < 64; i++)
242    if (buf[i] != 6 * ((i & 1) && i <= 61))
243      abort ();
244  memset (buf, '\0', sizeof (buf));
245#pragma omp parallel for schedule (runtime)
246  for (p = &buf[48]; &buf[15] < p; p = -4 + p)
247    p[2] = 7;
248  for (i = 0; i < 64; i++)
249    if (buf[i] != 7 * ((i & 3) == 2 && i >= 18 && i < 53))
250      abort ();
251  memset (buf, '\0', sizeof (buf));
252#pragma omp parallel for schedule (runtime)
253  for (p = &buf[40]; &buf[16] <= p; p = p - 4ULL)
254    p[2] = -7;
255  for (i = 0; i < 64; i++)
256    if (buf[i] != -7 * ((i & 3) == 2 && i >= 18 && i <= 42))
257      abort ();
258  return 0;
259}
260
261int
262main ()
263{
264  test1 ();
265  test2 ();
266  test3 ();
267  omp_set_schedule (omp_sched_static, 0);
268  test4 ();
269  omp_set_schedule (omp_sched_static, 3);
270  test4 ();
271  omp_set_schedule (omp_sched_dynamic, 5);
272  test4 ();
273  omp_set_schedule (omp_sched_guided, 2);
274  test4 ();
275  return 0;
276}
277