lastprivate-conditional-8.c 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. /* { dg-do run } */
  2. /* { dg-additional-options "-O2 -fvect-cost-model=cheap -fdump-tree-vect-details" } */
  3. /* { dg-additional-options "-mavx" { target avx_runtime } } */
  4. /* { dg-final { scan-tree-dump-times "vectorized 1 loops" 3 "vect" { target avx_runtime } } } */
  5. int v, x;
  6. __attribute__((noipa)) int
  7. foo (int *a)
  8. {
  9. #pragma omp parallel for simd lastprivate (conditional: x) schedule(simd: static)
  10. for (int i = 0; i < 128; i++)
  11. if (a[i])
  12. x = a[i];
  13. return x;
  14. }
  15. __attribute__((noipa)) int
  16. bar (int *a, int *b)
  17. {
  18. #pragma omp parallel
  19. #pragma omp for simd lastprivate (conditional: x, v) schedule(static, 16)
  20. for (int i = 16; i < 128; ++i)
  21. {
  22. if (a[i])
  23. x = a[i];
  24. if (b[i])
  25. v = b[i] + 10;
  26. }
  27. return x;
  28. }
  29. __attribute__((noipa)) int
  30. baz (int *a)
  31. {
  32. #pragma omp parallel for simd lastprivate (conditional: x) schedule(simd: dynamic, 16)
  33. for (int i = 0; i < 128; i++)
  34. if (a[i])
  35. x = a[i] + 5;
  36. return x;
  37. }
  38. int
  39. main ()
  40. {
  41. int a[128], b[128], i;
  42. for (i = 0; i < 128; i++)
  43. {
  44. a[i] = ((i % 11) == 2) ? i + 10 : 0;
  45. asm volatile ("" : "+g" (i));
  46. b[i] = ((i % 13) == 5) ? i * 2 : 0;
  47. }
  48. if (foo (a) != 133)
  49. __builtin_abort ();
  50. if (bar (b, a) != 244 || v != 143)
  51. __builtin_abort ();
  52. if (baz (b) != 249)
  53. __builtin_abort ();
  54. return 0;
  55. }