2018-01-22 Sebastian Perta <sebastian.perta@renesas.com>
[official-gcc.git] / libgomp / testsuite / libgomp.fortran / simd3.f90
blobdf9f4cac3fef42de2a38053e8a36f0f1846eabef
1 ! { dg-do run }
2 ! { dg-additional-options "-msse2" { target sse2_runtime } }
3 ! { dg-additional-options "-mavx" { target avx_runtime } }
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))) call abort
17 if (i.lt.52.and.modulo (i - 52, 39).ne.0) then
18 if (b(i).ne.(modulo (i - 52, 39) - 39)) call abort
19 else
20 if (b(i).ne.(modulo (i - 52, 39))) call abort
21 end if
22 a(i) = i - 513
23 end do
24 if (k.ne.(4 + 3 * 1024).or.s.ne.1596127) call abort
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))) call abort
31 if (i.lt.52.and.modulo (i - 52, 39).ne.0) then
32 if (b(i).ne.(modulo (i - 52, 39) - 39)) call abort
33 else
34 if (b(i).ne.(modulo (i - 52, 39))) call abort
35 end if
36 a(i) = i - 513
37 end do
38 if (k.ne.(4 + 3 * 1024).or.s.ne.1596127) call abort
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))) call abort
45 if (i.lt.52.and.modulo (i - 52, 39).ne.0) then
46 if (b(i).ne.(modulo (i - 52, 39) - 39)) call abort
47 else
48 if (b(i).ne.(modulo (i - 52, 39))) call abort
49 end if
50 end do
51 if (k.ne.(4 + 3 * 1024).or.s.ne.1596127) call abort
52 contains
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) call abort
69 if (u.ne.(36 + 4 + 3 * 1023).or.v.ne.(36 + 4 + 3 * 1024)) call abort
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) call abort
88 if (u.ne.(36 + 4 + 3 * 1023).or.v.ne.(36 + 4 + 3 * 1024)) call abort
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) call abort
106 if (u.ne.(36 + 4 + 3 * 1023).or.v.ne.(36 + 4 + 3 * 1024)) call abort
107 baz = s
108 end function baz