xref: /openbsd-src/gnu/gcc/libgomp/testsuite/libgomp.fortran/omp_parse4.f90 (revision 404b540a9034ac75a6199ad1a32d1bbc7a0d4210)
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