1// { dg-do run }
2
3#include <omp.h>
4
5extern "C" void abort ();
6
7#define LLONG_MAX __LONG_LONG_MAX__
8#define ULLONG_MAX (LLONG_MAX * 2ULL + 1)
9#define INT_MAX __INT_MAX__
10
11int arr[6 * 5];
12
13void
14set (int loopidx, int idx)
15{
16#pragma omp atomic
17  arr[loopidx * 5 + idx]++;
18}
19
20#define check(var, val, loopidx, idx) \
21  if (var == (val)) set (loopidx, idx); else
22#define test(loopidx, count) \
23  for (idx = 0; idx < 5; idx++) \
24    if (arr[loopidx * 5 + idx] != idx < count) \
25      abort (); \
26    else \
27      arr[loopidx * 5 + idx] = 0
28
29int
30test1 ()
31{
32  int e = 0, idx;
33
34#pragma omp parallel reduction(+:e)
35  {
36    long long i;
37    unsigned long long j;
38    #pragma omp for schedule(dynamic,1) nowait
39    for (i = LLONG_MAX - 30001; i <= LLONG_MAX - 10001; i += 10000)
40      {
41	check (i, LLONG_MAX - 30001, 0, 0)
42	check (i, LLONG_MAX - 20001, 0, 1)
43	check (i, LLONG_MAX - 10001, 0, 2)
44	e = 1;
45      }
46    #pragma omp for schedule(dynamic,1) nowait
47    for (i = -LLONG_MAX + 30000; i >= -LLONG_MAX + 10000; i -= 10000)
48      {
49	check (i, -LLONG_MAX + 30000, 1, 0)
50	check (i, -LLONG_MAX + 20000, 1, 1)
51	check (i, -LLONG_MAX + 10000, 1, 2)
52	e = 1;
53      }
54    #pragma omp for schedule(dynamic,1) nowait
55    for (j = 20; j <= LLONG_MAX - 70; j += LLONG_MAX + 50ULL)
56      {
57	check (j, 20, 2, 0)
58	e = 1;
59      }
60    #pragma omp for schedule(dynamic,1) nowait
61    for (j = ULLONG_MAX - 3; j >= LLONG_MAX + 70ULL; j -= LLONG_MAX + 50ULL)
62      {
63	check (j, ULLONG_MAX - 3, 3, 0)
64	e = 1;
65      }
66    #pragma omp for schedule(dynamic,1) nowait
67    for (j = LLONG_MAX - 20000ULL; j <= LLONG_MAX + 10000ULL; j += 10000ULL)
68      {
69	check (j, LLONG_MAX - 20000ULL, 4, 0)
70	check (j, LLONG_MAX - 10000ULL, 4, 1)
71	check (j, LLONG_MAX, 4, 2)
72	check (j, LLONG_MAX + 10000ULL, 4, 3)
73	e = 1;
74      }
75    #pragma omp for schedule(dynamic,1) nowait
76    for (i = -3LL * INT_MAX - 20000LL; i <= INT_MAX + 10000LL; i += INT_MAX + 200LL)
77      {
78	check (i, -3LL * INT_MAX - 20000LL, 5, 0)
79	check (i, -2LL * INT_MAX - 20000LL + 200LL, 5, 1)
80	check (i, -INT_MAX - 20000LL + 400LL, 5, 2)
81	check (i, -20000LL + 600LL, 5, 3)
82	check (i, INT_MAX - 20000LL + 800LL, 5, 4)
83	e = 1;
84      }
85  }
86  if (e)
87    abort ();
88  test (0, 3);
89  test (1, 3);
90  test (2, 1);
91  test (3, 1);
92  test (4, 4);
93  test (5, 5);
94  return 0;
95}
96
97int
98test2 ()
99{
100  int e = 0, idx;
101
102#pragma omp parallel reduction(+:e)
103  {
104    long long i;
105    unsigned long long j;
106    #pragma omp for schedule(guided,1) nowait
107    for (i = LLONG_MAX - 30001; i <= LLONG_MAX - 10001; i += 10000)
108      {
109	check (i, LLONG_MAX - 30001, 0, 0)
110	check (i, LLONG_MAX - 20001, 0, 1)
111	check (i, LLONG_MAX - 10001, 0, 2)
112	e = 1;
113      }
114    #pragma omp for schedule(guided,1) nowait
115    for (i = -LLONG_MAX + 30000; i >= -LLONG_MAX + 10000; i -= 10000)
116      {
117	check (i, -LLONG_MAX + 30000, 1, 0)
118	check (i, -LLONG_MAX + 20000, 1, 1)
119	check (i, -LLONG_MAX + 10000, 1, 2)
120	e = 1;
121      }
122    #pragma omp for schedule(guided,1) nowait
123    for (j = 20; j <= LLONG_MAX - 70; j += LLONG_MAX + 50ULL)
124      {
125	check (j, 20, 2, 0)
126	e = 1;
127      }
128    #pragma omp for schedule(guided,1) nowait
129    for (j = ULLONG_MAX - 3; j >= LLONG_MAX + 70ULL; j -= LLONG_MAX + 50ULL)
130      {
131	check (j, ULLONG_MAX - 3, 3, 0)
132	e = 1;
133      }
134    #pragma omp for schedule(guided,1) nowait
135    for (j = LLONG_MAX - 20000ULL; j <= LLONG_MAX + 10000ULL; j += 10000ULL)
136      {
137	check (j, LLONG_MAX - 20000ULL, 4, 0)
138	check (j, LLONG_MAX - 10000ULL, 4, 1)
139	check (j, LLONG_MAX, 4, 2)
140	check (j, LLONG_MAX + 10000ULL, 4, 3)
141	e = 1;
142      }
143    #pragma omp for schedule(guided,1) nowait
144    for (i = -3LL * INT_MAX - 20000LL; i <= INT_MAX + 10000LL; i += INT_MAX + 200LL)
145      {
146	check (i, -3LL * INT_MAX - 20000LL, 5, 0)
147	check (i, -2LL * INT_MAX - 20000LL + 200LL, 5, 1)
148	check (i, -INT_MAX - 20000LL + 400LL, 5, 2)
149	check (i, -20000LL + 600LL, 5, 3)
150	check (i, INT_MAX - 20000LL + 800LL, 5, 4)
151	e = 1;
152      }
153  }
154  if (e)
155    abort ();
156  test (0, 3);
157  test (1, 3);
158  test (2, 1);
159  test (3, 1);
160  test (4, 4);
161  test (5, 5);
162  return 0;
163}
164
165int
166test3 ()
167{
168  int e = 0, idx;
169
170#pragma omp parallel reduction(+:e)
171  {
172    long long i;
173    unsigned long long j;
174    #pragma omp for schedule(static) nowait
175    for (i = LLONG_MAX - 30001; i <= LLONG_MAX - 10001; i += 10000)
176      {
177	check (i, LLONG_MAX - 30001, 0, 0)
178	check (i, LLONG_MAX - 20001, 0, 1)
179	check (i, LLONG_MAX - 10001, 0, 2)
180	e = 1;
181      }
182    #pragma omp for schedule(static) nowait
183    for (i = -LLONG_MAX + 30000; i >= -LLONG_MAX + 10000; i -= 10000)
184      {
185	check (i, -LLONG_MAX + 30000, 1, 0)
186	check (i, -LLONG_MAX + 20000, 1, 1)
187	check (i, -LLONG_MAX + 10000, 1, 2)
188	e = 1;
189      }
190    #pragma omp for schedule(static) nowait
191    for (j = 20; j <= LLONG_MAX - 70; j += LLONG_MAX + 50ULL)
192      {
193	check (j, 20, 2, 0)
194	e = 1;
195      }
196    #pragma omp for schedule(static) nowait
197    for (j = ULLONG_MAX - 3; j >= LLONG_MAX + 70ULL; j -= LLONG_MAX + 50ULL)
198      {
199	check (j, ULLONG_MAX - 3, 3, 0)
200	e = 1;
201      }
202    #pragma omp for schedule(static) nowait
203    for (j = LLONG_MAX - 20000ULL; j <= LLONG_MAX + 10000ULL; j += 10000ULL)
204      {
205	check (j, LLONG_MAX - 20000ULL, 4, 0)
206	check (j, LLONG_MAX - 10000ULL, 4, 1)
207	check (j, LLONG_MAX, 4, 2)
208	check (j, LLONG_MAX + 10000ULL, 4, 3)
209	e = 1;
210      }
211    #pragma omp for schedule(static) nowait
212    for (i = -3LL * INT_MAX - 20000LL; i <= INT_MAX + 10000LL; i += INT_MAX + 200LL)
213      {
214	check (i, -3LL * INT_MAX - 20000LL, 5, 0)
215	check (i, -2LL * INT_MAX - 20000LL + 200LL, 5, 1)
216	check (i, -INT_MAX - 20000LL + 400LL, 5, 2)
217	check (i, -20000LL + 600LL, 5, 3)
218	check (i, INT_MAX - 20000LL + 800LL, 5, 4)
219	e = 1;
220      }
221  }
222  if (e)
223    abort ();
224  test (0, 3);
225  test (1, 3);
226  test (2, 1);
227  test (3, 1);
228  test (4, 4);
229  test (5, 5);
230  return 0;
231}
232
233int
234test4 ()
235{
236  int e = 0, idx;
237
238#pragma omp parallel reduction(+:e)
239  {
240    long long i;
241    unsigned long long j;
242    #pragma omp for schedule(static,1) nowait
243    for (i = LLONG_MAX - 30001; i <= LLONG_MAX - 10001; i += 10000)
244      {
245	check (i, LLONG_MAX - 30001, 0, 0)
246	check (i, LLONG_MAX - 20001, 0, 1)
247	check (i, LLONG_MAX - 10001, 0, 2)
248	e = 1;
249      }
250    #pragma omp for schedule(static,1) nowait
251    for (i = -LLONG_MAX + 30000; i >= -LLONG_MAX + 10000; i -= 10000)
252      {
253	check (i, -LLONG_MAX + 30000, 1, 0)
254	check (i, -LLONG_MAX + 20000, 1, 1)
255	check (i, -LLONG_MAX + 10000, 1, 2)
256	e = 1;
257      }
258    #pragma omp for schedule(static,1) nowait
259    for (j = 20; j <= LLONG_MAX - 70; j += LLONG_MAX + 50ULL)
260      {
261	check (j, 20, 2, 0)
262	e = 1;
263      }
264    #pragma omp for schedule(static,1) nowait
265    for (j = ULLONG_MAX - 3; j >= LLONG_MAX + 70ULL; j -= LLONG_MAX + 50ULL)
266      {
267	check (j, ULLONG_MAX - 3, 3, 0)
268	e = 1;
269      }
270    #pragma omp for schedule(static,1) nowait
271    for (j = LLONG_MAX - 20000ULL; j <= LLONG_MAX + 10000ULL; j += 10000ULL)
272      {
273	check (j, LLONG_MAX - 20000ULL, 4, 0)
274	check (j, LLONG_MAX - 10000ULL, 4, 1)
275	check (j, LLONG_MAX, 4, 2)
276	check (j, LLONG_MAX + 10000ULL, 4, 3)
277	e = 1;
278      }
279    #pragma omp for schedule(static,1) nowait
280    for (i = -3LL * INT_MAX - 20000LL; i <= INT_MAX + 10000LL; i += INT_MAX + 200LL)
281      {
282	check (i, -3LL * INT_MAX - 20000LL, 5, 0)
283	check (i, -2LL * INT_MAX - 20000LL + 200LL, 5, 1)
284	check (i, -INT_MAX - 20000LL + 400LL, 5, 2)
285	check (i, -20000LL + 600LL, 5, 3)
286	check (i, INT_MAX - 20000LL + 800LL, 5, 4)
287	e = 1;
288      }
289  }
290  if (e)
291    abort ();
292  test (0, 3);
293  test (1, 3);
294  test (2, 1);
295  test (3, 1);
296  test (4, 4);
297  test (5, 5);
298  return 0;
299}
300
301int
302test5 ()
303{
304  int e = 0, idx;
305
306#pragma omp parallel reduction(+:e)
307  {
308    long long i;
309    unsigned long long j;
310    #pragma omp for schedule(runtime) nowait
311    for (i = LLONG_MAX - 30001; i <= LLONG_MAX - 10001; i += 10000)
312      {
313	check (i, LLONG_MAX - 30001, 0, 0)
314	check (i, LLONG_MAX - 20001, 0, 1)
315	check (i, LLONG_MAX - 10001, 0, 2)
316	e = 1;
317      }
318    #pragma omp for schedule(runtime) nowait
319    for (i = -LLONG_MAX + 30000; i >= -LLONG_MAX + 10000; i -= 10000)
320      {
321	check (i, -LLONG_MAX + 30000, 1, 0)
322	check (i, -LLONG_MAX + 20000, 1, 1)
323	check (i, -LLONG_MAX + 10000, 1, 2)
324	e = 1;
325      }
326    #pragma omp for schedule(runtime) nowait
327    for (j = 20; j <= LLONG_MAX - 70; j += LLONG_MAX + 50ULL)
328      {
329	check (j, 20, 2, 0)
330	e = 1;
331      }
332    #pragma omp for schedule(runtime) nowait
333    for (j = ULLONG_MAX - 3; j >= LLONG_MAX + 70ULL; j -= LLONG_MAX + 50ULL)
334      {
335	check (j, ULLONG_MAX - 3, 3, 0)
336	e = 1;
337      }
338    #pragma omp for schedule(runtime) nowait
339    for (j = LLONG_MAX - 20000ULL; j <= LLONG_MAX + 10000ULL; j += 10000ULL)
340      {
341	check (j, LLONG_MAX - 20000ULL, 4, 0)
342	check (j, LLONG_MAX - 10000ULL, 4, 1)
343	check (j, LLONG_MAX, 4, 2)
344	check (j, LLONG_MAX + 10000ULL, 4, 3)
345	e = 1;
346      }
347    #pragma omp for schedule(runtime) nowait
348    for (i = -3LL * INT_MAX - 20000LL; i <= INT_MAX + 10000LL; i += INT_MAX + 200LL)
349      {
350	check (i, -3LL * INT_MAX - 20000LL, 5, 0)
351	check (i, -2LL * INT_MAX - 20000LL + 200LL, 5, 1)
352	check (i, -INT_MAX - 20000LL + 400LL, 5, 2)
353	check (i, -20000LL + 600LL, 5, 3)
354	check (i, INT_MAX - 20000LL + 800LL, 5, 4)
355	e = 1;
356      }
357  }
358  if (e)
359    abort ();
360  test (0, 3);
361  test (1, 3);
362  test (2, 1);
363  test (3, 1);
364  test (4, 4);
365  test (5, 5);
366  return 0;
367}
368
369int
370main ()
371{
372  if (2 * sizeof (int) != sizeof (long long))
373    return 0;
374  test1 ();
375  test2 ();
376  test3 ();
377  test4 ();
378  omp_set_schedule (omp_sched_static, 0);
379  test5 ();
380  omp_set_schedule (omp_sched_static, 3);
381  test5 ();
382  omp_set_schedule (omp_sched_dynamic, 5);
383  test5 ();
384  omp_set_schedule (omp_sched_guided, 2);
385  test5 ();
386  return 0;
387}
388