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 simd linear(k : m + 1) reduction(+: s) lastprivate(u, v)
57    do i = 1, 1024
58      a(i) = a(i) * p(i)
59      u = p(i) + k
60      k = k + m + 1
61      v = p(i) + k
62      s = s + p(i) + k
63    end do
64    !$omp end simd
65    if (i.ne.1025) stop 13
66    if (u.ne.(36 + 4 + 3 * 1023).or.v.ne.(36 + 4 + 3 * 1024)) stop 14
67    foo = s
68  end function foo
69  function bar (p)
70    integer :: p(1024), u, v, i, s, bar
71    s = 0
72    !$omp simd linear(k : m + 1) reduction(+: s) lastprivate(u, v)
73    do i = 1, 1024, t
74      a(i) = a(i) * p(i)
75      u = p(i) + k
76      k = k + m + 1
77      v = p(i) + k
78      s = s + p(i) + k
79    end do
80    !$omp end simd
81    if (i.ne.1025) stop 15
82    if (u.ne.(36 + 4 + 3 * 1023).or.v.ne.(36 + 4 + 3 * 1024)) stop 16
83    bar = s
84  end function bar
85  function baz (p)
86    integer :: p(1024), u, v, i, s, baz
87    s = 0
88    !$omp simd linear(k : m + 1) reduction(+: s) lastprivate(u, v) &
89    !$omp & linear(i : t)
90    do i = 1, 1024, t
91      a(i) = a(i) * p(i)
92      u = p(i) + k
93      k = k + m + 1
94      v = p(i) + k
95      s = s + p(i) + k
96    end do
97    if (i.ne.1025) stop 17
98    if (u.ne.(36 + 4 + 3 * 1023).or.v.ne.(36 + 4 + 3 * 1024)) stop 18
99    baz = s
100  end function baz
101end
102