vla-1.c 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. /* { dg-do run } */
  2. #include <omp.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. int
  6. main (int argc, char **argv[])
  7. {
  8. int n = argc < 5 ? 12 : 31, i, m, l;
  9. char a[n + 3];
  10. unsigned short b[n / 2 - 1];
  11. int c[n * 2 + 1];
  12. for (i = 0; i < n + 3; i++)
  13. a[i] = i;
  14. for (i = 0; i < n / 2 - 1; i++)
  15. b[i] = (i << 8) | i;
  16. for (i = 0; i < n * 2 + 1; i++)
  17. c[i] = (i << 24) | i;
  18. l = 0;
  19. m = n;
  20. #pragma omp parallel default (shared) num_threads (4) \
  21. firstprivate (a, m) private (b, i) reduction (+:l)
  22. {
  23. for (i = 0; i < m + 3; i++)
  24. if (a[i] != i)
  25. l++;
  26. for (i = 0; i < m * 2 + 1; i++)
  27. if (c[i] != ((i << 24) | i))
  28. l++;
  29. #pragma omp barrier
  30. memset (a, omp_get_thread_num (), m + 3);
  31. for (i = 0; i < m / 2 - 1; i++)
  32. b[i] = a[0] + 7;
  33. #pragma omp master
  34. {
  35. for (i = 0; i < m * 2 + 1; i++)
  36. c[i] = a[0] + 16;
  37. }
  38. #pragma omp barrier
  39. if (a[0] != omp_get_thread_num ())
  40. l++;
  41. for (i = 1; i < m + 3; i++)
  42. if (a[i] != a[0])
  43. l++;
  44. for (i = 0; i < m / 2 - 1; i++)
  45. if (b[i] != a[0] + 7)
  46. l++;
  47. for (i = 0; i < m * 2 + 1; i++)
  48. if (c[i] != 16)
  49. l++;
  50. }
  51. if (l)
  52. abort ();
  53. for (i = 0; i < n * 2 + 1; i++)
  54. if (c[i] != 16)
  55. l++;
  56. return 0;
  57. }