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