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