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