1*404b540aSrobert! { dg-do run } 2*404b540aSrobert!$ use omp_lib 3*404b540aSrobert call test_workshare 4*404b540aSrobert 5*404b540aSrobertcontains 6*404b540aSrobert subroutine test_workshare 7*404b540aSrobert integer :: i, j, k, l, m 8*404b540aSrobert double precision, dimension (64) :: d, e 9*404b540aSrobert integer, dimension (10) :: f, g 10*404b540aSrobert integer, dimension (16, 16) :: a, b, c 11*404b540aSrobert integer, dimension (16) :: n 12*404b540aSrobert d(:) = 1 13*404b540aSrobert e = 7 14*404b540aSrobert f = 10 15*404b540aSrobert l = 256 16*404b540aSrobert m = 512 17*404b540aSrobert g(1:3) = -1 18*404b540aSrobert g(4:6) = 0 19*404b540aSrobert g(7:8) = 5 20*404b540aSrobert g(9:10) = 10 21*404b540aSrobert forall (i = 1:16, j = 1:16) a (i, j) = i * 16 + j 22*404b540aSrobert forall (j = 1:16) n (j) = j 23*404b540aSrobert!$omp parallel num_threads (4) private (j, k) 24*404b540aSrobert!$omp barrier 25*404b540aSrobert!$omp workshare 26*404b540aSrobert i = 6 27*404b540aSrobert e(:) = d(:) 28*404b540aSrobert where (g .lt. 0) 29*404b540aSrobert f = 100 30*404b540aSrobert elsewhere (g .eq. 0) 31*404b540aSrobert f = 200 + f 32*404b540aSrobert elsewhere 33*404b540aSrobert where (g .gt. 6) f = f + sum (g) 34*404b540aSrobert f = 300 + f 35*404b540aSrobert end where 36*404b540aSrobert where (f .gt. 210) g = 0 37*404b540aSrobert!$omp end workshare nowait 38*404b540aSrobert!$omp workshare 39*404b540aSrobert forall (j = 1:16, k = 1:16) b (k, j) = a (j, k) 40*404b540aSrobert forall (k = 1:16) c (k, 1:16) = a (1:16, k) 41*404b540aSrobert forall (j = 2:16, n (17 - j) / 4 * 4 .ne. n (17 - j)) 42*404b540aSrobert n (j) = n (j - 1) * n (j) 43*404b540aSrobert end forall 44*404b540aSrobert!$omp endworkshare 45*404b540aSrobert!$omp workshare 46*404b540aSrobert!$omp atomic 47*404b540aSrobert i = i + 8 + 6 48*404b540aSrobert!$omp critical 49*404b540aSrobert!$omp critical (critical_foox) 50*404b540aSrobert l = 128 51*404b540aSrobert!$omp end critical (critical_foox) 52*404b540aSrobert!$omp endcritical 53*404b540aSrobert!$omp parallel num_threads (2) 54*404b540aSrobert!$ if (omp_get_thread_num () .eq. 0) m = omp_get_num_threads () 55*404b540aSrobert!$omp atomic 56*404b540aSrobert l = 1 + l 57*404b540aSrobert!$omp end parallel 58*404b540aSrobert!$omp end workshare 59*404b540aSrobert!$omp end parallel 60*404b540aSrobert 61*404b540aSrobert if (any (f .ne. (/100, 100, 100, 210, 210, 210, 310, 310, 337, 337/))) & 62*404b540aSrobert& call abort 63*404b540aSrobert if (any (g .ne. (/-1, -1, -1, 0, 0, 0, 0, 0, 0, 0/))) call abort 64*404b540aSrobert if (i .ne. 20) call abort 65*404b540aSrobert!$ if (l .ne. 128 + m) call abort 66*404b540aSrobert if (any (d .ne. 1 .or. e .ne. 1)) call abort 67*404b540aSrobert if (any (b .ne. transpose (a))) call abort 68*404b540aSrobert if (any (c .ne. b)) call abort 69*404b540aSrobert if (any (n .ne. (/1, 2, 6, 12, 5, 30, 42, 56, 9, 90, & 70*404b540aSrobert& 110, 132, 13, 182, 210, 240/))) call abort 71*404b540aSrobert end subroutine test_workshare 72*404b540aSrobertend 73