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