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