(root)/
gcc-13.2.0/
libgomp/
testsuite/
libgomp.oacc-c-c++-common/
atomic_capture-1.c
       1  /* { dg-do run } */
       2  
       3  #include <stdlib.h>
       4  
       5  int
       6  main(int argc, char **argv)
       7  {
       8    int   iexp, igot;
       9    long long lexp, lgot;
      10    int   N = 32;
      11    int   idata[N];
      12    long long   ldata[N];
      13    float fexp, fgot;
      14    float fdata[N];
      15    int i;
      16  
      17    igot = 0;
      18    iexp = 32;
      19  
      20  #pragma acc data copy (igot, idata[0:N])
      21    {
      22  #pragma acc parallel loop
      23      for (i = 0; i < N; i++)
      24        {
      25  #pragma acc atomic capture
      26          idata[i] = igot++;
      27        }
      28    }
      29  
      30    if (iexp != igot)
      31      abort ();
      32  
      33    igot = 32;
      34    iexp = 0;
      35  
      36  #pragma acc data copy (igot, idata[0:N])
      37    {
      38  #pragma acc parallel loop
      39      for (i = 0; i < N; i++)
      40        {
      41  #pragma acc atomic capture
      42          idata[i] = igot--;
      43        }
      44    }
      45  
      46    if (iexp != igot)
      47      abort ();
      48  
      49    igot = 0;
      50    iexp = 32;
      51  
      52  #pragma acc data copy (igot, idata[0:N])
      53    {
      54  #pragma acc parallel loop
      55      for (i = 0; i < N; i++)
      56        {
      57  #pragma acc atomic capture
      58          idata[i] = ++igot;
      59        }
      60    }
      61  
      62    if (iexp != igot)
      63      abort ();
      64  
      65    igot = 32;
      66    iexp = 0;
      67  
      68  #pragma acc data copy (igot, idata[0:N])
      69    {
      70  #pragma acc parallel loop
      71      for (i = 0; i < N; i++)
      72        {
      73  #pragma acc atomic capture
      74          idata[i] = --igot;
      75        }
      76    }
      77  
      78    /* BINOP = + */
      79    igot = 0;
      80    iexp = 32;
      81  
      82  #pragma acc data copy (igot, idata[0:N])
      83    {
      84  #pragma acc parallel loop
      85      for (i = 0; i < N; i++)
      86        {
      87          int expr = 1;
      88  
      89  #pragma acc atomic capture
      90          idata[i] = igot += expr;
      91        }
      92    }
      93  
      94    if (iexp != igot)
      95      abort ();
      96  
      97    igot = 0;
      98    iexp = 32;
      99  
     100  #pragma acc data copy (igot, idata[0:N])
     101    {
     102  #pragma acc parallel loop
     103      for (i = 0; i < N; i++)
     104        {
     105          int expr = 1;
     106  
     107  #pragma acc atomic capture
     108          idata[i] = igot = igot + expr;
     109        }
     110    }
     111  
     112    if (iexp != igot)
     113      abort ();
     114  
     115    igot = 0;
     116    iexp = 32;
     117  
     118  #pragma acc data copy (igot, idata[0:N])
     119    {
     120  #pragma acc parallel loop
     121      for (i = 0; i < N; i++)
     122        {
     123          int expr = 1;
     124  
     125  #pragma acc atomic capture
     126          idata[i] = igot = expr + igot;
     127        }
     128    }
     129  
     130    if (iexp != igot)
     131      abort ();
     132  
     133    /* BINOP = * */
     134    lgot = 1LL;
     135    lexp = 1LL << N;
     136  
     137  #pragma acc data copy (lgot, ldata[0:N])
     138    {
     139  #pragma acc parallel loop
     140      for (i = 0; i < N; i++)
     141        {
     142          long long expr = 2LL;
     143  
     144  #pragma acc atomic capture
     145          ldata[i] = lgot *= expr;
     146        }
     147    }
     148  
     149    if (lexp != lgot)
     150      abort ();
     151  
     152    lgot = 1LL;
     153    lexp = 1LL << N;
     154  
     155  #pragma acc data copy (lgot, ldata[0:N])
     156    {
     157  #pragma acc parallel loop
     158      for (i = 0; i < N; i++)
     159        {
     160          long long expr = 2LL;
     161  
     162  #pragma acc atomic capture
     163          ldata[i] = lgot = lgot * expr;
     164        }
     165    }
     166  
     167    if (lexp != lgot)
     168      abort ();
     169  
     170    lgot = 1LL;
     171    lexp = 1LL << N;
     172  
     173  #pragma acc data copy (lgot, ldata[0:N])
     174    {
     175  #pragma acc parallel loop
     176      for (i = 0; i < N; i++)
     177        {
     178          long long expr = 2LL;
     179  
     180  #pragma acc atomic capture
     181          ldata[i] = lgot = expr * lgot;
     182        }
     183    }
     184  
     185    if (lexp != lgot)
     186      abort ();
     187  
     188    /* BINOP = - */
     189    igot = 32;
     190    iexp = 0;
     191  
     192  #pragma acc data copy (igot, idata[0:N])
     193    {
     194  #pragma acc parallel loop
     195      for (i = 0; i < N; i++)
     196        {
     197          int expr = 1;
     198  
     199  #pragma acc atomic capture
     200          idata[i] = igot -= expr;
     201        }
     202    }
     203  
     204    if (iexp != igot)
     205      abort ();
     206  
     207    igot = 32;
     208    iexp = 0;
     209  
     210  #pragma acc data copy (igot, idata[0:N])
     211    {
     212  #pragma acc parallel loop
     213      for (i = 0; i < N; i++)
     214        {
     215          int expr = 1;
     216  
     217  #pragma acc atomic capture
     218          idata[i] = igot = igot - expr;
     219        }
     220    }
     221  
     222    if (iexp != igot)
     223      abort ();
     224  
     225    igot = 32;
     226    iexp = 32;
     227  
     228  #pragma acc data copy (igot, idata[0:N])
     229    {
     230  #pragma acc parallel loop
     231      for (i = 0; i < N; i++)
     232        {
     233          int expr = 1;
     234  
     235  #pragma acc atomic capture
     236          idata[i] = igot = expr - igot;
     237        }
     238    }
     239  
     240    if (iexp != igot)
     241      abort ();
     242  
     243  
     244    /* BINOP = / */
     245    lgot = 1LL << 32;
     246    lexp = 1LL;
     247  
     248  #pragma acc data copy (lgot, ldata[0:N])
     249    {
     250  #pragma acc parallel loop
     251      for (i = 0; i < N; i++)
     252        {
     253        long long expr = 2LL;
     254  
     255  #pragma acc atomic capture
     256          ldata[i] = lgot /= expr;
     257        }
     258    }
     259  
     260    if (lexp != lgot)
     261      abort ();
     262  
     263    lgot = 1LL << 32;
     264    lexp = 1LL;
     265  
     266  #pragma acc data copy (lgot, ldata[0:N])
     267    {
     268  #pragma acc parallel loop
     269      for (i = 0; i < N; i++)
     270        {
     271          long long expr = 2LL;
     272  
     273  #pragma acc atomic capture
     274          ldata[i] = lgot = lgot / expr;
     275        }
     276    }
     277  
     278    if (lexp != lgot)
     279      abort ();
     280  
     281    lgot = 2LL;
     282    lexp = 2LL;
     283  
     284  #pragma acc data copy (lgot, ldata[0:N])
     285    {
     286  #pragma acc parallel loop
     287      for (i = 0; i < N; i++)
     288        {
     289        long long expr = 1LL << N;
     290  
     291  #pragma acc atomic capture
     292          ldata[i] = lgot = expr / lgot;
     293        }
     294    }
     295  
     296    if (lexp != lgot)
     297      abort ();
     298  
     299    /* BINOP = & */
     300    igot = ~0;
     301    iexp = 0;
     302  
     303  #pragma acc data copy (igot, idata[0:N])
     304    {
     305  #pragma acc parallel loop
     306      for (i = 0; i < N; i++)
     307        {
     308          int expr = 1 << i;
     309  
     310  #pragma acc atomic capture
     311          idata[i] = igot &= expr;
     312        }
     313    }
     314  
     315    if (iexp != igot)
     316      abort ();
     317  
     318    igot = ~0;
     319    iexp = 0;
     320  
     321  #pragma acc data copy (igot, idata[0:N])
     322    {
     323  #pragma acc parallel loop
     324      for (i = 0; i < N; i++)
     325        {
     326          int expr = 1 << i;
     327  
     328  #pragma acc atomic capture
     329          idata[i] = igot = igot & expr;
     330      }
     331    }
     332  
     333    if (iexp != igot)
     334      abort ();
     335  
     336    igot = ~0;
     337    iexp = 0;
     338  
     339  #pragma acc data copy (igot, idata[0:N])
     340    {
     341  #pragma acc parallel loop
     342      for (i = 0; i < N; i++)
     343        {
     344          int expr = 1 << i;
     345  
     346  #pragma acc atomic capture
     347          idata[i] = igot = expr & igot;
     348       }
     349    }
     350  
     351    if (iexp != igot)
     352      abort ();
     353  
     354    /* BINOP = ^ */
     355    igot = ~0;
     356    iexp = 0;
     357  
     358  #pragma acc data copy (igot, idata[0:N])
     359    {
     360  #pragma acc parallel loop
     361      for (i = 0; i < N; i++)
     362        {
     363          int expr = 1 << i;
     364  
     365  #pragma acc atomic capture
     366          idata[i] = igot ^= expr;
     367       }
     368    }
     369  
     370    if (iexp != igot)
     371      abort ();
     372  
     373    igot = ~0;
     374    iexp = 0;
     375  
     376  #pragma acc data copy (igot, idata[0:N])
     377    {
     378  #pragma acc parallel loop
     379      for (i = 0; i < N; i++)
     380        {
     381          int expr = 1 << i;
     382  
     383  #pragma acc atomic capture
     384          idata[i] = igot = igot ^ expr;
     385        }
     386    }
     387  
     388    if (iexp != igot)
     389      abort ();
     390  
     391    igot = ~0;
     392    iexp = 0;
     393  
     394  #pragma acc data copy (igot, idata[0:N])
     395    {
     396  #pragma acc parallel loop
     397      for (i = 0; i < N; i++)
     398        {
     399          int expr = 1 << i;
     400  
     401  #pragma acc atomic capture
     402          idata[i] = igot = expr ^ igot;
     403        }
     404    }
     405  
     406    if (iexp != igot)
     407      abort ();
     408  
     409    /* BINOP = | */
     410    igot = 0;
     411    iexp = ~0;
     412  
     413  #pragma acc data copy (igot, idata[0:N])
     414    {
     415  #pragma acc parallel loop
     416      for (i = 0; i < N; i++)
     417        {
     418          int expr = 1 << i;
     419  
     420  #pragma acc atomic capture
     421          idata[i] = igot |= expr;
     422        }
     423    }
     424  
     425    if (iexp != igot)
     426      abort ();
     427  
     428    igot = 0;
     429    iexp = ~0;
     430  
     431  #pragma acc data copy (igot, idata[0:N])
     432    {
     433  #pragma acc parallel loop
     434      for (i = 0; i < N; i++)
     435        {
     436          int expr = 1 << i;
     437  
     438  #pragma acc atomic capture
     439          idata[i] = igot = igot | expr;
     440        }
     441    }
     442  
     443    if (iexp != igot)
     444      abort ();
     445  
     446    igot = 0;
     447    iexp = ~0;
     448  
     449  #pragma acc data copy (igot, idata[0:N])
     450    {
     451  #pragma acc parallel loop
     452      for (i = 0; i < N; i++)
     453        {
     454          int expr = 1 << i;
     455  
     456  #pragma acc atomic capture
     457          idata[i] = igot = expr | igot;
     458        }
     459    }
     460  
     461    if (iexp != igot)
     462      abort ();
     463  
     464    /* BINOP = << */
     465    lgot = 1LL;
     466    lexp = 1LL << N;
     467  
     468  #pragma acc data copy (lgot, ldata[0:N])
     469    {
     470  #pragma acc parallel loop
     471      for (i = 0; i < N; i++)
     472        {
     473          int expr = 1;
     474  
     475  #pragma acc atomic capture
     476          ldata[i] = lgot <<= expr;
     477        }
     478    }
     479  
     480    if (lexp != lgot)
     481      abort ();
     482  
     483    lgot = 1LL;
     484    lexp = 1LL << N;
     485  
     486  #pragma acc data copy (lgot, ldata[0:N])
     487    {
     488  #pragma acc parallel loop
     489      for (i = 0; i < N; i++)
     490        {
     491          int expr = 1;
     492  
     493  #pragma acc atomic capture
     494          idata[i] = lgot = lgot << expr;
     495        }
     496    }
     497  
     498    if (lexp != lgot)
     499      abort ();
     500  
     501    lgot = 1LL;
     502    lexp = 2LL;
     503  
     504  #pragma acc data copy (lgot, ldata[0:N])
     505    {
     506  #pragma acc parallel
     507      {
     508        long long expr = 1LL;
     509  
     510  #pragma acc atomic capture
     511        ldata[0] = lgot = expr << lgot;
     512      }
     513    }
     514  
     515    if (lexp != lgot)
     516      abort ();
     517  
     518    /* BINOP = >> */
     519    lgot = 1LL << N;
     520    lexp = 1LL;
     521  
     522  #pragma acc data copy (lgot, ldata[0:N])
     523    {
     524  #pragma acc parallel loop
     525      for (i = 0; i < N; i++)
     526        {
     527          long long expr = 1LL;
     528  
     529  #pragma acc atomic capture
     530          ldata[i] = lgot >>= expr;
     531        }
     532    }
     533  
     534    if (lexp != lgot)
     535      abort ();
     536  
     537    lgot = 1LL << N;
     538    lexp = 1LL;
     539  
     540  #pragma acc data copy (lgot, ldata[0:N])
     541    {
     542  #pragma acc parallel loop
     543      for (i = 0; i < N; i++)
     544        {
     545          int expr = 1;
     546  
     547  #pragma acc atomic capture
     548          ldata[i] = lgot = lgot >> expr;
     549        }
     550    }
     551  
     552    if (lexp != lgot)
     553      abort ();
     554  
     555    lgot = 1LL << 63;
     556    lexp = 1LL << 32;
     557  
     558  #pragma acc data copy (lgot, ldata[0:N])
     559    {
     560  #pragma acc parallel
     561      {
     562        long long expr = 1LL << 32;
     563  
     564  #pragma acc atomic capture
     565        ldata[0] = lgot = expr >> lgot;
     566      }
     567    }
     568  
     569    if (lexp != lgot)
     570      abort ();
     571  
     572    fgot = 0.0;
     573    fexp = 32.0;
     574  
     575  #pragma acc data copy (fgot, fdata[0:N])
     576    {
     577  #pragma acc parallel loop
     578      for (i = 0; i < N; i++)
     579        {
     580  #pragma acc atomic capture
     581          fdata[i] = fgot++;
     582        }
     583    }
     584  
     585    if (fexp != fgot)
     586      abort ();
     587  
     588    fgot = 32.0;
     589    fexp = 0.0;
     590  
     591  #pragma acc data copy (fgot, fdata[0:N])
     592    {
     593  #pragma acc parallel loop
     594      for (i = 0; i < N; i++)
     595        {
     596  #pragma acc atomic capture
     597          fdata[i] = fgot--;
     598        }
     599    }
     600  
     601    if (fexp != fgot)
     602      abort ();
     603  
     604    fgot = 0.0;
     605    fexp = 32.0;
     606  
     607  #pragma acc data copy (fgot, fdata[0:N])
     608    {
     609  #pragma acc parallel loop
     610      for (i = 0; i < N; i++)
     611        {
     612  #pragma acc atomic capture
     613          fdata[i] = ++fgot;
     614        }
     615    }
     616  
     617    if (fexp != fgot)
     618      abort ();
     619  
     620    fgot = 32.0;
     621    fexp = 0.0;
     622  
     623  #pragma acc data copy (fgot, fdata[0:N])
     624    {
     625  #pragma acc parallel loop
     626      for (i = 0; i < N; i++)
     627        {
     628  #pragma acc atomic capture
     629          fdata[i] = --fgot;
     630        }
     631    }
     632  
     633    if (fexp != fgot)
     634      abort ();
     635  
     636    /* BINOP = + */
     637    fgot = 0.0;
     638    fexp = 32.0;
     639  
     640  #pragma acc data copy (fgot, fdata[0:N])
     641    {
     642  #pragma acc parallel loop
     643      for (i = 0; i < N; i++)
     644        {
     645          float expr = 1.0;
     646  
     647  #pragma acc atomic capture
     648          fdata[i] = fgot += expr;
     649        }
     650    }
     651  
     652    if (fexp != fgot)
     653      abort ();
     654  
     655    fgot = 0.0;
     656    fexp = 32.0;
     657  
     658  #pragma acc data copy (fgot, fdata[0:N])
     659    {
     660  #pragma acc parallel loop
     661      for (i = 0; i < N; i++)
     662        {
     663          float expr = 1.0;
     664  
     665  #pragma acc atomic capture
     666          fdata[i] = fgot = fgot + expr;
     667        }
     668    }
     669  
     670    if (fexp != fgot)
     671      abort ();
     672  
     673    fgot = 0.0;
     674    fexp = 32.0;
     675  
     676  #pragma acc data copy (fgot, fdata[0:N])
     677    {
     678  #pragma acc parallel loop
     679      for (i = 0; i < N; i++)
     680        {
     681          float expr = 1.0;
     682  
     683  #pragma acc atomic capture
     684          fdata[i] = fgot = expr + fgot;
     685        }
     686    }
     687  
     688    if (fexp != fgot)
     689      abort ();
     690  
     691    /* BINOP = * */
     692    fgot = 1.0;
     693    fexp = 8192.0*8192.0*64.0;
     694  
     695  #pragma acc data copy (fgot, fdata[0:N])
     696    {
     697  #pragma acc parallel loop
     698      for (i = 0; i < N; i++)
     699        {
     700          float expr = 2.0;
     701  
     702  #pragma acc atomic capture
     703          fdata[i] = fgot *= expr;
     704        }
     705    }
     706  
     707    if (fexp != fgot)
     708      abort ();
     709  
     710    fgot = 1.0;
     711    fexp = 8192.0*8192.0*64.0;
     712  
     713  #pragma acc data copy (fgot, fdata[0:N])
     714    {
     715  #pragma acc parallel loop
     716      for (i = 0; i < N; i++)
     717        {
     718          long long expr = 2LL;
     719  
     720  #pragma acc atomic capture
     721          fdata[i] = fgot = fgot * expr;
     722        }
     723    }
     724  
     725    if (fexp != fgot)
     726      abort ();
     727  
     728    fgot = 1.0;
     729    fexp = 8192.0*8192.0*64.0;
     730  
     731  #pragma acc data copy (fgot, fdata[0:N])
     732    {
     733  #pragma acc parallel loop
     734      for (i = 0; i < N; i++)
     735        {
     736          float expr = 2.0;
     737  
     738  #pragma acc atomic capture
     739          fdata[i] = fgot = expr * fgot;
     740        }
     741    }
     742  
     743    if (fexp != fgot)
     744      abort ();
     745  
     746    /* BINOP = - */
     747    fgot = 32.0;
     748    fexp = 0.0;
     749  
     750  #pragma acc data copy (fgot, fdata[0:N])
     751    {
     752  #pragma acc parallel loop
     753      for (i = 0; i < N; i++)
     754        {
     755          float expr = 1.0;
     756  
     757  #pragma acc atomic capture
     758          fdata[i] = fgot -= expr;
     759        }
     760    }
     761  
     762    if (fexp != fgot)
     763      abort ();
     764  
     765    fgot = 32.0;
     766    fexp = 0.0;
     767  
     768  #pragma acc data copy (fgot, fdata[0:N])
     769    {
     770  #pragma acc parallel loop
     771      for (i = 0; i < N; i++)
     772        {
     773          float expr = 1.0;
     774  
     775  #pragma acc atomic capture
     776          fdata[i] = fgot = fgot - expr;
     777        }
     778    }
     779  
     780    if (fexp != fgot)
     781      abort ();
     782  
     783    fgot = 1.0;
     784    fexp = 0.0;
     785  
     786  #pragma acc data copy (fgot, fdata[0:N])
     787    {
     788  #pragma acc parallel loop
     789      for (i = 0; i < N; i++)
     790        {
     791          float expr = 32.0;
     792  
     793  #pragma acc atomic capture
     794          fdata[i] = fgot = expr - fgot;
     795        }
     796    }
     797  
     798    int ones = 0, thirtyones = 0;
     799  
     800    for (i = 0; i < N; i++)
     801      if (fdata[i] == 31.0)
     802        thirtyones++;
     803      else if (fdata[i] == 1.0)
     804        ones++;
     805  
     806    if (ones != N / 2 || thirtyones != N / 2)
     807      abort ();
     808  
     809  
     810    /* BINOP = / */
     811    fexp = 1.0;
     812    fgot = 8192.0*8192.0*64.0;
     813  
     814  #pragma acc data copy (fgot, fdata[0:N])
     815    {
     816  #pragma acc parallel loop
     817      for (i = 0; i < N; i++)
     818        {
     819          float expr = 2.0;
     820  
     821  #pragma acc atomic capture
     822          fdata[i] = fgot /= expr;
     823        }
     824    }
     825  
     826    if (fexp != fgot)
     827      abort ();
     828  
     829    fexp = 1.0;
     830    fgot = 8192.0*8192.0*64.0;
     831  
     832  #pragma acc data copy (fgot, fdata[0:N])
     833    {
     834  #pragma acc parallel loop
     835      for (i = 0; i < N; i++)
     836        {
     837          float expr = 2.0;
     838  
     839  #pragma acc atomic capture
     840          fdata[i] = fgot = fgot / expr;
     841        }
     842    }
     843  
     844    if (fexp != fgot)
     845      abort ();
     846  
     847    fexp = 1.0;
     848    fgot = 8192.0*8192.0*64.0;
     849  
     850  #pragma acc data copy (fgot, fdata[0:N])
     851    {
     852  #pragma acc parallel
     853      {
     854        float expr = 8192.0*8192.0*64.0;
     855  
     856  #pragma acc atomic capture
     857        fdata[0] = fgot = expr / fgot;
     858      }
     859    }
     860  
     861    if (fexp != fgot)
     862      abort ();
     863    
     864    return 0;
     865  }