atomic-19.c 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274
  1. /* { dg-do run } */
  2. extern
  3. #ifdef __cplusplus
  4. "C"
  5. #endif
  6. void abort (void);
  7. int x = 6;
  8. int w, y;
  9. int *
  10. foo (void)
  11. {
  12. if (w)
  13. abort ();
  14. return &y;
  15. }
  16. int
  17. main ()
  18. {
  19. int v, r;
  20. #pragma omp atomic compare
  21. x = x > 8 ? 8 : x;
  22. #pragma omp atomic read
  23. v = x;
  24. if (v != 6)
  25. abort ();
  26. #pragma omp atomic compare
  27. x = x > 4 ? 4 : x;
  28. #pragma omp atomic read
  29. v = x;
  30. if (v != 4)
  31. abort ();
  32. #pragma omp atomic compare capture
  33. v = x = x < 8 ? 8 : x;
  34. if (v != 8)
  35. abort ();
  36. #pragma omp atomic read
  37. v = x;
  38. if (v != 8)
  39. abort ();
  40. #pragma omp atomic capture compare
  41. { v = x; x = x < 12 ? 12 : x; }
  42. if (v != 8)
  43. abort ();
  44. #pragma omp atomic read
  45. v = x;
  46. if (v != 12)
  47. abort ();
  48. #pragma omp atomic capture compare
  49. { v = x; x = x < 4 ? 4 : x; }
  50. if (v != 12)
  51. abort ();
  52. #pragma omp atomic read
  53. v = x;
  54. if (v != 12)
  55. abort ();
  56. #pragma omp atomic write
  57. x = -32;
  58. #pragma omp atomic capture compare seq_cst fail(relaxed)
  59. { x = 12U < x ? 12U : x; v = x; }
  60. if (v != 12)
  61. abort ();
  62. #pragma omp atomic read
  63. v = x;
  64. if (v != 12)
  65. abort ();
  66. #pragma omp atomic compare
  67. x = x == 12 ? 16 : x;
  68. #pragma omp atomic read
  69. v = x;
  70. if (v != 16)
  71. abort ();
  72. r = 57;
  73. #pragma omp atomic compare capture
  74. v = x = x == 15 ? r + 7 : x;
  75. if (v != 16)
  76. abort ();
  77. #pragma omp atomic read
  78. v = x;
  79. if (v != 16)
  80. abort ();
  81. #pragma omp atomic capture, update, compare seq_cst fail(acquire)
  82. { v = x; x = x == 73ULL - r ? 12LL : x; }
  83. if (v != 16)
  84. abort ();
  85. #pragma omp atomic read
  86. v = x;
  87. if (v != 12)
  88. abort ();
  89. #pragma omp atomic update, compare, capture
  90. { x = x == 69LL - r ? (unsigned char) 6 : x; v = x; }
  91. if (v != 6)
  92. abort ();
  93. #pragma omp atomic read
  94. v = x;
  95. if (v != 6)
  96. abort ();
  97. #pragma omp atomic compare
  98. if (x > 8) { x = 8; }
  99. #pragma omp atomic read
  100. v = x;
  101. if (v != 6)
  102. abort ();
  103. #pragma omp atomic compare
  104. if (x > 4) { x = 4; }
  105. #pragma omp atomic read
  106. v = x;
  107. if (v != 4)
  108. abort ();
  109. #pragma omp atomic compare capture
  110. { if (x < 8) { x = 8; } v = x; }
  111. if (v != 8)
  112. abort ();
  113. #pragma omp atomic read
  114. v = x;
  115. if (v != 8)
  116. abort ();
  117. #pragma omp atomic capture compare
  118. { v = x; if (x < 12) { x = 12; } }
  119. if (v != 8)
  120. abort ();
  121. #pragma omp atomic read
  122. v = x;
  123. if (v != 12)
  124. abort ();
  125. #pragma omp atomic capture compare
  126. { v = x; if (x < 4) { x = 4; } }
  127. if (v != 12)
  128. abort ();
  129. #pragma omp atomic read
  130. v = x;
  131. if (v != 12)
  132. abort ();
  133. #pragma omp atomic write
  134. x = -32;
  135. #pragma omp atomic capture compare seq_cst fail(relaxed)
  136. { if (12U < x) { x = 12U; } v = x; }
  137. if (v != 12)
  138. abort ();
  139. #pragma omp atomic read
  140. v = x;
  141. if (v != 12)
  142. abort ();
  143. #pragma omp atomic compare
  144. if (x == 12) { x = 16; }
  145. #pragma omp atomic read
  146. v = x;
  147. if (v != 16)
  148. abort ();
  149. r = 57;
  150. #pragma omp atomic compare capture
  151. { if (x == 15) { x = r + 7; } v = x; }
  152. if (v != 16)
  153. abort ();
  154. #pragma omp atomic read
  155. v = x;
  156. if (v != 16)
  157. abort ();
  158. #pragma omp atomic capture, update, compare seq_cst fail(acquire)
  159. { v = x; if (x == 73ULL - r) { x = 12LL; } }
  160. if (v != 16)
  161. abort ();
  162. #pragma omp atomic read
  163. v = x;
  164. if (v != 12)
  165. abort ();
  166. #pragma omp atomic update, compare, capture
  167. { if (x == 69LL - r) { x = (unsigned char) 6; } v = x; }
  168. if (v != 6)
  169. abort ();
  170. #pragma omp atomic read
  171. v = x;
  172. if (v != 6)
  173. abort ();
  174. v = 24;
  175. #pragma omp atomic compare capture
  176. if (x == 12) { x = 16; } else { v = x; }
  177. if (v != 6)
  178. abort ();
  179. v = 32;
  180. #pragma omp atomic read
  181. v = x;
  182. if (v != 6)
  183. abort ();
  184. v = 147;
  185. #pragma omp atomic capture compare
  186. if (x == 6) { x = 57; } else { v = x; }
  187. if (v != 147)
  188. abort ();
  189. #pragma omp atomic read
  190. v = x;
  191. if (v != 57)
  192. abort ();
  193. #pragma omp atomic update, capture, compare, weak, seq_cst, fail (relaxed)
  194. { r = x == 137; if (r) { x = 174; } }
  195. if (r)
  196. abort ();
  197. #pragma omp atomic read
  198. v = x;
  199. if (v != 57)
  200. abort ();
  201. #pragma omp atomic compare capture fail (relaxed)
  202. { r = x == 57; if (r) { x = 6; } }
  203. if (r != 1)
  204. abort ();
  205. #pragma omp atomic read
  206. v = x;
  207. if (v != 6)
  208. abort ();
  209. v = -5;
  210. #pragma omp atomic capture compare
  211. { r = x == 17; if (r) { x = 25; } else { v = x; } }
  212. if (r || v != 6)
  213. abort ();
  214. #pragma omp atomic read
  215. v = x;
  216. if (v != 6)
  217. abort ();
  218. v = 15;
  219. #pragma omp atomic capture compare
  220. { r = x == 6; if (r) { x = 23; } else { v = x; } }
  221. if (r != 1 || v != 15)
  222. abort ();
  223. #pragma omp atomic read
  224. v = x;
  225. if (v != 23)
  226. abort ();
  227. w = 1;
  228. #pragma omp atomic compare capture
  229. if (x == 23) { x = 57; } else { foo ()[0] = x; }
  230. #pragma omp atomic read
  231. v = x;
  232. if (v != 57)
  233. abort ();
  234. #pragma omp atomic capture update compare
  235. { r = x == 57; if (r) { x = 23; } else { foo ()[0] = x; } }
  236. if (r != 1)
  237. abort ();
  238. #pragma omp atomic read
  239. v = x;
  240. if (v != 23)
  241. abort ();
  242. w = 0;
  243. #pragma omp atomic compare capture
  244. if (x == 24) { x = 57; } else { foo ()[0] = x; }
  245. if (y != 23)
  246. abort ();
  247. #pragma omp atomic read
  248. v = x;
  249. if (v != 23)
  250. abort ();
  251. y = -5;
  252. #pragma omp atomic capture update compare
  253. {
  254. r = x == 57;
  255. if (r)
  256. {
  257. x = 27;
  258. }
  259. else
  260. {
  261. foo ()[0] = x;
  262. }
  263. }
  264. if (r || y != 23)
  265. abort ();
  266. #pragma omp atomic read
  267. v = x;
  268. if (v != 23)
  269. abort ();
  270. return 0;
  271. }