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)11foo (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)24bar (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()38main () 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