xref: /openbsd-src/gnu/gcc/libgomp/testsuite/libgomp.fortran/omp_parse1.f90 (revision 404b540a9034ac75a6199ad1a32d1bbc7a0d4210)
1*404b540aSrobert! { dg-do run }
2*404b540aSrobertuse omp_lib
3*404b540aSrobert  call test_parallel
4*404b540aSrobert  call test_do
5*404b540aSrobert  call test_sections
6*404b540aSrobert  call test_single
7*404b540aSrobert
8*404b540aSrobertcontains
9*404b540aSrobert  subroutine test_parallel
10*404b540aSrobert    integer :: a, b, c, e, f, g, i, j
11*404b540aSrobert    integer, dimension (20) :: d
12*404b540aSrobert    logical :: h
13*404b540aSrobert    a = 6
14*404b540aSrobert    b = 8
15*404b540aSrobert    c = 11
16*404b540aSrobert    d(:) = -1
17*404b540aSrobert    e = 13
18*404b540aSrobert    f = 24
19*404b540aSrobert    g = 27
20*404b540aSrobert    h = .false.
21*404b540aSrobert    i = 1
22*404b540aSrobert    j = 16
23*404b540aSrobert!$omp para&
24*404b540aSrobert!$omp&llel &
25*404b540aSrobert!$omp if (a .eq. 6) private (b, c) shared (d) private (e) &
26*404b540aSrobert  !$omp firstprivate(f) num_threads (a - 1) first&
27*404b540aSrobert!$ompprivate(g)default (shared) reduction (.or. : h) &
28*404b540aSrobert!$omp reduction(*:i)
29*404b540aSrobert    if (i .ne. 1) h = .true.
30*404b540aSrobert    i = 2
31*404b540aSrobert    if (f .ne. 24) h = .true.
32*404b540aSrobert    if (g .ne. 27) h = .true.
33*404b540aSrobert    e = 7
34*404b540aSrobert    b = omp_get_thread_num ()
35*404b540aSrobert    if (b .eq. 0) j = 24
36*404b540aSrobert    f = b
37*404b540aSrobert    g = f
38*404b540aSrobert    c = omp_get_num_threads ()
39*404b540aSrobert    if (c .gt. a - 1 .or. c .le. 0) h = .true.
40*404b540aSrobert    if (b .ge. c) h = .true.
41*404b540aSrobert    d(b + 1) = c
42*404b540aSrobert    if (f .ne. g .or. f .ne. b) h = .true.
43*404b540aSrobert!$omp endparallel
44*404b540aSrobert    if (h) call abort
45*404b540aSrobert    if (a .ne. 6) call abort
46*404b540aSrobert    if (j .ne. 24) call abort
47*404b540aSrobert    if (d(1) .eq. -1) call abort
48*404b540aSrobert    e = 1
49*404b540aSrobert    do g = 1, d(1)
50*404b540aSrobert      if (d(g) .ne. d(1)) call abort
51*404b540aSrobert      e = e * 2
52*404b540aSrobert    end do
53*404b540aSrobert    if (e .ne. i) call abort
54*404b540aSrobert  end subroutine test_parallel
55*404b540aSrobert
56*404b540aSrobert  subroutine test_do_orphan
57*404b540aSrobert    integer :: k, l
58*404b540aSrobert!$omp parallel do private (l)
59*404b540aSrobert    do 600 k = 1, 16, 2
60*404b540aSrobert600   l = k
61*404b540aSrobert  end subroutine test_do_orphan
62*404b540aSrobert
63*404b540aSrobert  subroutine test_do
64*404b540aSrobert    integer :: i, j, k, l, n
65*404b540aSrobert    integer, dimension (64) :: d
66*404b540aSrobert    logical :: m
67*404b540aSrobert
68*404b540aSrobert    j = 16
69*404b540aSrobert    d(:) = -1
70*404b540aSrobert    m = .true.
71*404b540aSrobert    n = 24
72*404b540aSrobert!$omp parallel num_threads (4) shared (i, k, d) private (l) &
73*404b540aSrobert!$omp&reduction (.and. : m)
74*404b540aSrobert    if (omp_get_thread_num () .eq. 0) then
75*404b540aSrobert      k = omp_get_num_threads ()
76*404b540aSrobert    end if
77*404b540aSrobert    call test_do_orphan
78*404b540aSrobert!$omp do schedule (static) firstprivate (n)
79*404b540aSrobert    do 200 i = 1, j
80*404b540aSrobert      if (i .eq. 1 .and. n .ne. 24) call abort
81*404b540aSrobert      n = i
82*404b540aSrobert200   d(n) = omp_get_thread_num ()
83*404b540aSrobert!$omp enddo nowait
84*404b540aSrobert
85*404b540aSrobert!$omp do lastprivate (i) schedule (static, 5)
86*404b540aSrobert    do 201 i = j + 1, 2 * j
87*404b540aSrobert201   d(i) = omp_get_thread_num () + 1024
88*404b540aSrobert    ! Implied omp end do here
89*404b540aSrobert
90*404b540aSrobert    if (i .ne. 33) m = .false.
91*404b540aSrobert
92*404b540aSrobert!$omp do private (j) schedule (dynamic)
93*404b540aSrobert    do i = 33, 48
94*404b540aSrobert      d(i) = omp_get_thread_num () + 2048
95*404b540aSrobert    end do
96*404b540aSrobert!$omp end do nowait
97*404b540aSrobert
98*404b540aSrobert!$omp do schedule (runtime)
99*404b540aSrobert    do i = 49, 4 * j
100*404b540aSrobert      d(i) = omp_get_thread_num () + 4096
101*404b540aSrobert    end do
102*404b540aSrobert    ! Implied omp end do here
103*404b540aSrobert!$omp end parallel
104*404b540aSrobert    if (.not. m) call abort
105*404b540aSrobert
106*404b540aSrobert    j = 0
107*404b540aSrobert    do i = 1, 64
108*404b540aSrobert      if (d(i) .lt. j .or. d(i) .ge. j + k) call abort
109*404b540aSrobert      if (i .eq. 16) j = 1024
110*404b540aSrobert      if (i .eq. 32) j = 2048
111*404b540aSrobert      if (i .eq. 48) j = 4096
112*404b540aSrobert    end do
113*404b540aSrobert  end subroutine test_do
114*404b540aSrobert
115*404b540aSrobert  subroutine test_sections
116*404b540aSrobert    integer :: i, j, k, l, m, n
117*404b540aSrobert    i = 9
118*404b540aSrobert    j = 10
119*404b540aSrobert    k = 11
120*404b540aSrobert    l = 0
121*404b540aSrobert    m = 0
122*404b540aSrobert    n = 30
123*404b540aSrobert    call omp_set_dynamic (.false.)
124*404b540aSrobert    call omp_set_num_threads (4)
125*404b540aSrobert!$omp parallel num_threads (4)
126*404b540aSrobert!$omp sections private (i) firstprivate (j, k) lastprivate (j) &
127*404b540aSrobert!$omp& reduction (+ : l, m)
128*404b540aSrobert!$omp section
129*404b540aSrobert    i = 24
130*404b540aSrobert    if (j .ne. 10 .or. k .ne. 11 .or. m .ne. 0) l = 1
131*404b540aSrobert    m = m + 4
132*404b540aSrobert!$omp section
133*404b540aSrobert    i = 25
134*404b540aSrobert    if (j .ne. 10 .or. k .ne. 11) l = 1
135*404b540aSrobert    m = m + 6
136*404b540aSrobert!$omp section
137*404b540aSrobert    i = 26
138*404b540aSrobert    if (j .ne. 10 .or. k .ne. 11) l = 1
139*404b540aSrobert    m = m + 8
140*404b540aSrobert!$omp section
141*404b540aSrobert    i = 27
142*404b540aSrobert    if (j .ne. 10 .or. k .ne. 11) l = 1
143*404b540aSrobert    m = m + 10
144*404b540aSrobert    j = 271
145*404b540aSrobert!$omp end sections nowait
146*404b540aSrobert!$omp sections lastprivate (n)
147*404b540aSrobert!$omp section
148*404b540aSrobert    n = 6
149*404b540aSrobert!$omp section
150*404b540aSrobert    n = 7
151*404b540aSrobert!$omp endsections
152*404b540aSrobert!$omp end parallel
153*404b540aSrobert    if (j .ne. 271 .or. l .ne. 0) call abort
154*404b540aSrobert    if (m .ne. 4 + 6 + 8 + 10) call abort
155*404b540aSrobert    if (n .ne. 7) call abort
156*404b540aSrobert  end subroutine test_sections
157*404b540aSrobert
158*404b540aSrobert  subroutine test_single
159*404b540aSrobert    integer :: i, j, k, l
160*404b540aSrobert    logical :: m
161*404b540aSrobert    i = 200
162*404b540aSrobert    j = 300
163*404b540aSrobert    k = 400
164*404b540aSrobert    l = 500
165*404b540aSrobert    m = .false.
166*404b540aSrobert!$omp parallel num_threads (4), private (i, j), reduction (.or. : m)
167*404b540aSrobert    i = omp_get_thread_num ()
168*404b540aSrobert    j = omp_get_thread_num ()
169*404b540aSrobert!$omp single private (k)
170*404b540aSrobert    k = 64
171*404b540aSrobert!$omp end single nowait
172*404b540aSrobert!$omp single private (k) firstprivate (l)
173*404b540aSrobert    if (i .ne. omp_get_thread_num () .or. i .ne. j) then
174*404b540aSrobert      j = -1
175*404b540aSrobert    else
176*404b540aSrobert      j = -2
177*404b540aSrobert    end if
178*404b540aSrobert    if (l .ne. 500) j = -1
179*404b540aSrobert    l = 265
180*404b540aSrobert!$omp end single copyprivate (j)
181*404b540aSrobert    if (i .ne. omp_get_thread_num () .or. j .ne. -2) m = .true.
182*404b540aSrobert!$omp endparallel
183*404b540aSrobert    if (m) call abort
184*404b540aSrobert  end subroutine test_single
185*404b540aSrobertend
186