simd-4.c 926 B

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. /* { dg-do run } */
  2. /* { dg-additional-options "-msse2" { target sse2_runtime } } */
  3. /* { dg-additional-options "-mavx" { target avx_runtime } } */
  4. extern void abort ();
  5. int a[1024] __attribute__((aligned (32))) = { 1 };
  6. struct S { int s; };
  7. #pragma omp declare reduction (+:struct S:omp_out.s += omp_in.s)
  8. #pragma omp declare reduction (foo:struct S:omp_out.s += omp_in.s)
  9. #pragma omp declare reduction (foo:int:omp_out += omp_in)
  10. __attribute__((noinline, noclone)) int
  11. foo (void)
  12. {
  13. int i, u = 0;
  14. struct S s, t;
  15. s.s = 0; t.s = 0;
  16. #pragma omp simd aligned(a : 32) reduction(+:s) reduction(foo:t, u)
  17. for (i = 0; i < 1024; i++)
  18. {
  19. int x = a[i];
  20. s.s += x;
  21. t.s += x;
  22. u += x;
  23. }
  24. if (t.s != s.s || u != s.s)
  25. abort ();
  26. return s.s;
  27. }
  28. int
  29. main ()
  30. {
  31. int i;
  32. for (i = 0; i < 1024; i++)
  33. a[i] = (i & 31) + (i / 128);
  34. int s = foo ();
  35. if (s != 19456)
  36. abort ();
  37. return 0;
  38. }