simd-6.c 968 B

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