! { dg-do run } ! { dg-additional-options "-msse2" { target sse2_runtime } } ! { dg-additional-options "-mavx" { target avx_runtime } } integer :: a(1024), b(1024), k, m, i, s, t k = 4 m = 2 t = 1 do i = 1, 1024 a(i) = i - 513 b(i) = modulo (i - 52, 39) if (i.lt.52.and.b(i).ne.0) b(i) = b(i) - 39 end do s = foo (b) do i = 1, 1024 if (a(i).ne.((i - 513) * b(i))) stop 1 if (i.lt.52.and.modulo (i - 52, 39).ne.0) then if (b(i).ne.(modulo (i - 52, 39) - 39)) stop 2 else if (b(i).ne.(modulo (i - 52, 39))) stop 3 end if a(i) = i - 513 end do if (k.ne.(4 + 3 * 1024).or.s.ne.1596127) stop 4 k = 4 m = 2 t = 1 s = bar (b) do i = 1, 1024 if (a(i).ne.((i - 513) * b(i))) stop 5 if (i.lt.52.and.modulo (i - 52, 39).ne.0) then if (b(i).ne.(modulo (i - 52, 39) - 39)) stop 6 else if (b(i).ne.(modulo (i - 52, 39))) stop 7 end if a(i) = i - 513 end do if (k.ne.(4 + 3 * 1024).or.s.ne.1596127) stop 8 k = 4 m = 2 t = 1 s = baz (b) do i = 1, 1024 if (a(i).ne.((i - 513) * b(i))) stop 9 if (i.lt.52.and.modulo (i - 52, 39).ne.0) then if (b(i).ne.(modulo (i - 52, 39) - 39)) stop 10 else if (b(i).ne.(modulo (i - 52, 39))) stop 11 end if end do if (k.ne.(4 + 3 * 1024).or.s.ne.1596127) stop 12 contains function foo (p) integer :: p(1024), u, v, i, s, foo s = 0 !$omp parallel !$omp do simd linear(k : m + 1) reduction(+: s) lastprivate(u, v) & !$omp & schedule (static, 32) do i = 1, 1024 a(i) = a(i) * p(i) u = p(i) + k k = k + m + 1 v = p(i) + k s = s + p(i) + k end do !$omp end do simd !$omp end parallel if (i.ne.1025) stop 13 if (u.ne.(36 + 4 + 3 * 1023).or.v.ne.(36 + 4 + 3 * 1024)) stop 14 foo = s end function foo function bar (p) integer :: p(1024), u, v, i, s, bar s = 0 !$omp parallel !$omp do simd linear(k : m + 1) reduction(+: s) lastprivate(u, v) & !$omp & schedule (dynamic, 32) do i = 1, 1024, t a(i) = a(i) * p(i) u = p(i) + k k = k + m + 1 v = p(i) + k s = s + p(i) + k end do !$omp end do simd !$omp endparallel if (i.ne.1025) stop 15 if (u.ne.(36 + 4 + 3 * 1023).or.v.ne.(36 + 4 + 3 * 1024)) stop 16 bar = s end function bar function baz (p) integer :: p(1024), u, v, i, s, baz s = 0 !$omp parallel !$omp do simd linear(k : m + 1) reduction(+: s) lastprivate(u, v) & !$omp & linear(i : t) schedule (static, 8) do i = 1, 1024, t a(i) = a(i) * p(i) u = p(i) + k k = k + m + 1 v = p(i) + k s = s + p(i) + k end do !$omp end parallel if (i.ne.1025) stop 17 if (u.ne.(36 + 4 + 3 * 1023).or.v.ne.(36 + 4 + 3 * 1024)) stop 18 baz = s end function baz end