1! { dg-do run }
2! { dg-additional-options "-msse2" { target sse2_runtime } }
3! { dg-additional-options "-mavx" { target avx_runtime } }
4
5  integer :: a(1024), b(1024), k, m, i, s, t
6  k = 4
7  m = 2
8  t = 1
9  do i = 1, 1024
10    a(i) = i - 513
11    b(i) = modulo (i - 52, 39)
12    if (i.lt.52.and.b(i).ne.0) b(i) = b(i) - 39
13  end do
14  s = foo (b)
15  do i = 1, 1024
16    if (a(i).ne.((i - 513) * b(i))) stop 1
17    if (i.lt.52.and.modulo (i - 52, 39).ne.0) then
18      if (b(i).ne.(modulo (i - 52, 39) - 39)) stop 2
19    else
20      if (b(i).ne.(modulo (i - 52, 39))) stop 3
21    end if
22    a(i) = i - 513
23  end do
24  if (k.ne.(4 + 3 * 1024).or.s.ne.1596127) stop 4
25  k = 4
26  m = 2
27  t = 1
28  s = bar (b)
29  do i = 1, 1024
30    if (a(i).ne.((i - 513) * b(i))) stop 5
31    if (i.lt.52.and.modulo (i - 52, 39).ne.0) then
32      if (b(i).ne.(modulo (i - 52, 39) - 39)) stop 6
33    else
34      if (b(i).ne.(modulo (i - 52, 39))) stop 7
35    end if
36    a(i) = i - 513
37  end do
38  if (k.ne.(4 + 3 * 1024).or.s.ne.1596127) stop 8
39  k = 4
40  m = 2
41  t = 1
42  s = baz (b)
43  do i = 1, 1024
44    if (a(i).ne.((i - 513) * b(i))) stop 9
45    if (i.lt.52.and.modulo (i - 52, 39).ne.0) then
46      if (b(i).ne.(modulo (i - 52, 39) - 39)) stop 10
47    else
48      if (b(i).ne.(modulo (i - 52, 39))) stop 11
49    end if
50  end do
51  if (k.ne.(4 + 3 * 1024).or.s.ne.1596127) stop 12
52contains
53  function foo (p)
54    integer :: p(1024), u, v, i, s, foo
55    s = 0
56    !$omp parallel
57    !$omp do simd linear(k : m + 1) reduction(+: s) lastprivate(u, v) &
58    !$omp & schedule (static, 32)
59    do i = 1, 1024
60      a(i) = a(i) * p(i)
61      u = p(i) + k
62      k = k + m + 1
63      v = p(i) + k
64      s = s + p(i) + k
65    end do
66    !$omp end do simd
67    !$omp end parallel
68    if (i.ne.1025) stop 13
69    if (u.ne.(36 + 4 + 3 * 1023).or.v.ne.(36 + 4 + 3 * 1024)) stop 14
70    foo = s
71  end function foo
72  function bar (p)
73    integer :: p(1024), u, v, i, s, bar
74    s = 0
75    !$omp parallel
76    !$omp do simd linear(k : m + 1) reduction(+: s) lastprivate(u, v) &
77    !$omp & schedule (dynamic, 32)
78    do i = 1, 1024, t
79      a(i) = a(i) * p(i)
80      u = p(i) + k
81      k = k + m + 1
82      v = p(i) + k
83      s = s + p(i) + k
84    end do
85    !$omp end do simd
86    !$omp endparallel
87    if (i.ne.1025) stop 15
88    if (u.ne.(36 + 4 + 3 * 1023).or.v.ne.(36 + 4 + 3 * 1024)) stop 16
89    bar = s
90  end function bar
91  function baz (p)
92    integer :: p(1024), u, v, i, s, baz
93    s = 0
94    !$omp parallel
95    !$omp do simd linear(k : m + 1) reduction(+: s) lastprivate(u, v) &
96    !$omp & linear(i : t) schedule (static, 8)
97    do i = 1, 1024, t
98      a(i) = a(i) * p(i)
99      u = p(i) + k
100      k = k + m + 1
101      v = p(i) + k
102      s = s + p(i) + k
103    end do
104    !$omp end parallel
105    if (i.ne.1025) stop 17
106    if (u.ne.(36 + 4 + 3 * 1023).or.v.ne.(36 + 4 + 3 * 1024)) stop 18
107    baz = s
108  end function baz
109end
110