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