1 // { dg-do run }
2 // { dg-additional-options "-msse2" { target sse2_runtime } }
3 // { dg-additional-options "-mavx" { target avx_runtime } }
4 
5 extern "C" void abort ();
6 int a[1024] __attribute__((aligned (32))) = { 1 };
7 #pragma omp declare reduction (foo:int:omp_out += omp_in) \
8 		    initializer (omp_priv = 0)
9 
10 __attribute__((noinline, noclone)) void
foo(int & u,int & v)11 foo (int &u, int &v)
12 {
13   int i;
14   #pragma omp simd aligned(a : 32) reduction(foo:u) reduction(+:v)
15   for (i = 0; i < 1024; i++)
16     {
17       int x = a[i];
18       u += x;
19       v += x;
20     }
21 }
22 
23 __attribute__((noinline, noclone)) void
bar(int & u,int & v)24 bar (int &u, int &v)
25 {
26   int i;
27   #pragma omp simd aligned(a : 32) reduction(foo:u) reduction(+:v) \
28 		   safelen(1)
29   for (i = 0; i < 1024; i++)
30     {
31       int x = a[i];
32       u += x;
33       v += x;
34     }
35 }
36 
37 int
main()38 main ()
39 {
40   int i;
41   for (i = 0; i < 1024; i++)
42     a[i] = (i & 31) + (i / 128);
43   int u = 0, v = 0;
44   foo (u, v);
45   if (u != 19456 || v != 19456)
46     abort ();
47   u = 0; v = 0;
48   bar (u, v);
49   if (u != 19456 || v != 19456)
50     abort ();
51 }
52