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