lastprivate-conditional-7.c 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  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)) void
  7. foo (int *a)
  8. {
  9. #pragma omp 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. }
  14. __attribute__((noipa)) void
  15. bar (int *a, int *b)
  16. {
  17. #pragma omp for simd lastprivate (conditional: x, v) schedule(static, 16)
  18. for (int i = 16; i < 128; ++i)
  19. {
  20. if (a[i])
  21. x = a[i];
  22. if (b[i])
  23. v = b[i] + 10;
  24. }
  25. }
  26. __attribute__((noipa)) void
  27. baz (int *a)
  28. {
  29. #pragma omp for simd lastprivate (conditional: x) schedule(simd: dynamic, 16)
  30. for (int i = 0; i < 128; i++)
  31. if (a[i])
  32. x = a[i] + 5;
  33. }
  34. int
  35. main ()
  36. {
  37. int a[128], b[128], i;
  38. for (i = 0; i < 128; i++)
  39. {
  40. a[i] = ((i % 11) == 2) ? i + 10 : 0;
  41. asm volatile ("" : "+g" (i));
  42. b[i] = ((i % 13) == 5) ? i * 2 : 0;
  43. }
  44. #pragma omp parallel
  45. foo (a);
  46. if (x != 133)
  47. __builtin_abort ();
  48. x = -3;
  49. #pragma omp parallel
  50. bar (b, a);
  51. if (x != 244 || v != 143)
  52. __builtin_abort ();
  53. #pragma omp parallel
  54. baz (b);
  55. if (x != 249)
  56. __builtin_abort ();
  57. return 0;
  58. }