Rebase.
[official-gcc.git] / libgomp / testsuite / libgomp.c / simd-7.c
blobab04fee82d741eb77e4b26cff00785ef79331419
1 /* { dg-do run } */
2 /* { dg-options "-O2" } */
3 /* { dg-additional-options "-msse2" { target sse2_runtime } } */
4 /* { dg-additional-options "-mavx" { target avx_runtime } } */
6 extern void abort ();
7 int a[1024] __attribute__((aligned (32))) = { 1 };
8 int b[1024] __attribute__((aligned (32))) = { 1 };
9 int k, m;
10 struct U { int u; };
11 struct V { int v; };
13 __attribute__((noinline, noclone)) int
14 foo (int *p)
16 int i, s = 0;
17 struct U u;
18 struct V v;
19 #pragma omp simd aligned(a, p : 32) linear(k: m + 1) \
20 linear(i) reduction(+:s) lastprivate(u, v)
21 for (i = 0; i < 1024; i++)
23 int *q = &i;
24 a[i] *= p[i];
25 u.u = p[i] + k;
26 k += m + 1;
27 v.v = p[i] + k;
28 s += p[i] + k;
30 if (u.u != 36 + 4 + 3 * 1023 || v.v != 36 + 4 + 3 * 1024 || i != 1024)
31 abort ();
32 return s;
35 __attribute__((noinline, noclone)) int
36 bar (int *p)
38 int i, s = 0;
39 struct U u;
40 struct V v;
41 #pragma omp simd aligned(a, p : 32) linear(k: m + 1) \
42 reduction(+:s) lastprivate(u, v)
43 for (i = 0; i < 1024; i++)
45 int *q = &i;
46 a[i] *= p[i];
47 u.u = p[i] + k;
48 k += m + 1;
49 v.v = p[i] + k;
50 s += p[i] + k;
52 if (u.u != 36 + 4 + 3 * 1023 || v.v != 36 + 4 + 3 * 1024 || i != 1024)
53 abort ();
54 return s;
57 int
58 main ()
60 #if __SIZEOF_INT__ >= 4
61 int i;
62 k = 4;
63 m = 2;
64 for (i = 0; i < 1024; i++)
66 a[i] = i - 512;
67 b[i] = (i - 51) % 39;
69 int s = foo (b);
70 for (i = 0; i < 1024; i++)
72 if (b[i] != (i - 51) % 39
73 || a[i] != (i - 512) * b[i])
74 abort ();
76 if (k != 4 + 3 * 1024 || s != 1596127)
77 abort ();
78 k = 4;
79 m = 2;
80 for (i = 0; i < 1024; i++)
82 a[i] = i - 512;
83 b[i] = (i - 51) % 39;
85 s = bar (b);
86 for (i = 0; i < 1024; i++)
88 if (b[i] != (i - 51) % 39
89 || a[i] != (i - 512) * b[i])
90 abort ();
92 if (k != 4 + 3 * 1024 || s != 1596127)
93 abort ();
94 #endif
95 return 0;