Fortran: Fix OpenMP's 'if(simd:' etc. conditions
[gcc.git] / libgomp / testsuite / libgomp.fortran / lastprivate-conditional-10.f90
1 ! { dg-do run }
2 ! Fortran version of libgomp.c-c++-common/lastprivate-conditional-10.c
3
4 module m
5 implicit none
6 integer :: v = 0
7 integer :: x = 0
8 contains
9 integer function foo (a)
10 integer, contiguous :: a(0:)
11 integer i
12
13 !$omp parallel do simd lastprivate (conditional: x) schedule(simd : static) if (simd : .false.)
14 do i = 0, 127
15 if (a(i) /= 0) x = a(i)
16 end do
17 foo = x
18 end
19
20 integer function bar (a, b)
21 integer, contiguous :: a(0:), b(0:)
22 integer :: i
23 !$omp parallel
24 !$omp do simd lastprivate (conditional: x, v) schedule(static, 16) simdlen (1)
25 do i = 16, 127
26 if (a(i) /= 0) x = a(i);
27 if (b(i) /= 0) v = b(i) + 10;
28 end do
29 !$omp end parallel
30 bar = x
31 end
32
33 integer function baz (a)
34 integer, contiguous :: a(0:)
35 integer :: i
36 !$omp parallel do simd if (simd : .false.) lastprivate (conditional: x) schedule(simd : dynamic, 16)
37 do i = 0, 127
38 if (a(i) /= 0) x = a(i) + 5
39 end do
40 baz = x
41 end
42 end module m
43
44 program main
45 use m
46 implicit none
47 integer :: a(0:127), b(0:127), i
48 do i = 0, 127
49 if (mod(i, 11) == 2) then
50 a(i) = i + 10
51 else
52 a(i) = 0
53 endif
54 if (mod(i, 13) == 5) then
55 b(i) = i * 2
56 else
57 b(i) = 0
58 endif
59 end do
60 if (foo (a) /= 133) stop 1
61 if (bar (b, a) /= 244 .or. v /= 143) stop 2
62 if (baz (b) /= 249) stop 3
63 end