/* { dg-do run } */ #ifndef MONOTONIC_TYPE #include #include #define MONOTONIC_TYPE int #define MONOTONIC_UNDEF -1 #define MONOTONIC_END(n) n #endif int main () { MONOTONIC_TYPE i; #pragma omp parallel { int cnt = omp_get_num_threads (); int thr = omp_get_thread_num (); MONOTONIC_TYPE l = MONOTONIC_UNDEF; int c = 0; int n = 0; #pragma omp for nowait schedule(static, 5) for (i = 0; i < MONOTONIC_END (73); i++) { if (l == MONOTONIC_UNDEF) { n = 1; c++; } else if (l == i - 1) n++; else { if (l >= i) abort (); if (cnt == 1) abort (); if (n != 5) abort (); n = 1; c++; } if (n == 1) { if ((i % 5) != 0) abort (); if ((i / 5) % cnt != thr) abort (); } l = i; } if (cnt == 1) { if (n != 73 || l != 73 - 1 || c != 1) abort (); } else if (thr > 73 / 5) { if (l != MONOTONIC_UNDEF || c != 0 || n != 0) abort (); } else if (thr == 73 / 5) { if (l != 73 - 1 || c != 1 || n != 73 % 5) abort (); } else if (c == 0) abort (); else if (l == 73 - 1) { if (thr != (73 / 5) % cnt || n != 73 % 5) abort (); } else if ((n % 5) != 0) abort (); l = MONOTONIC_UNDEF; c = 0; n = 0; #pragma omp for schedule( monotonic: static, 7) nowait for (i = 0; i < MONOTONIC_END (73); i++) { if (l == MONOTONIC_UNDEF) { n = 1; c++; } else if (l == i - 1) n++; else { if (l >= i) abort (); if (cnt == 1) abort (); if (n != 7) abort (); n = 1; c++; } if (n == 1) { if ((i % 7) != 0) abort (); if ((i / 7) % cnt != thr) abort (); } l = i; } if (cnt == 1) { if (n != 73 || l != 73 - 1 || c != 1) abort (); } else if (thr > 73 / 7) { if (l != MONOTONIC_UNDEF || c != 0 || n != 0) abort (); } else if (thr == 73 / 7) { if (l != 73 - 1 || c != 1 || n != 73 % 7) abort (); } else if (c == 0) abort (); else if (l == 73 - 1) { if (thr != (73 / 7) % cnt || n != 73 % 7) abort (); } else if ((n % 7) != 0) abort (); l = MONOTONIC_UNDEF; c = 0; n = 0; #pragma omp for nowait schedule(static) for (i = 0; i < MONOTONIC_END (73); i++) { if (l == MONOTONIC_UNDEF) { n = 1; c++; } else if (l == i - 1) n++; else abort (); l = i; } if (c > 1) abort (); l = MONOTONIC_UNDEF; c = 0; n = 0; #pragma omp for nowait schedule(monotonic,simd:static) for (i = 0; i < MONOTONIC_END (73); i++) { if (l == MONOTONIC_UNDEF) { n = 1; c++; } else if (l == i - 1) n++; else abort (); l = i; } if (c > 1) abort (); l = MONOTONIC_UNDEF; c = 0; n = 0; #pragma omp for schedule(monotonic : dynamic, 5) nowait for (i = 0; i < MONOTONIC_END (73); i++) { if (l == MONOTONIC_UNDEF) { n = 1; c++; } else if (l == i - 1) n++; else { if (l >= i) abort (); if ((n % 5) != 0 || n == 0) abort (); n = 1; c++; } l = i; } if (l == 73 - 1) { if (n % 5 != 73 % 5) abort (); } else if (l == MONOTONIC_UNDEF) { if (n != 0 || c != 0) abort (); } else if ((n % 5) != 0 || n == 0) abort (); l = MONOTONIC_UNDEF; c = 0; n = 0; #pragma omp for nowait schedule(dynamic, 7) ordered(1) for (i = 0; i < MONOTONIC_END (73); i++) { if (l == MONOTONIC_UNDEF) { n = 1; c++; } else if (l == i - 1) n++; else { if (l >= i) abort (); if ((n % 7) != 0 || n == 0) abort (); n = 1; c++; } #pragma omp ordered depend(source) if (MONOTONIC_UNDEF > 0) { #pragma omp ordered depend(sink: i) } else { #pragma omp ordered depend(sink: i - 1) } l = i; } if (l == 73 - 1) { if (n % 7 != 73 % 7) abort (); } else if (l == MONOTONIC_UNDEF) { if (n != 0 || c != 0) abort (); } else if ((n % 7) != 0 || n == 0) abort (); l = MONOTONIC_UNDEF; c = 0; n = 0; #pragma omp for schedule (monotonic :guided , 7) nowait for (i = 0; i < MONOTONIC_END (73); i++) { if (l == MONOTONIC_UNDEF) { n = 1; c++; } else if (l == i - 1) n++; else { if (l >= i) abort (); if (n < 7) abort (); n = 1; c++; } l = i; } l = MONOTONIC_UNDEF; c = 0; n = 0; #pragma omp for nowait schedule(guided, 7) ordered for (i = 0; i < MONOTONIC_END (73); i++) { if (l == MONOTONIC_UNDEF) { n = 1; c++; } else if (l == i - 1) n++; else { if (l >= i) abort (); if (n < 7) abort (); n = 1; c++; } #pragma omp ordered l = i; } } return 0; }