xref: /openbsd-src/gnu/gcc/libgomp/testsuite/libgomp.fortran/reduction3.f90 (revision 404b540a9034ac75a6199ad1a32d1bbc7a0d4210)
1*404b540aSrobert! { dg-do run }
2*404b540aSrobert!$ use omp_lib
3*404b540aSrobert
4*404b540aSrobert  integer (kind = 4) :: i, ia (6), n, cnt
5*404b540aSrobert  real :: r, ra (4)
6*404b540aSrobert  double precision :: d, da (5)
7*404b540aSrobert  logical :: v
8*404b540aSrobert
9*404b540aSrobert  i = 1
10*404b540aSrobert  ia = 2
11*404b540aSrobert  r = 3
12*404b540aSrobert  ra = 4
13*404b540aSrobert  d = 5.5
14*404b540aSrobert  da = 6.5
15*404b540aSrobert  v = .false.
16*404b540aSrobert  cnt = -1
17*404b540aSrobert
18*404b540aSrobert!$omp parallel num_threads (3) private (n) reduction (.or.:v) &
19*404b540aSrobert!$omp & reduction (max:i, ia, r, ra, d, da)
20*404b540aSrobert!$ if (i .ne. -huge(i)-1 .or. any (ia .ne. -huge(ia)-1)) v = .true.
21*404b540aSrobert!$ if (r .ge. -1.0d38 .or. any (ra .ge. -1.0d38)) v = .true.
22*404b540aSrobert!$ if (d .ge. -1.0d300 .or. any (da .ge. -1.0d300)) v = .true.
23*404b540aSrobert  n = omp_get_thread_num ()
24*404b540aSrobert  if (n .eq. 0) then
25*404b540aSrobert    cnt = omp_get_num_threads ()
26*404b540aSrobert    i = 4
27*404b540aSrobert    ia(3:5) = -2
28*404b540aSrobert    ia(1) = 7
29*404b540aSrobert    r = 5
30*404b540aSrobert    ra(1:2) = 6.5
31*404b540aSrobert    d = -2.5
32*404b540aSrobert    da(2:4) = 8.5
33*404b540aSrobert  else if (n .eq. 1) then
34*404b540aSrobert    i = 2
35*404b540aSrobert    ia(4:6) = 5
36*404b540aSrobert    r = 1
37*404b540aSrobert    ra(2:4) = -1.5
38*404b540aSrobert    d = 8.5
39*404b540aSrobert    da(1:3) = 2.5
40*404b540aSrobert  else
41*404b540aSrobert    i = 1
42*404b540aSrobert    ia = 1
43*404b540aSrobert    r = -1
44*404b540aSrobert    ra = -1
45*404b540aSrobert    d = 1
46*404b540aSrobert    da = -1
47*404b540aSrobert  end if
48*404b540aSrobert!$omp end parallel
49*404b540aSrobert  if (v) call abort
50*404b540aSrobert  if (cnt .eq. 3) then
51*404b540aSrobert    if (i .ne. 4 .or. any (ia .ne. (/7, 2, 2, 5, 5, 5/))) call abort
52*404b540aSrobert    if (r .ne. 5 .or. any (ra .ne. (/6.5, 6.5, 4., 4./))) call abort
53*404b540aSrobert    if (d .ne. 8.5 .or. any (da .ne. (/6.5, 8.5, 8.5, 8.5, 6.5/))) call abort
54*404b540aSrobert  end if
55*404b540aSrobert
56*404b540aSrobert  i = 1
57*404b540aSrobert  ia = 2
58*404b540aSrobert  r = 3
59*404b540aSrobert  ra = 4
60*404b540aSrobert  d = 5.5
61*404b540aSrobert  da = 6.5
62*404b540aSrobert  v = .false.
63*404b540aSrobert  cnt = -1
64*404b540aSrobert
65*404b540aSrobert!$omp parallel num_threads (3) private (n) reduction (.or.:v) &
66*404b540aSrobert!$omp & reduction (min:i, ia, r, ra, d, da)
67*404b540aSrobert!$ if (i .ne. 2147483647 .or. any (ia .ne. 2147483647)) v = .true.
68*404b540aSrobert!$ if (r .le. 1.0d38 .or. any (ra .le. 1.0d38)) v = .true.
69*404b540aSrobert!$ if (d .le. 1.0d300 .or. any (da .le. 1.0d300)) v = .true.
70*404b540aSrobert  n = omp_get_thread_num ()
71*404b540aSrobert  if (n .eq. 0) then
72*404b540aSrobert    cnt = omp_get_num_threads ()
73*404b540aSrobert    i = 4
74*404b540aSrobert    ia(3:5) = -2
75*404b540aSrobert    ia(1) = 7
76*404b540aSrobert    r = 5
77*404b540aSrobert    ra(1:2) = 6.5
78*404b540aSrobert    d = -2.5
79*404b540aSrobert    da(2:4) = 8.5
80*404b540aSrobert  else if (n .eq. 1) then
81*404b540aSrobert    i = 2
82*404b540aSrobert    ia(4:6) = 5
83*404b540aSrobert    r = 1
84*404b540aSrobert    ra(2:4) = -1.5
85*404b540aSrobert    d = 8.5
86*404b540aSrobert    da(1:3) = 2.5
87*404b540aSrobert  else
88*404b540aSrobert    i = 1
89*404b540aSrobert    ia = 1
90*404b540aSrobert    r = -1
91*404b540aSrobert    ra = 7
92*404b540aSrobert    ra(3) = -8.5
93*404b540aSrobert    d = 1
94*404b540aSrobert    da(1:4) = 6
95*404b540aSrobert  end if
96*404b540aSrobert!$omp end parallel
97*404b540aSrobert  if (v) call abort
98*404b540aSrobert  if (cnt .eq. 3) then
99*404b540aSrobert    if (i .ne. 1 .or. any (ia .ne. (/1, 1, -2, -2, -2, 1/))) call abort
100*404b540aSrobert    if (r .ne. -1 .or. any (ra .ne. (/4., -1.5, -8.5, -1.5/))) call abort
101*404b540aSrobert    if (d .ne. -2.5 .or. any (da .ne. (/2.5, 2.5, 2.5, 6., 6.5/))) call abort
102*404b540aSrobert  end if
103*404b540aSrobertend
104