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