1 // { dg-do run }
2 // { dg-additional-options "-msse2" { target sse2_runtime } }
3 // { dg-additional-options "-mavx" { target avx_runtime } }
4
5 #define N 1024
6 int a[N], b[N];
7
8 int
9 f1 (void)
10 {
11 int i;
12 #pragma omp simd private (i)
13 for (i = 0; i < N; i++)
14 a[i] = b[i] * 2;
15 #pragma omp simd lastprivate (i)
16 for (i = 0; i < N; i++)
17 a[i] += b[i] * 2;
18 return i;
19 }
20
21 int
22 f2 (void)
23 {
24 int i, j;
25 #pragma omp simd private (i), collapse (2), lastprivate (j)
26 for (i = 0; i < 32; i++)
27 for (j = 0; j < 32; ++j)
28 a[i * 32 + j] += b[i * 32 + j] * 2;
29 return j;
30 }
31
32 int
33 f3 (void)
34 {
35 static int i;
36 #pragma omp for simd private (i)
37 for (i = 0; i < N; ++i)
38 a[i] = b[i] * 2;
39 #pragma omp for simd lastprivate (i)
40 for (i = 0; i < N; ++i)
41 a[i] += b[i] * 2;
42 return i;
43 }
44
45 int
46 f4 (void)
47 {
48 static int i, j;
49 #pragma omp for simd private (i)collapse (2)lastprivate (j)
50 for (i = 0; i < 32; ++i)
51 for (j = 0; j < 32; j++)
52 a[i * 32 + j] += b[i * 32 + j] * 2;
53 return j;
54 }
55
56 int
57 main ()
58 {
59 int i;
60 for (i = 0; i < N; ++i)
61 a[i] = b[i] = i;
62 if (f1 () != 1024 || f2 () != 32)
63 __builtin_abort ();
64 #pragma omp parallel num_threads(4)
65 if (f3 () != 1024 || f4 () != 32)
66 __builtin_abort ();
67 for (i = 0; i < N; ++i)
68 if (a[i] != 6 * i || b[i] != i)
69 __builtin_abort ();
70 return 0;
71 }