1*404b540aSrobert /* PR middle-end/25261 */ 2*404b540aSrobert /* { dg-do run } */ 3*404b540aSrobert 4*404b540aSrobert #include <omp.h> 5*404b540aSrobert 6*404b540aSrobert extern void abort (void); 7*404b540aSrobert 8*404b540aSrobert int main(void)9*404b540aSrobertmain (void) 10*404b540aSrobert { 11*404b540aSrobert int i = 5, j, l = 0; 12*404b540aSrobert int foo (void) 13*404b540aSrobert { 14*404b540aSrobert return i == 6; 15*404b540aSrobert } 16*404b540aSrobert int bar (void) 17*404b540aSrobert { 18*404b540aSrobert return i - 3; 19*404b540aSrobert } 20*404b540aSrobert 21*404b540aSrobert omp_set_dynamic (0); 22*404b540aSrobert 23*404b540aSrobert #pragma omp parallel if (foo ()) num_threads (2) 24*404b540aSrobert if (omp_get_num_threads () != 1) 25*404b540aSrobert #pragma omp atomic 26*404b540aSrobert l++; 27*404b540aSrobert 28*404b540aSrobert #pragma omp parallel for schedule (static, bar ()) num_threads (2) \ 29*404b540aSrobert reduction (|:l) 30*404b540aSrobert for (j = 0; j < 4; j++) 31*404b540aSrobert if (omp_get_thread_num () != (j >= 2)) 32*404b540aSrobert #pragma omp atomic 33*404b540aSrobert l++; 34*404b540aSrobert 35*404b540aSrobert i++; 36*404b540aSrobert 37*404b540aSrobert #pragma omp parallel if (foo ()) num_threads (2) 38*404b540aSrobert if (omp_get_num_threads () != 2) 39*404b540aSrobert #pragma omp atomic 40*404b540aSrobert l++; 41*404b540aSrobert 42*404b540aSrobert #pragma omp parallel for schedule (static, bar ()) num_threads (2) \ 43*404b540aSrobert reduction (|:l) 44*404b540aSrobert for (j = 0; j < 6; j++) 45*404b540aSrobert if (omp_get_thread_num () != (j >= 3)) 46*404b540aSrobert #pragma omp atomic 47*404b540aSrobert l++; 48*404b540aSrobert 49*404b540aSrobert #pragma omp parallel num_threads (4) reduction (|:l) 50*404b540aSrobert if (!foo () || bar () != 3) 51*404b540aSrobert #pragma omp atomic 52*404b540aSrobert l++; 53*404b540aSrobert 54*404b540aSrobert i++; 55*404b540aSrobert 56*404b540aSrobert #pragma omp parallel num_threads (4) reduction (|:l) 57*404b540aSrobert if (foo () || bar () != 4) 58*404b540aSrobert #pragma omp atomic 59*404b540aSrobert l++; 60*404b540aSrobert 61*404b540aSrobert if (l) 62*404b540aSrobert abort (); 63*404b540aSrobert 64*404b540aSrobert return 0; 65*404b540aSrobert } 66