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