1 /* { dg-do run } */
2 
3 #include <omp.h>
4 
5 extern void abort (void);
6 
7 #define LLONG_MAX __LONG_LONG_MAX__
8 #define ULLONG_MAX (LLONG_MAX * 2ULL + 1)
9 #define INT_MAX __INT_MAX__
10 
11 int arr[6 * 5];
12 
13 void
set(int loopidx,int idx)14 set (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 
29 int
test1(void)30 test1 (void)
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; LLONG_MAX - 10001 >= i; 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; -LLONG_MAX + 10000 <= i; 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; LLONG_MAX - 70 >= j; 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; LLONG_MAX + 70ULL <= j; 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; LLONG_MAX + 10000ULL >= j; 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; INT_MAX + 10000LL >= i; 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 
97 int
test2(void)98 test2 (void)
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; LLONG_MAX - 10001 >= i; 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; -LLONG_MAX + 10000 <= i; 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; LLONG_MAX - 70 >= j; 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; LLONG_MAX + 70ULL <= j; 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; LLONG_MAX + 10000ULL >= j; 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; INT_MAX + 10000LL >= i; 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 
165 int
test3(void)166 test3 (void)
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; LLONG_MAX - 10001 >= i; 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; -LLONG_MAX + 10000 <= i; 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; LLONG_MAX - 70 >= j; 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; LLONG_MAX + 70ULL <= j; 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; LLONG_MAX + 10000ULL >= j; 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; INT_MAX + 10000LL >= i; 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 
233 int
test4(void)234 test4 (void)
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; LLONG_MAX - 10001 >= i; 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; -LLONG_MAX + 10000 <= i; 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; LLONG_MAX - 70 >= j; 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; LLONG_MAX + 70ULL <= j; 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; LLONG_MAX + 10000ULL >= j; 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; INT_MAX + 10000LL >= i; 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 
301 int
test5(void)302 test5 (void)
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; LLONG_MAX - 10001 >= i; 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; -LLONG_MAX + 10000 <= i; 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; LLONG_MAX - 70 >= j; 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; LLONG_MAX + 70ULL <= j; 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; LLONG_MAX + 10000ULL >= j; 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; INT_MAX + 10000LL >= i; 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 
369 int
main(void)370 main (void)
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