atomic-20.c 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  1. /* { dg-do run } */
  2. extern
  3. #ifdef __cplusplus
  4. "C"
  5. #endif
  6. void abort (void);
  7. float x = 6.0f;
  8. int
  9. main ()
  10. {
  11. float v;
  12. int r;
  13. #pragma omp atomic compare
  14. x = x > 8.0f ? 8.0f : x;
  15. #pragma omp atomic read
  16. v = x;
  17. if (v != 6.0f)
  18. abort ();
  19. #pragma omp atomic compare
  20. x = x > 4.0f ? 4.0f : x;
  21. #pragma omp atomic read
  22. v = x;
  23. if (v != 4.0f)
  24. abort ();
  25. #pragma omp atomic compare capture
  26. v = x = x < 8.0f ? 8.0f : x;
  27. if (v != 8.0f)
  28. abort ();
  29. #pragma omp atomic read
  30. v = x;
  31. if (v != 8)
  32. abort ();
  33. #pragma omp atomic capture compare
  34. { v = x; x = x < 12.0f ? 12.0f : x; }
  35. if (v != 8.0f)
  36. abort ();
  37. #pragma omp atomic read
  38. v = x;
  39. if (v != 12.0f)
  40. abort ();
  41. #pragma omp atomic capture compare
  42. { v = x; x = x < 4.0f ? 4.0f : x; }
  43. if (v != 12.0f)
  44. abort ();
  45. #pragma omp atomic read
  46. v = x;
  47. if (v != 12.0f)
  48. abort ();
  49. #pragma omp atomic compare
  50. x = x == 12.0 ? 16.0L : x;
  51. #pragma omp atomic read
  52. v = x;
  53. if (v != 16.0)
  54. abort ();
  55. r = 57;
  56. #pragma omp atomic compare capture
  57. v = x = x == 15.0f ? r + 7.0f : x;
  58. if (v != 16.0f)
  59. abort ();
  60. #pragma omp atomic read
  61. v = x;
  62. if (v != 16.0f)
  63. abort ();
  64. #pragma omp atomic capture, update, compare seq_cst fail(acquire)
  65. { v = x; x = x == 73.0L - r ? 12.0f : x; }
  66. if (v != 16.0f)
  67. abort ();
  68. #pragma omp atomic read
  69. v = x;
  70. if (v != 12.0f)
  71. abort ();
  72. #pragma omp atomic update, compare, capture
  73. { x = x == 69.0 - r ? 6.0f : x; v = x; }
  74. if (v != 6.0f)
  75. abort ();
  76. #pragma omp atomic read
  77. v = x;
  78. if (v != 6.0f)
  79. abort ();
  80. #pragma omp atomic compare
  81. if (x > 8.0f) { x = 8.0f; }
  82. #pragma omp atomic read
  83. v = x;
  84. if (v != 6.0f)
  85. abort ();
  86. #pragma omp atomic compare
  87. if (x > 4.0) { x = 4.0; }
  88. #pragma omp atomic read
  89. v = x;
  90. if (v != 4.0f)
  91. abort ();
  92. #pragma omp atomic compare capture
  93. { if (x < 8.0f) { x = 8.0f; } v = x; }
  94. if (v != 8.0f)
  95. abort ();
  96. #pragma omp atomic read
  97. v = x;
  98. if (v != 8.0f)
  99. abort ();
  100. #pragma omp atomic capture compare
  101. { v = x; if (x < 12.0f) { x = 12.0f; } }
  102. if (v != 8.0f)
  103. abort ();
  104. #pragma omp atomic read
  105. v = x;
  106. if (v != 12.0f)
  107. abort ();
  108. #pragma omp atomic capture compare
  109. { v = x; if (x < 4.0L) { x = 4.0L; } }
  110. if (v != 12.0f)
  111. abort ();
  112. #pragma omp atomic read
  113. v = x;
  114. if (v != 12.0f)
  115. abort ();
  116. #pragma omp atomic compare
  117. if (x == 12.0f) { x = 16.0L; }
  118. #pragma omp atomic read
  119. v = x;
  120. if (v != 16.0f)
  121. abort ();
  122. r = 57.0;
  123. #pragma omp atomic compare capture
  124. { if (x == 15.0f) { x = r + 7.0f; } v = x; }
  125. if (v != 16.0f)
  126. abort ();
  127. #pragma omp atomic read
  128. v = x;
  129. if (v != 16.0f)
  130. abort ();
  131. #pragma omp atomic capture, update, compare seq_cst fail(acquire)
  132. { v = x; if (x == 73.0L - r) { x = 12.0L; } }
  133. if (v != 16.0f)
  134. abort ();
  135. #pragma omp atomic read
  136. v = x;
  137. if (v != 12.0f)
  138. abort ();
  139. #pragma omp atomic update, compare, capture
  140. { if (x == 69.0L - r) { x = 6.0; } v = x; }
  141. if (v != 6.0f)
  142. abort ();
  143. #pragma omp atomic read
  144. v = x;
  145. if (v != 6.0f)
  146. abort ();
  147. v = 24;
  148. #pragma omp atomic compare capture
  149. if (x == 12.0f) { x = 16.0f; } else { v = x; }
  150. if (v != 6.0f)
  151. abort ();
  152. v = 32.0f;
  153. #pragma omp atomic read
  154. v = x;
  155. if (v != 6.0f)
  156. abort ();
  157. v = 147.0f;
  158. #pragma omp atomic capture compare
  159. if (x == 6.0f) { x = 57.0f; } else { v = x; }
  160. if (v != 147.0f)
  161. abort ();
  162. #pragma omp atomic read
  163. v = x;
  164. if (v != 57.0f)
  165. abort ();
  166. #pragma omp atomic update, capture, compare, weak, seq_cst, fail (relaxed)
  167. { r = x == 137.0f; if (r) { x = 174.0f; } }
  168. if (r)
  169. abort ();
  170. #pragma omp atomic read
  171. v = x;
  172. if (v != 57.0f)
  173. abort ();
  174. #pragma omp atomic compare capture fail (relaxed)
  175. { r = x == 57.0f; if (r) { x = 6.0f; } }
  176. if (r != 1)
  177. abort ();
  178. #pragma omp atomic read
  179. v = x;
  180. if (v != 6.0f)
  181. abort ();
  182. v = -5.0f;
  183. #pragma omp atomic capture compare
  184. { r = x == 17.0L; if (r) { x = 25.0; } else { v = x; } }
  185. if (r || v != 6.0f)
  186. abort ();
  187. #pragma omp atomic read
  188. v = x;
  189. if (v != 6.0f)
  190. abort ();
  191. v = 15.0f;
  192. #pragma omp atomic capture compare
  193. { r = x == 6.0f; if (r) { x = 23.0f; } else { v = x; } }
  194. if (r != 1 || v != 15.0f)
  195. abort ();
  196. #pragma omp atomic read
  197. v = x;
  198. if (v != 23.0f)
  199. abort ();
  200. return 0;
  201. }