atomic-8.C 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. // { dg-do run }
  2. extern "C" void abort ();
  3. int x = 6, cnt;
  4. int
  5. foo ()
  6. {
  7. return cnt++;
  8. }
  9. int
  10. main ()
  11. {
  12. int v, *p;
  13. #pragma omp atomic update
  14. x = x + 7;
  15. #pragma omp atomic
  16. x = x + 7 + 6;
  17. #pragma omp atomic update
  18. x = x + 2 * 3;
  19. #pragma omp atomic
  20. x = x * (2 - 1);
  21. #pragma omp atomic read
  22. v = x;
  23. if (v != 32)
  24. abort ();
  25. #pragma omp atomic write
  26. x = 0;
  27. #pragma omp atomic capture
  28. {
  29. v = x;
  30. x = x | 1 ^ 2;
  31. }
  32. if (v != 0)
  33. abort ();
  34. #pragma omp atomic capture
  35. {
  36. v = x;
  37. x = x | 4 | 2;
  38. }
  39. if (v != 3)
  40. abort ();
  41. #pragma omp atomic read
  42. v = x;
  43. if (v != 7)
  44. abort ();
  45. #pragma omp atomic capture
  46. {
  47. x = x ^ 6 & 2;
  48. v = x;
  49. }
  50. if (v != 5)
  51. abort ();
  52. #pragma omp atomic capture
  53. { x = x - (6 + 4); v = x; }
  54. if (v != -5)
  55. abort ();
  56. #pragma omp atomic capture
  57. { v = x; x = x - (1 | 2); }
  58. if (v != -5)
  59. abort ();
  60. #pragma omp atomic read
  61. v = x;
  62. if (v != -8)
  63. abort ();
  64. #pragma omp atomic
  65. x = x * -4 / 2;
  66. #pragma omp atomic read
  67. v = x;
  68. if (v != 16)
  69. abort ();
  70. p = &x;
  71. #pragma omp atomic update
  72. p[foo (), 0] = p[foo (), 0] - 16;
  73. #pragma omp atomic read
  74. v = x;
  75. if (cnt != 2 || v != 0)
  76. abort ();
  77. #pragma omp atomic capture
  78. {
  79. p[foo (), 0] += 6;
  80. v = p[foo (), 0];
  81. }
  82. if (cnt != 4 || v != 6)
  83. abort ();
  84. #pragma omp atomic capture
  85. {
  86. v = p[foo (), 0];
  87. p[foo (), 0] += 6;
  88. }
  89. if (cnt != 6 || v != 6)
  90. abort ();
  91. #pragma omp atomic read
  92. v = x;
  93. if (v != 12)
  94. abort ();
  95. #pragma omp atomic capture
  96. {
  97. p[foo (), 0] = p[foo (), 0] + 6;
  98. v = p[foo (), 0];
  99. }
  100. if (cnt != 9 || v != 18)
  101. abort ();
  102. #pragma omp atomic capture
  103. {
  104. v = p[foo (), 0];
  105. p[foo (), 0] = p[foo (), 0] + 6;
  106. }
  107. if (cnt != 12 || v != 18)
  108. abort ();
  109. #pragma omp atomic read
  110. v = x;
  111. if (v != 24)
  112. abort ();
  113. #pragma omp atomic capture
  114. { v = p[foo (), 0]; p[foo (), 0]++; }
  115. #pragma omp atomic capture
  116. { v = p[foo (), 0]; ++p[foo (), 0]; }
  117. #pragma omp atomic capture
  118. { p[foo (), 0]++; v = p[foo (), 0]; }
  119. #pragma omp atomic capture
  120. { ++p[foo (), 0]; v = p[foo (), 0]; }
  121. if (cnt != 20 || v != 28)
  122. abort ();
  123. #pragma omp atomic capture
  124. { v = p[foo (), 0]; p[foo (), 0]--; }
  125. #pragma omp atomic capture
  126. { v = p[foo (), 0]; --p[foo (), 0]; }
  127. #pragma omp atomic capture
  128. { p[foo (), 0]--; v = p[foo (), 0]; }
  129. #pragma omp atomic capture
  130. { --p[foo (), 0]; v = p[foo (), 0]; }
  131. if (cnt != 28 || v != 24)
  132. abort ();
  133. return 0;
  134. }