|  | // { dg-do run } | 
|  |  | 
|  | #include <omp.h> | 
|  |  | 
|  | extern "C" void abort (); | 
|  |  | 
|  | #define LLONG_MAX __LONG_LONG_MAX__ | 
|  | #define ULLONG_MAX (LLONG_MAX * 2ULL + 1) | 
|  | #define INT_MAX __INT_MAX__ | 
|  |  | 
|  | int arr[6 * 5]; | 
|  |  | 
|  | void | 
|  | set (int loopidx, int idx) | 
|  | { | 
|  | #pragma omp atomic | 
|  | arr[loopidx * 5 + idx]++; | 
|  | } | 
|  |  | 
|  | #define check(var, val, loopidx, idx) \ | 
|  | if (var == (val)) set (loopidx, idx); else | 
|  | #define test(loopidx, count) \ | 
|  | for (idx = 0; idx < 5; idx++) \ | 
|  | if (arr[loopidx * 5 + idx] != idx < count) \ | 
|  | abort (); \ | 
|  | else \ | 
|  | arr[loopidx * 5 + idx] = 0 | 
|  |  | 
|  | int | 
|  | test1 () | 
|  | { | 
|  | int e = 0, idx; | 
|  |  | 
|  | #pragma omp parallel reduction(+:e) | 
|  | { | 
|  | long long i; | 
|  | unsigned long long j; | 
|  | #pragma omp for schedule(dynamic,1) nowait | 
|  | for (i = LLONG_MAX - 30001; LLONG_MAX - 10001 >= i; i += 10000) | 
|  | { | 
|  | check (i, LLONG_MAX - 30001, 0, 0) | 
|  | check (i, LLONG_MAX - 20001, 0, 1) | 
|  | check (i, LLONG_MAX - 10001, 0, 2) | 
|  | e = 1; | 
|  | } | 
|  | #pragma omp for schedule(dynamic,1) nowait | 
|  | for (i = -LLONG_MAX + 30000; -LLONG_MAX + 10000 <= i; i -= 10000) | 
|  | { | 
|  | check (i, -LLONG_MAX + 30000, 1, 0) | 
|  | check (i, -LLONG_MAX + 20000, 1, 1) | 
|  | check (i, -LLONG_MAX + 10000, 1, 2) | 
|  | e = 1; | 
|  | } | 
|  | #pragma omp for schedule(dynamic,1) nowait | 
|  | for (j = 20; LLONG_MAX - 70 >= j; j += LLONG_MAX + 50ULL) | 
|  | { | 
|  | check (j, 20, 2, 0) | 
|  | e = 1; | 
|  | } | 
|  | #pragma omp for schedule(dynamic,1) nowait | 
|  | for (j = ULLONG_MAX - 3; LLONG_MAX + 70ULL <= j; j -= LLONG_MAX + 50ULL) | 
|  | { | 
|  | check (j, ULLONG_MAX - 3, 3, 0) | 
|  | e = 1; | 
|  | } | 
|  | #pragma omp for schedule(dynamic,1) nowait | 
|  | for (j = LLONG_MAX - 20000ULL; LLONG_MAX + 10000ULL >= j; j += 10000ULL) | 
|  | { | 
|  | check (j, LLONG_MAX - 20000ULL, 4, 0) | 
|  | check (j, LLONG_MAX - 10000ULL, 4, 1) | 
|  | check (j, LLONG_MAX, 4, 2) | 
|  | check (j, LLONG_MAX + 10000ULL, 4, 3) | 
|  | e = 1; | 
|  | } | 
|  | #pragma omp for schedule(dynamic,1) nowait | 
|  | for (i = -3LL * INT_MAX - 20000LL; INT_MAX + 10000LL >= i; i += INT_MAX + 200LL) | 
|  | { | 
|  | check (i, -3LL * INT_MAX - 20000LL, 5, 0) | 
|  | check (i, -2LL * INT_MAX - 20000LL + 200LL, 5, 1) | 
|  | check (i, -INT_MAX - 20000LL + 400LL, 5, 2) | 
|  | check (i, -20000LL + 600LL, 5, 3) | 
|  | check (i, INT_MAX - 20000LL + 800LL, 5, 4) | 
|  | e = 1; | 
|  | } | 
|  | } | 
|  | if (e) | 
|  | abort (); | 
|  | test (0, 3); | 
|  | test (1, 3); | 
|  | test (2, 1); | 
|  | test (3, 1); | 
|  | test (4, 4); | 
|  | test (5, 5); | 
|  | return 0; | 
|  | } | 
|  |  | 
|  | int | 
|  | test2 () | 
|  | { | 
|  | int e = 0, idx; | 
|  |  | 
|  | #pragma omp parallel reduction(+:e) | 
|  | { | 
|  | long long i; | 
|  | unsigned long long j; | 
|  | #pragma omp for schedule(guided,1) nowait | 
|  | for (i = LLONG_MAX - 30001; LLONG_MAX - 10001 >= i; i += 10000) | 
|  | { | 
|  | check (i, LLONG_MAX - 30001, 0, 0) | 
|  | check (i, LLONG_MAX - 20001, 0, 1) | 
|  | check (i, LLONG_MAX - 10001, 0, 2) | 
|  | e = 1; | 
|  | } | 
|  | #pragma omp for schedule(guided,1) nowait | 
|  | for (i = -LLONG_MAX + 30000; -LLONG_MAX + 10000 <= i; i -= 10000) | 
|  | { | 
|  | check (i, -LLONG_MAX + 30000, 1, 0) | 
|  | check (i, -LLONG_MAX + 20000, 1, 1) | 
|  | check (i, -LLONG_MAX + 10000, 1, 2) | 
|  | e = 1; | 
|  | } | 
|  | #pragma omp for schedule(guided,1) nowait | 
|  | for (j = 20; LLONG_MAX - 70 >= j; j += LLONG_MAX + 50ULL) | 
|  | { | 
|  | check (j, 20, 2, 0) | 
|  | e = 1; | 
|  | } | 
|  | #pragma omp for schedule(guided,1) nowait | 
|  | for (j = ULLONG_MAX - 3; LLONG_MAX + 70ULL <= j; j -= LLONG_MAX + 50ULL) | 
|  | { | 
|  | check (j, ULLONG_MAX - 3, 3, 0) | 
|  | e = 1; | 
|  | } | 
|  | #pragma omp for schedule(guided,1) nowait | 
|  | for (j = LLONG_MAX - 20000ULL; LLONG_MAX + 10000ULL >= j; j += 10000ULL) | 
|  | { | 
|  | check (j, LLONG_MAX - 20000ULL, 4, 0) | 
|  | check (j, LLONG_MAX - 10000ULL, 4, 1) | 
|  | check (j, LLONG_MAX, 4, 2) | 
|  | check (j, LLONG_MAX + 10000ULL, 4, 3) | 
|  | e = 1; | 
|  | } | 
|  | #pragma omp for schedule(guided,1) nowait | 
|  | for (i = -3LL * INT_MAX - 20000LL; INT_MAX + 10000LL >= i; i += INT_MAX + 200LL) | 
|  | { | 
|  | check (i, -3LL * INT_MAX - 20000LL, 5, 0) | 
|  | check (i, -2LL * INT_MAX - 20000LL + 200LL, 5, 1) | 
|  | check (i, -INT_MAX - 20000LL + 400LL, 5, 2) | 
|  | check (i, -20000LL + 600LL, 5, 3) | 
|  | check (i, INT_MAX - 20000LL + 800LL, 5, 4) | 
|  | e = 1; | 
|  | } | 
|  | } | 
|  | if (e) | 
|  | abort (); | 
|  | test (0, 3); | 
|  | test (1, 3); | 
|  | test (2, 1); | 
|  | test (3, 1); | 
|  | test (4, 4); | 
|  | test (5, 5); | 
|  | return 0; | 
|  | } | 
|  |  | 
|  | int | 
|  | test3 () | 
|  | { | 
|  | int e = 0, idx; | 
|  |  | 
|  | #pragma omp parallel reduction(+:e) | 
|  | { | 
|  | long long i; | 
|  | unsigned long long j; | 
|  | #pragma omp for schedule(static) nowait | 
|  | for (i = LLONG_MAX - 30001; LLONG_MAX - 10001 >= i; i += 10000) | 
|  | { | 
|  | check (i, LLONG_MAX - 30001, 0, 0) | 
|  | check (i, LLONG_MAX - 20001, 0, 1) | 
|  | check (i, LLONG_MAX - 10001, 0, 2) | 
|  | e = 1; | 
|  | } | 
|  | #pragma omp for schedule(static) nowait | 
|  | for (i = -LLONG_MAX + 30000; -LLONG_MAX + 10000 <= i; i -= 10000) | 
|  | { | 
|  | check (i, -LLONG_MAX + 30000, 1, 0) | 
|  | check (i, -LLONG_MAX + 20000, 1, 1) | 
|  | check (i, -LLONG_MAX + 10000, 1, 2) | 
|  | e = 1; | 
|  | } | 
|  | #pragma omp for schedule(static) nowait | 
|  | for (j = 20; LLONG_MAX - 70 >= j; j += LLONG_MAX + 50ULL) | 
|  | { | 
|  | check (j, 20, 2, 0) | 
|  | e = 1; | 
|  | } | 
|  | #pragma omp for schedule(static) nowait | 
|  | for (j = ULLONG_MAX - 3; LLONG_MAX + 70ULL <= j; j -= LLONG_MAX + 50ULL) | 
|  | { | 
|  | check (j, ULLONG_MAX - 3, 3, 0) | 
|  | e = 1; | 
|  | } | 
|  | #pragma omp for schedule(static) nowait | 
|  | for (j = LLONG_MAX - 20000ULL; LLONG_MAX + 10000ULL >= j; j += 10000ULL) | 
|  | { | 
|  | check (j, LLONG_MAX - 20000ULL, 4, 0) | 
|  | check (j, LLONG_MAX - 10000ULL, 4, 1) | 
|  | check (j, LLONG_MAX, 4, 2) | 
|  | check (j, LLONG_MAX + 10000ULL, 4, 3) | 
|  | e = 1; | 
|  | } | 
|  | #pragma omp for schedule(static) nowait | 
|  | for (i = -3LL * INT_MAX - 20000LL; INT_MAX + 10000LL >= i; i += INT_MAX + 200LL) | 
|  | { | 
|  | check (i, -3LL * INT_MAX - 20000LL, 5, 0) | 
|  | check (i, -2LL * INT_MAX - 20000LL + 200LL, 5, 1) | 
|  | check (i, -INT_MAX - 20000LL + 400LL, 5, 2) | 
|  | check (i, -20000LL + 600LL, 5, 3) | 
|  | check (i, INT_MAX - 20000LL + 800LL, 5, 4) | 
|  | e = 1; | 
|  | } | 
|  | } | 
|  | if (e) | 
|  | abort (); | 
|  | test (0, 3); | 
|  | test (1, 3); | 
|  | test (2, 1); | 
|  | test (3, 1); | 
|  | test (4, 4); | 
|  | test (5, 5); | 
|  | return 0; | 
|  | } | 
|  |  | 
|  | int | 
|  | test4 () | 
|  | { | 
|  | int e = 0, idx; | 
|  |  | 
|  | #pragma omp parallel reduction(+:e) | 
|  | { | 
|  | long long i; | 
|  | unsigned long long j; | 
|  | #pragma omp for schedule(static,1) nowait | 
|  | for (i = LLONG_MAX - 30001; LLONG_MAX - 10001 >= i; i += 10000) | 
|  | { | 
|  | check (i, LLONG_MAX - 30001, 0, 0) | 
|  | check (i, LLONG_MAX - 20001, 0, 1) | 
|  | check (i, LLONG_MAX - 10001, 0, 2) | 
|  | e = 1; | 
|  | } | 
|  | #pragma omp for schedule(static,1) nowait | 
|  | for (i = -LLONG_MAX + 30000; -LLONG_MAX + 10000 <= i; i -= 10000) | 
|  | { | 
|  | check (i, -LLONG_MAX + 30000, 1, 0) | 
|  | check (i, -LLONG_MAX + 20000, 1, 1) | 
|  | check (i, -LLONG_MAX + 10000, 1, 2) | 
|  | e = 1; | 
|  | } | 
|  | #pragma omp for schedule(static,1) nowait | 
|  | for (j = 20; LLONG_MAX - 70 >= j; j += LLONG_MAX + 50ULL) | 
|  | { | 
|  | check (j, 20, 2, 0) | 
|  | e = 1; | 
|  | } | 
|  | #pragma omp for schedule(static,1) nowait | 
|  | for (j = ULLONG_MAX - 3; LLONG_MAX + 70ULL <= j; j -= LLONG_MAX + 50ULL) | 
|  | { | 
|  | check (j, ULLONG_MAX - 3, 3, 0) | 
|  | e = 1; | 
|  | } | 
|  | #pragma omp for schedule(static,1) nowait | 
|  | for (j = LLONG_MAX - 20000ULL; LLONG_MAX + 10000ULL >= j; j += 10000ULL) | 
|  | { | 
|  | check (j, LLONG_MAX - 20000ULL, 4, 0) | 
|  | check (j, LLONG_MAX - 10000ULL, 4, 1) | 
|  | check (j, LLONG_MAX, 4, 2) | 
|  | check (j, LLONG_MAX + 10000ULL, 4, 3) | 
|  | e = 1; | 
|  | } | 
|  | #pragma omp for schedule(static,1) nowait | 
|  | for (i = -3LL * INT_MAX - 20000LL; INT_MAX + 10000LL >= i; i += INT_MAX + 200LL) | 
|  | { | 
|  | check (i, -3LL * INT_MAX - 20000LL, 5, 0) | 
|  | check (i, -2LL * INT_MAX - 20000LL + 200LL, 5, 1) | 
|  | check (i, -INT_MAX - 20000LL + 400LL, 5, 2) | 
|  | check (i, -20000LL + 600LL, 5, 3) | 
|  | check (i, INT_MAX - 20000LL + 800LL, 5, 4) | 
|  | e = 1; | 
|  | } | 
|  | } | 
|  | if (e) | 
|  | abort (); | 
|  | test (0, 3); | 
|  | test (1, 3); | 
|  | test (2, 1); | 
|  | test (3, 1); | 
|  | test (4, 4); | 
|  | test (5, 5); | 
|  | return 0; | 
|  | } | 
|  |  | 
|  | int | 
|  | test5 () | 
|  | { | 
|  | int e = 0, idx; | 
|  |  | 
|  | #pragma omp parallel reduction(+:e) | 
|  | { | 
|  | long long i; | 
|  | unsigned long long j; | 
|  | #pragma omp for schedule(runtime) nowait | 
|  | for (i = LLONG_MAX - 30001; LLONG_MAX - 10001 >= i; i += 10000) | 
|  | { | 
|  | check (i, LLONG_MAX - 30001, 0, 0) | 
|  | check (i, LLONG_MAX - 20001, 0, 1) | 
|  | check (i, LLONG_MAX - 10001, 0, 2) | 
|  | e = 1; | 
|  | } | 
|  | #pragma omp for schedule(runtime) nowait | 
|  | for (i = -LLONG_MAX + 30000; -LLONG_MAX + 10000 <= i; i -= 10000) | 
|  | { | 
|  | check (i, -LLONG_MAX + 30000, 1, 0) | 
|  | check (i, -LLONG_MAX + 20000, 1, 1) | 
|  | check (i, -LLONG_MAX + 10000, 1, 2) | 
|  | e = 1; | 
|  | } | 
|  | #pragma omp for schedule(runtime) nowait | 
|  | for (j = 20; LLONG_MAX - 70 >= j; j += LLONG_MAX + 50ULL) | 
|  | { | 
|  | check (j, 20, 2, 0) | 
|  | e = 1; | 
|  | } | 
|  | #pragma omp for schedule(runtime) nowait | 
|  | for (j = ULLONG_MAX - 3; LLONG_MAX + 70ULL <= j; j -= LLONG_MAX + 50ULL) | 
|  | { | 
|  | check (j, ULLONG_MAX - 3, 3, 0) | 
|  | e = 1; | 
|  | } | 
|  | #pragma omp for schedule(runtime) nowait | 
|  | for (j = LLONG_MAX - 20000ULL; LLONG_MAX + 10000ULL >= j; j += 10000ULL) | 
|  | { | 
|  | check (j, LLONG_MAX - 20000ULL, 4, 0) | 
|  | check (j, LLONG_MAX - 10000ULL, 4, 1) | 
|  | check (j, LLONG_MAX, 4, 2) | 
|  | check (j, LLONG_MAX + 10000ULL, 4, 3) | 
|  | e = 1; | 
|  | } | 
|  | #pragma omp for schedule(runtime) nowait | 
|  | for (i = -3LL * INT_MAX - 20000LL; INT_MAX + 10000LL >= i; i += INT_MAX + 200LL) | 
|  | { | 
|  | check (i, -3LL * INT_MAX - 20000LL, 5, 0) | 
|  | check (i, -2LL * INT_MAX - 20000LL + 200LL, 5, 1) | 
|  | check (i, -INT_MAX - 20000LL + 400LL, 5, 2) | 
|  | check (i, -20000LL + 600LL, 5, 3) | 
|  | check (i, INT_MAX - 20000LL + 800LL, 5, 4) | 
|  | e = 1; | 
|  | } | 
|  | } | 
|  | if (e) | 
|  | abort (); | 
|  | test (0, 3); | 
|  | test (1, 3); | 
|  | test (2, 1); | 
|  | test (3, 1); | 
|  | test (4, 4); | 
|  | test (5, 5); | 
|  | return 0; | 
|  | } | 
|  |  | 
|  | int | 
|  | main () | 
|  | { | 
|  | if (2 * sizeof (int) != sizeof (long long)) | 
|  | return 0; | 
|  | test1 (); | 
|  | test2 (); | 
|  | test3 (); | 
|  | test4 (); | 
|  | omp_set_schedule (omp_sched_static, 0); | 
|  | test5 (); | 
|  | omp_set_schedule (omp_sched_static, 3); | 
|  | test5 (); | 
|  | omp_set_schedule (omp_sched_dynamic, 5); | 
|  | test5 (); | 
|  | omp_set_schedule (omp_sched_guided, 2); | 
|  | test5 (); | 
|  | return 0; | 
|  | } |