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 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 30 test1 (void) 31 { 32 int e = 0, idx; 33 34 #pragma omp parallel reduction(+:e) 35 { Marshal(v interface{})36 long long i; Unmarshal(data []byte, v interface{})37 unsigned long long j; String()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) MarshalTo(data []byte)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 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 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 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 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 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