aboutsummaryrefslogtreecommitdiff
path: root/libgomp/testsuite/libgomp.fortran/lastprivate-conditional-10.f90
blob: 116166c48ee0aa61186c6c6b402d687857c98ca2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
! { dg-do run }
! Fortran version of libgomp.c-c++-common/lastprivate-conditional-10.c

module m
  implicit none
  integer :: v = 0
  integer :: x = 0
contains
  integer function foo (a)
    integer, contiguous :: a(0:)
    integer i

    !$omp parallel do simd lastprivate (conditional: x) schedule(simd : static) if (simd : .false.)
    do i = 0, 127
      if (a(i) /= 0) x = a(i)
    end do
    foo = x
  end

  integer function bar (a, b)
    integer, contiguous :: a(0:), b(0:)
    integer :: i
    !$omp parallel
    !$omp do simd lastprivate (conditional: x, v) schedule(static, 16) simdlen (1)
    do i = 16, 127
      if (a(i) /= 0) x = a(i);
      if (b(i) /= 0) v = b(i) + 10;
    end do
    !$omp end parallel
    bar = x
  end

  integer function baz (a)
    integer, contiguous :: a(0:)
    integer :: i
    !$omp parallel do simd if (simd : .false.) lastprivate (conditional: x) schedule(simd : dynamic, 16)
    do i = 0, 127
      if (a(i) /= 0) x = a(i) + 5
    end do
    baz = x
  end
end module m

program main
  use m
  implicit none
  integer :: a(0:127), b(0:127), i
  do i = 0, 127
      if (mod(i, 11) == 2) then
         a(i) =  i + 10
      else
        a(i) = 0
      endif
      if (mod(i, 13) == 5) then
        b(i) = i * 2
      else
        b(i) = 0
      endif
  end do
  if (foo (a) /= 133) stop 1
  if (bar (b, a) /= 244 .or. v /= 143) stop 2
  if (baz (b) /= 249) stop 3
end