1 /* { dg-do run } */
2 
3 #include <stdlib.h>
4 
5 int
main(int argc,char ** argv)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 }
866