1 /* { dg-do run } */
2 /* { dg-additional-options "-fmodulo-sched -fmodulo-sched-allow-regmoves" } */
3 
4 #include <stdlib.h>
5 
6 int
main(int argc,char ** argv)7 main(int argc, char **argv)
8 {
9   int   iexp, igot, imax, imin;
10   long long lexp, lgot;
11   int   N = 32;
12   int	i;
13   int   idata[N];
14   long long ldata[N];
15   float fexp, fgot;
16   float fdata[N];
17 
18   igot = 1234;
19   iexp = 31;
20 
21   for (i = 0; i < N; i++)
22     idata[i] = i;
23 
24 #pragma acc data copy (igot, idata[0:N])
25   {
26 #pragma acc parallel loop
27     for (i = 0; i < N; i++)
28 #pragma acc atomic capture
29       { idata[i] = igot; igot = i; }
30   }
31 
32   imax = 0;
33   imin = N;
34 
35   for (i = 0; i < N; i++)
36     {
37       imax = idata[i] > imax ? idata[i] : imax;
38       imin = idata[i] < imin ? idata[i] : imin;
39     }
40 
41   if (imax != 1234 || imin != 0)
42     abort ();
43 
44   return 0;
45 
46   igot = 0;
47   iexp = 32;
48 
49 #pragma acc data copy (igot, idata[0:N])
50   {
51 #pragma acc parallel loop
52     for (i = 0; i < N; i++)
53 #pragma acc atomic capture
54       { idata[i] = igot; igot++; }
55   }
56 
57   if (iexp != igot)
58     abort ();
59 
60   igot = 0;
61   iexp = 32;
62 
63 #pragma acc data copy (igot, idata[0:N])
64   {
65 #pragma acc parallel loop
66     for (i = 0; i < N; i++)
67 #pragma acc atomic capture
68       { idata[i] = igot; ++igot; }
69   }
70 
71   if (iexp != igot)
72     abort ();
73 
74   igot = 0;
75   iexp = 32;
76 
77 #pragma acc data copy (igot, idata[0:N])
78   {
79 #pragma acc parallel loop
80     for (i = 0; i < N; i++)
81 #pragma acc atomic capture
82       { ++igot; idata[i] = igot; }
83   }
84 
85   if (iexp != igot)
86     abort ();
87 
88   igot = 0;
89   iexp = 32;
90 
91 #pragma acc data copy (igot, idata[0:N])
92   {
93 #pragma acc parallel loop
94     for (i = 0; i < N; i++)
95 #pragma acc atomic capture
96       { igot++; idata[i] = igot; }
97   }
98 
99   if (iexp != igot)
100     abort ();
101 
102   igot = 32;
103   iexp = 0;
104 
105 #pragma acc data copy (igot, idata[0:N])
106   {
107 #pragma acc parallel loop
108     for (i = 0; i < N; i++)
109 #pragma acc atomic capture
110       { idata[i] = igot; igot--; }
111   }
112 
113   if (iexp != igot)
114     abort ();
115 
116   igot = 32;
117   iexp = 0;
118 
119 #pragma acc data copy (igot, idata[0:N])
120   {
121 #pragma acc parallel loop
122     for (i = 0; i < N; i++)
123 #pragma acc atomic capture
124       { idata[i] = igot; --igot; }
125   }
126 
127   if (iexp != igot)
128     abort ();
129 
130   igot = 32;
131   iexp = 0;
132 
133 #pragma acc data copy (igot, idata[0:N])
134   {
135 #pragma acc parallel loop
136     for (i = 0; i < N; i++)
137 #pragma acc atomic capture
138       { --igot; idata[i] = igot; }
139   }
140 
141   if (iexp != igot)
142     abort ();
143 
144   igot = 32;
145   iexp = 0;
146 
147 #pragma acc data copy (igot, idata[0:N])
148   {
149 #pragma acc parallel loop
150     for (i = 0; i < N; i++)
151 #pragma acc atomic capture
152       { igot--; idata[i] = igot; }
153   }
154 
155   if (iexp != igot)
156     abort ();
157 
158   /* BINOP = + */
159   igot = 0;
160   iexp = 32;
161 
162 #pragma acc data copy (igot, idata[0:N])
163   {
164 #pragma acc parallel loop
165     for (i = 0; i < N; i++)
166       {
167         int expr = 1;
168 
169 #pragma acc atomic capture
170         { idata[i] = igot; igot += expr; }
171       }
172   }
173 
174   if (iexp != igot)
175     abort ();
176 
177   igot = 0;
178   iexp = 32;
179 
180 #pragma acc data copy (igot, idata[0:N])
181   {
182 #pragma acc parallel loop
183     for (i = 0; i < N; i++)
184       {
185         int expr = 1;
186 
187 #pragma acc atomic capture
188         { igot += expr; idata[i] = igot; }
189       }
190   }
191 
192   if (iexp != igot)
193     abort ();
194 
195   igot = 0;
196   iexp = 32;
197 
198 #pragma acc data copy (igot, idata[0:N])
199   {
200 #pragma acc parallel loop
201     for (i = 0; i < N; i++)
202       {
203         int expr = 1;
204 
205 #pragma acc atomic capture
206         { idata[i] = igot; igot = igot + expr; }
207       }
208   }
209 
210   if (iexp != igot)
211     abort ();
212 
213   igot = 0;
214   iexp = 32;
215 
216 #pragma acc data copy (igot, idata[0:N])
217   {
218 #pragma acc parallel loop
219     for (i = 0; i < N; i++)
220       {
221         int expr = 1;
222 
223 #pragma acc atomic capture
224         { idata[i] = igot; igot = expr + igot; }
225       }
226   }
227 
228   if (iexp != igot)
229     abort ();
230 
231   igot = 0;
232   iexp = 32;
233 
234 #pragma acc data copy (igot, idata[0:N])
235   {
236 #pragma acc parallel loop
237     for (i = 0; i < N; i++)
238       {
239         int expr = 1;
240 
241 #pragma acc atomic capture
242         { igot = igot + expr; idata[i] = igot; }
243       }
244   }
245 
246   if (iexp != igot)
247     abort ();
248 
249 
250   igot = 0;
251   iexp = 32;
252 
253 #pragma acc data copy (igot, idata[0:N])
254   {
255 #pragma acc parallel loop
256     for (i = 0; i < N; i++)
257       {
258         int expr = 1;
259 
260 #pragma acc atomic capture
261         { igot = expr + igot; idata[i] = igot; }
262       }
263   }
264 
265   if (iexp != igot)
266     abort ();
267 
268   /* BINOP = * */
269   lgot = 1LL;
270   lexp = 1LL << 32;
271 
272 #pragma acc data copy (lgot, ldata[0:N])
273   {
274 #pragma acc parallel loop
275     for (i = 0; i < N; i++)
276       {
277       long long expr = 2LL;
278 
279 #pragma acc atomic capture
280       { ldata[i] = lgot; lgot *= expr; }
281     }
282   }
283 
284   if (lexp != lgot)
285     abort ();
286 
287   lgot = 1LL;
288   lexp = 1LL << 32;
289 
290 #pragma acc data copy (lgot, ldata[0:N])
291   {
292 #pragma acc parallel loop
293     for (i = 0; i < N; i++)
294       {
295         long long expr = 2LL;
296 
297 #pragma acc atomic capture
298         { lgot *= expr; ldata[i] = lgot; }
299       }
300   }
301 
302   if (lexp != lgot)
303     abort ();
304 
305   lgot = 1LL;
306   lexp = 1LL << 32;
307 
308 #pragma acc data copy (lgot, ldata[0:N])
309   {
310 #pragma acc parallel loop
311     for (i = 0; i < N; i++)
312       {
313         long long expr = 2LL;
314 
315 #pragma acc atomic capture
316         { ldata[i] = lgot; lgot = lgot * expr; }
317       }
318   }
319 
320   if (lexp != lgot)
321     abort ();
322 
323   lgot = 1LL;
324   lexp = 1LL << 32;
325 
326 #pragma acc data copy (lgot, ldata[0:N])
327   {
328 #pragma acc parallel loop
329     for (i = 0; i < N; i++)
330       {
331       long long expr = 2LL;
332 
333 #pragma acc atomic capture
334       { ldata[i] = lgot; lgot = expr * lgot; }
335     }
336   }
337 
338   if (lexp != lgot)
339     abort ();
340 
341   lgot = 1LL;
342   lexp = 1LL << 32;
343 
344 #pragma acc data copy (lgot, ldata[0:N])
345   {
346 #pragma acc parallel loop
347     for (i = 0; i < N; i++)
348       {
349         long long expr = 2LL;
350 
351 #pragma acc atomic capture
352         { lgot = lgot * expr; ldata[i] = lgot; }
353       }
354   }
355 
356   if (lexp != lgot)
357     abort ();
358 
359   lgot = 1LL;
360   lexp = 1LL << 32;
361 
362 #pragma acc data copy (lgot, ldata[0:N])
363   {
364 #pragma acc parallel loop
365     for (i = 0; i < N; i++)
366       {
367       long long expr = 2;
368 
369 #pragma acc atomic capture
370       { lgot = expr * lgot; ldata[i] = lgot; }
371     }
372   }
373 
374   if (lexp != lgot)
375     abort ();
376 
377   /* BINOP = - */
378   igot = 32;
379   iexp = 0;
380 
381 #pragma acc data copy (igot, idata[0:N])
382   {
383 #pragma acc parallel loop
384     for (i = 0; i < N; i++)
385       {
386       int expr = 1;
387 
388 #pragma acc atomic capture
389       { idata[i] = igot; igot -= expr; }
390     }
391   }
392 
393   if (iexp != igot)
394     abort ();
395 
396   igot = 32;
397   iexp = 0;
398 
399 #pragma acc data copy (igot, idata[0:N])
400   {
401 #pragma acc parallel loop
402     for (i = 0; i < N; i++)
403       {
404         int expr = 1;
405 
406 #pragma acc atomic capture
407         { igot -= expr; idata[i] = igot; }
408       }
409   }
410 
411   if (iexp != igot)
412     abort ();
413 
414   igot = 32;
415   iexp = 0;
416 
417 #pragma acc data copy (igot, idata[0:N])
418   {
419 #pragma acc parallel loop
420     for (i = 0; i < N; i++)
421       {
422         int expr = 1;
423 
424 #pragma acc atomic capture
425         { idata[i] = igot; igot = igot - expr; }
426       }
427   }
428 
429   if (iexp != igot)
430     abort ();
431 
432   igot = 1;
433   iexp = 1;
434 
435 #pragma acc data copy (igot, idata[0:N])
436   {
437 #pragma acc parallel loop
438     for (i = 0; i < N; i++)
439       {
440       int expr = 1;
441 
442 #pragma acc atomic capture
443       { idata[i] = igot; igot = expr - igot; }
444     }
445   }
446 
447   for (i = 0; i < N; i++)
448     if (i % 2 == 0)
449       {
450 	if (idata[i] != 1)
451 	  abort ();
452       }
453     else
454       {
455 	if (idata[i] != 0)
456 	  abort ();
457       }
458 
459   if (iexp != igot)
460     abort ();
461 
462   igot = 1;
463   iexp = -31;
464 
465 #pragma acc data copy (igot, idata[0:N])
466   {
467 #pragma acc parallel loop
468     for (i = 0; i < N; i++)
469       {
470         int expr = 1;
471 
472 #pragma acc atomic capture
473         { igot = igot - expr; idata[i] = igot; }
474       }
475   }
476 
477   if (iexp != igot)
478     abort ();
479 
480   igot = 1;
481   iexp = 1;
482 
483 #pragma acc data copy (igot, idata[0:N])
484   {
485 #pragma acc parallel loop
486     for (i = 0; i < N; i++)
487       {
488         int expr = 1;
489 
490 #pragma acc atomic capture
491         { igot = expr - igot; idata[i] = igot; }
492       }
493   }
494 
495   for (i = 0; i < N; i++)
496     if (i % 2 == 0)
497       {
498 	if (idata[i] != 0)
499 	  abort ();
500       }
501     else
502       {
503 	if (idata[i] != 1)
504 	  abort ();
505       }
506 
507   if (iexp != igot)
508     abort ();
509 
510   /* BINOP = / */
511   lgot = 1LL << 32;
512   lexp = 1LL;
513 
514 #pragma acc data copy (lgot, ldata[0:N])
515   {
516 #pragma acc parallel loop
517     for (i = 0; i < N; i++)
518       {
519         long long expr = 2LL;
520 
521 #pragma acc atomic capture
522         { ldata[i] = lgot; lgot /= expr; }
523       }
524   }
525 
526   if (lexp != lgot)
527     abort ();
528 
529   lgot = 1LL << 32;
530   lexp = 1LL;
531 
532 #pragma acc data copy (lgot, ldata[0:N])
533   {
534 #pragma acc parallel loop
535     for (i = 0; i < N; i++)
536       {
537         long long expr = 2LL;
538 
539 #pragma acc atomic capture
540         { lgot /= expr; ldata[i] = lgot; }
541       }
542   }
543 
544   if (lexp != lgot)
545     abort ();
546 
547   lgot = 1LL << 32;
548   lexp = 1LL;
549 
550 #pragma acc data copy (lgot, ldata[0:N])
551   {
552 #pragma acc parallel loop
553     for (i = 0; i < N; i++)
554       {
555       long long expr = 2LL;
556 
557 #pragma acc atomic capture
558       { ldata[i] = lgot; lgot = lgot / expr; }
559     }
560   }
561 
562   if (lexp != lgot)
563     abort ();
564 
565   lgot = 2LL;
566   lexp = 2LL;
567 
568 #pragma acc data copy (lgot, ldata[0:N])
569   {
570 #pragma acc parallel loop
571     for (i = 0; i < N; i++)
572       {
573         long long expr = 1LL << N;
574 
575 #pragma acc atomic capture
576         { ldata[i] = lgot; lgot = expr / lgot; }
577       }
578   }
579 
580   if (lexp != lgot)
581     abort ();
582 
583   lgot = 2LL;
584   lexp = 2LL;
585 
586 #pragma acc data copy (lgot, ldata[0:N])
587   {
588 #pragma acc parallel loop
589     for (i = 0; i < N; i++)
590       {
591         long long expr = 1LL << N;
592 
593 #pragma acc atomic capture
594         { lgot = lgot / expr; ldata[i] = lgot; }
595       }
596   }
597 
598   if (lexp != lgot)
599     abort ();
600 
601   lgot = 2LL;
602   lexp = 2LL;
603 
604 #pragma acc data copy (lgot, ldata[0:N])
605   {
606 #pragma acc parallel loop
607     for (i = 0; i < N; i++)
608       {
609         long long expr = 1LL << N;
610 
611 #pragma acc atomic capture
612         { lgot = expr / lgot; ldata[i] = lgot; }
613       }
614   }
615 
616   if (lexp != lgot)
617     abort ();
618 
619   /* BINOP = & */
620   lgot = ~0LL;
621   lexp = 0LL;
622 
623 #pragma acc data copy (lgot, ldata[0:N])
624   {
625 #pragma acc parallel loop
626     for (i = 0; i < N; i++)
627       {
628         long long expr = ~(1 << i);
629 
630 #pragma acc atomic capture
631         { ldata[i] = lgot; lgot &= expr; }
632       }
633   }
634 
635   if (lexp != lgot)
636     abort ();
637 
638   lgot = ~0LL;
639   iexp = 0LL;
640 
641 #pragma acc data copy (lgot, ldata[0:N])
642   {
643 #pragma acc parallel loop
644     for (i = 0; i < N; i++)
645       {
646         long long expr = ~(1 << i);
647 
648 #pragma acc atomic capture
649         { lgot &= expr; ldata[i] = lgot; }
650       }
651   }
652 
653   if (lexp != lgot)
654     abort ();
655 
656   lgot = ~0LL;
657   lexp = 0LL;
658 
659 #pragma acc data copy (lgot, ldata[0:N])
660   {
661 #pragma acc parallel loop
662     for (i = 0; i < N; i++)
663       {
664         long long expr = ~(1 << i);
665 
666 #pragma acc atomic capture
667         { ldata[i] = lgot; lgot = lgot & expr; }
668       }
669   }
670 
671   if (lexp != lgot)
672     abort ();
673 
674   lgot = ~0LL;
675   lexp = 0LL;
676 
677 #pragma acc data copy (lgot, ldata[0:N])
678   {
679 #pragma acc parallel loop
680     for (i = 0; i < N; i++)
681       {
682         long long expr = ~(1 << i);
683 
684 #pragma acc atomic capture
685         { ldata[i] = lgot; lgot = expr & lgot; }
686       }
687   }
688 
689   if (lexp != lgot)
690     abort ();
691 
692   lgot = ~0LL;
693   iexp = 0LL;
694 
695 #pragma acc data copy (lgot, ldata[0:N])
696   {
697 #pragma acc parallel loop
698     for (i = 0; i < N; i++)
699       {
700         long long expr = ~(1 << i);
701 
702 #pragma acc atomic capture
703         { lgot = lgot & expr; ldata[i] = lgot; }
704       }
705   }
706 
707   if (lexp != lgot)
708     abort ();
709 
710   lgot = ~0LL;
711   lexp = 0LL;
712 
713 #pragma acc data copy (lgot, ldata[0:N])
714   {
715 #pragma acc parallel loop
716     for (i = 0; i < N; i++)
717       {
718       long long expr = ~(1 << i);
719 
720 #pragma acc atomic capture
721       { lgot = expr & lgot; ldata[i] = lgot; }
722     }
723   }
724 
725   if (lexp != lgot)
726     abort ();
727 
728   /* BINOP = ^ */
729   lgot = ~0LL;
730   lexp = 0LL;
731 
732 #pragma acc data copy (lgot, ldata[0:N])
733   {
734 #pragma acc parallel loop
735     for (i = 0; i < N; i++)
736       {
737       long long expr = 1 << i;
738 
739 #pragma acc atomic capture
740       { ldata[i] = lgot; lgot ^= expr; }
741     }
742   }
743 
744   if (lexp != lgot)
745     abort ();
746 
747   lgot = ~0LL;
748   iexp = 0LL;
749 
750 #pragma acc data copy (lgot, ldata[0:N])
751   {
752 #pragma acc parallel loop
753     for (i = 0; i < N; i++)
754       {
755         long long expr = ~(1 << i);
756 
757 #pragma acc atomic capture
758         { lgot ^= expr; ldata[i] = lgot; }
759       }
760   }
761 
762   if (lexp != lgot)
763     abort ();
764 
765   lgot = ~0LL;
766   lexp = 0LL;
767 
768 #pragma acc data copy (lgot, ldata[0:N])
769   {
770 #pragma acc parallel loop
771     for (i = 0; i < N; i++)
772       {
773         long long expr = ~(1 << i);
774 
775 #pragma acc atomic capture
776         { ldata[i] = lgot; lgot = lgot ^ expr; }
777       }
778   }
779 
780   if (lexp != lgot)
781     abort ();
782 
783   lgot = ~0LL;
784   lexp = 0LL;
785 
786 #pragma acc data copy (lgot, ldata[0:N])
787   {
788 #pragma acc parallel loop
789     for (i = 0; i < N; i++)
790       {
791       long long expr = ~(1 << i);
792 
793 #pragma acc atomic capture
794       { ldata[i] = lgot; lgot = expr ^ lgot; }
795     }
796   }
797 
798   if (lexp != lgot)
799     abort ();
800 
801   lgot = ~0LL;
802   iexp = 0LL;
803 
804 #pragma acc data copy (lgot, ldata[0:N])
805   {
806 #pragma acc parallel loop
807     for (i = 0; i < N; i++)
808       {
809         long long expr = ~(1 << i);
810 
811 #pragma acc atomic capture
812         { lgot = lgot ^ expr; ldata[i] = lgot; }
813       }
814   }
815 
816   if (lexp != lgot)
817     abort ();
818 
819   lgot = ~0LL;
820   lexp = 0LL;
821 
822 #pragma acc data copy (lgot, ldata[0:N])
823   {
824 #pragma acc parallel loop
825     for (i = 0; i < N; i++)
826       {
827         long long expr = ~(1 << i);
828 
829 #pragma acc atomic capture
830         { lgot = expr ^ lgot; ldata[i] = lgot; }
831       }
832   }
833 
834   if (lexp != lgot)
835     abort ();
836 
837   /* BINOP = | */
838   lgot = 0LL;
839   lexp = ~0LL;
840 
841 #pragma acc data copy (lgot, ldata[0:N])
842   {
843 #pragma acc parallel loop
844     for (i = 0; i < N; i++)
845       {
846         long long expr = 1 << i;
847 
848 #pragma acc atomic capture
849         { ldata[i] = lgot; lgot |= expr; }
850       }
851   }
852 
853   if (lexp != lgot)
854     abort ();
855 
856   lgot = 0LL;
857   iexp = ~0LL;
858 
859 #pragma acc data copy (lgot, ldata[0:N])
860   {
861 #pragma acc parallel loop
862     for (i = 0; i < N; i++)
863       {
864         long long expr = ~(1 << i);
865 
866 #pragma acc atomic capture
867         { lgot |= expr; ldata[i] = lgot; }
868       }
869   }
870 
871   if (lexp != lgot)
872     abort ();
873 
874   lgot = 0LL;
875   lexp = ~0LL;
876 
877 #pragma acc data copy (lgot, ldata[0:N])
878   {
879 #pragma acc parallel loop
880     for (i = 0; i < N; i++)
881       {
882         long long expr = ~(1 << i);
883 
884 #pragma acc atomic capture
885         { ldata[i] = lgot; lgot = lgot | expr; }
886       }
887   }
888 
889   if (lexp != lgot)
890     abort ();
891 
892   lgot = 0LL;
893   lexp = ~0LL;
894 
895 #pragma acc data copy (lgot, ldata[0:N])
896   {
897 #pragma acc parallel loop
898     for (i = 0; i < N; i++)
899       {
900         long long expr = ~(1 << i);
901 
902 #pragma acc atomic capture
903         { ldata[i] = lgot; lgot = expr | lgot; }
904       }
905   }
906 
907   if (lexp != lgot)
908     abort ();
909 
910   lgot = 0LL;
911   iexp = ~0LL;
912 
913 #pragma acc data copy (lgot, ldata[0:N])
914   {
915 #pragma acc parallel loop
916     for (i = 0; i < N; i++)
917       {
918         long long expr = ~(1 << i);
919 
920 #pragma acc atomic capture
921         { lgot = lgot | expr; ldata[i] = lgot; }
922       }
923   }
924 
925   if (lexp != lgot)
926     abort ();
927 
928   lgot = 0LL;
929   lexp = ~0LL;
930 
931 #pragma acc data copy (lgot, ldata[0:N])
932   {
933 #pragma acc parallel loop
934     for (i = 0; i < N; i++)
935       {
936         long long expr = ~(1 << i);
937 
938 #pragma acc atomic capture
939         { lgot = expr | lgot; ldata[i] = lgot; }
940       }
941   }
942 
943   if (lexp != lgot)
944     abort ();
945 
946   /* BINOP = << */
947   lgot = 1LL;
948   lexp = 1LL << N;
949 
950 #pragma acc data copy (lgot, ldata[0:N])
951   {
952 #pragma acc parallel loop
953     for (i = 0; i < N; i++)
954       {
955         long long expr = 1LL;
956 
957 #pragma acc atomic capture
958         { ldata[i] = lgot; lgot <<= expr; }
959       }
960   }
961 
962   if (lexp != lgot)
963     abort ();
964 
965   lgot = 1LL;
966   iexp = 1LL << N;
967 
968 #pragma acc data copy (lgot, ldata[0:N])
969   {
970 #pragma acc parallel loop
971     for (i = 0; i < N; i++)
972       {
973         long long expr = 1LL;
974 
975 #pragma acc atomic capture
976         { lgot <<= expr; ldata[i] = lgot; }
977       }
978   }
979 
980   if (lexp != lgot)
981     abort ();
982 
983   lgot = 1LL;
984   lexp = 1LL << N;
985 
986 #pragma acc data copy (lgot, ldata[0:N])
987   {
988 #pragma acc parallel loop
989     for (i = 0; i < N; i++)
990       {
991         long long expr = 1LL;
992 
993 #pragma acc atomic capture
994         { ldata[i] = lgot; lgot = lgot << expr; }
995       }
996   }
997 
998   if (lexp != lgot)
999     abort ();
1000 
1001   lgot = 1LL;
1002   lexp = 2LL;
1003 
1004 #pragma acc data copy (lgot, ldata[0:N])
1005   {
1006 #pragma acc parallel loop
1007     for (i = 0; i < 1; i++)
1008       {
1009         long long expr = 1LL;
1010 
1011 #pragma acc atomic capture
1012         { ldata[i] = lgot; lgot = expr << lgot; }
1013       }
1014   }
1015 
1016   if (lexp != lgot)
1017     abort ();
1018 
1019   lgot = 1LL;
1020   lexp = 2LL;
1021 
1022 #pragma acc data copy (lgot, ldata[0:N])
1023   {
1024 #pragma acc parallel loop
1025     for (i = 0; i < 1; i++)
1026       {
1027         long long expr = 1LL;
1028 
1029 #pragma acc atomic capture
1030         { lgot = lgot << expr; ldata[i] = lgot; }
1031       }
1032   }
1033 
1034   if (lexp != lgot)
1035     abort ();
1036 
1037   lgot = 1LL;
1038   lexp = 2LL;
1039 
1040 #pragma acc data copy (lgot, ldata[0:N])
1041   {
1042 #pragma acc parallel loop
1043     for (i = 0; i < 1; i++)
1044       {
1045         long long expr = 1LL;
1046 
1047 #pragma acc atomic capture
1048         { lgot = expr << lgot; ldata[i] = lgot; }
1049       }
1050   }
1051 
1052   if (lexp != lgot)
1053     abort ();
1054 
1055   /* BINOP = >> */
1056   lgot = 1LL << N;
1057   lexp = 1LL;
1058 
1059 #pragma acc data copy (lgot, ldata[0:N])
1060   {
1061 #pragma acc parallel loop
1062     for (i = 0; i < N; i++)
1063       {
1064         long long expr = 1LL;
1065 
1066 #pragma acc atomic capture
1067         { ldata[i] = lgot; lgot >>= expr; }
1068       }
1069   }
1070 
1071   if (lexp != lgot)
1072     abort ();
1073 
1074   lgot = 1LL << N;
1075   iexp = 1LL;
1076 
1077 #pragma acc data copy (lgot, ldata[0:N])
1078   {
1079 #pragma acc parallel loop
1080     for (i = 0; i < N; i++)
1081       {
1082         long long expr = 1LL;
1083 
1084 #pragma acc atomic capture
1085         { lgot >>= expr; ldata[i] = lgot; }
1086       }
1087   }
1088 
1089   if (lexp != lgot)
1090     abort ();
1091 
1092   lgot = 1LL << N;
1093   lexp = 1LL;
1094 
1095 #pragma acc data copy (lgot, ldata[0:N])
1096   {
1097 #pragma acc parallel loop
1098     for (i = 0; i < N; i++)
1099       {
1100         long long expr = 1LL;
1101 
1102 #pragma acc atomic capture
1103         { ldata[i] = lgot; lgot = lgot >> expr; }
1104       }
1105   }
1106 
1107   if (lexp != lgot)
1108     abort ();
1109 
1110   lgot = 1LL;
1111   lexp = 1LL << (N - 1);
1112 
1113 #pragma acc data copy (lgot, ldata[0:N])
1114   {
1115 #pragma acc parallel loop
1116     for (i = 0; i < 1; i++)
1117       {
1118         long long expr = 1LL << N;
1119 
1120 #pragma acc atomic capture
1121         { ldata[i] = lgot; lgot = expr >> lgot; }
1122     }
1123   }
1124 
1125   if (lexp != lgot)
1126     abort ();
1127 
1128   lgot = 1LL << N;
1129   lexp = 1LL;
1130 
1131 #pragma acc data copy (lgot, ldata[0:N])
1132   {
1133 #pragma acc parallel loop
1134     for (i = 0; i < N; i++)
1135       {
1136         long long expr = 1LL;
1137 
1138 #pragma acc atomic capture
1139         { lgot = lgot >> expr; ldata[i] = lgot; }
1140       }
1141   }
1142 
1143   if (lexp != lgot)
1144     abort ();
1145 
1146   lgot = 1LL;
1147   lexp = 1LL << (N - 1);
1148 
1149 #pragma acc data copy (lgot, ldata[0:N])
1150   {
1151 #pragma acc parallel loop
1152     for (i = 0; i < 1; i++)
1153       {
1154         long long expr = 1LL << N;
1155 
1156 #pragma acc atomic capture
1157         { lgot = expr >> lgot; ldata[i] = lgot; }
1158       }
1159   }
1160 
1161   if (lexp != lgot)
1162     abort ();
1163 
1164   // FLOAT FLOAT FLOAT
1165 
1166   /* BINOP = + */
1167   fgot = 0.0;
1168   fexp = 32.0;
1169 
1170 #pragma acc data copy (fgot, fdata[0:N])
1171   {
1172 #pragma acc parallel loop
1173     for (i = 0; i < N; i++)
1174       {
1175       float expr = 1.0;
1176 
1177 #pragma acc atomic capture
1178       { fdata[i] = fgot; fgot += expr; }
1179     }
1180   }
1181 
1182   if (fexp != fgot)
1183     abort ();
1184 
1185   fgot = 0.0;
1186   fexp = 32.0;
1187 
1188 #pragma acc data copy (fgot, fdata[0:N])
1189   {
1190 #pragma acc parallel loop
1191     for (i = 0; i < N; i++)
1192       {
1193         float expr = 1.0;
1194 
1195 #pragma acc atomic capture
1196         { fgot += expr; fdata[i] = fgot; }
1197       }
1198   }
1199 
1200   if (fexp != fgot)
1201     abort ();
1202 
1203   fgot = 0.0;
1204   fexp = 32.0;
1205 
1206 #pragma acc data copy (fgot, fdata[0:N])
1207   {
1208 #pragma acc parallel loop
1209     for (i = 0; i < N; i++)
1210       {
1211         float expr = 1.0;
1212 
1213 #pragma acc atomic capture
1214         { idata[i] = fgot; fgot = fgot + expr; }
1215       }
1216   }
1217 
1218   if (fexp != fgot)
1219     abort ();
1220 
1221   fgot = 0.0;
1222   fexp = 32.0;
1223 
1224 #pragma acc data copy (fgot, fdata[0:N])
1225   {
1226 #pragma acc parallel loop
1227     for (i = 0; i < N; i++)
1228       {
1229       float expr = 1.0;
1230 
1231 #pragma acc atomic capture
1232       { fdata[i] = fgot; fgot = expr + fgot; }
1233     }
1234   }
1235 
1236   if (fexp != fgot)
1237     abort ();
1238 
1239   fgot = 0.0;
1240   fexp = 32.0;
1241 
1242 #pragma acc data copy (fgot, fdata[0:N])
1243   {
1244 #pragma acc parallel loop
1245     for (i = 0; i < N; i++)
1246       {
1247         float expr = 1.0;
1248 
1249 #pragma acc atomic capture
1250         { fgot = fgot + expr; fdata[i] = fgot; }
1251       }
1252   }
1253 
1254   if (fexp != fgot)
1255     abort ();
1256 
1257   fgot = 0.0;
1258   fexp = 32.0;
1259 
1260 #pragma acc data copy (fgot, fdata[0:N])
1261   {
1262 #pragma acc parallel loop
1263     for (i = 0; i < N; i++)
1264       {
1265         float expr = 1.0;
1266 
1267 #pragma acc atomic capture
1268         { fgot = expr + fgot; fdata[i] = fgot; }
1269       }
1270   }
1271 
1272   if (fexp != fgot)
1273     abort ();
1274 
1275   /* BINOP = * */
1276   fgot = 1.0;
1277   fexp = 8192.0*8192.0*64.0;
1278 
1279 #pragma acc data copy (fgot, fdata[0:N])
1280   {
1281 #pragma acc parallel loop
1282     for (i = 0; i < N; i++)
1283       {
1284       float expr = 2.0;
1285 
1286 #pragma acc atomic capture
1287       { fdata[i] = fgot; fgot *= expr; }
1288     }
1289   }
1290 
1291   if (fexp != fgot)
1292     abort ();
1293 
1294   fgot = 1.0;
1295   fexp = 8192.0*8192.0*64.0;
1296 
1297 #pragma acc data copy (fgot, fdata[0:N])
1298   {
1299 #pragma acc parallel loop
1300     for (i = 0; i < N; i++)
1301       {
1302         float expr = 2.0;
1303 
1304 #pragma acc atomic capture
1305         { fgot *= expr; fdata[i] = fgot; }
1306       }
1307   }
1308 
1309   if (fexp != fgot)
1310     abort ();
1311 
1312   fgot = 1.0;
1313   fexp = 8192.0*8192.0*64.0;
1314 
1315 #pragma acc data copy (fgot, fdata[0:N])
1316   {
1317 #pragma acc parallel loop
1318     for (i = 0; i < N; i++)
1319       {
1320         float expr = 2.0;
1321 
1322 #pragma acc atomic capture
1323         { fdata[i] = fgot; fgot = fgot * expr; }
1324       }
1325   }
1326 
1327   if (fexp != fgot)
1328     abort ();
1329 
1330   fgot = 1.0;
1331   fexp = 8192.0*8192.0*64.0;
1332 
1333 #pragma acc data copy (fgot, fdata[0:N])
1334   {
1335 #pragma acc parallel loop
1336     for (i = 0; i < N; i++)
1337       {
1338         float expr = 2.0;
1339 
1340 #pragma acc atomic capture
1341         { fdata[i] = fgot; fgot = expr * fgot; }
1342       }
1343   }
1344 
1345   if (fexp != fgot)
1346     abort ();
1347 
1348   lgot = 1LL;
1349   lexp = 1LL << 32;
1350 
1351 #pragma acc data copy (lgot, ldata[0:N])
1352   {
1353 #pragma acc parallel loop
1354     for (i = 0; i < N; i++)
1355       {
1356       long long expr = 2LL;
1357 
1358 #pragma acc atomic capture
1359       { lgot = lgot * expr; ldata[i] = lgot; }
1360     }
1361   }
1362 
1363   if (lexp != lgot)
1364     abort ();
1365 
1366   fgot = 1.0;
1367   fexp = 8192.0*8192.0*64.0;
1368 
1369 #pragma acc data copy (fgot, fdata[0:N])
1370   {
1371 #pragma acc parallel loop
1372     for (i = 0; i < N; i++)
1373       {
1374         long long expr = 2;
1375 
1376 #pragma acc atomic capture
1377         { fgot = expr * fgot; fdata[i] = fgot; }
1378       }
1379   }
1380 
1381   if (fexp != fgot)
1382     abort ();
1383 
1384   /* BINOP = - */
1385   fgot = 32.0;
1386   fexp = 0.0;
1387 
1388 #pragma acc data copy (fgot, fdata[0:N])
1389   {
1390 #pragma acc parallel loop
1391     for (i = 0; i < N; i++)
1392       {
1393         float expr = 1.0;
1394 
1395 #pragma acc atomic capture
1396         { fdata[i] = fgot; fgot -= expr; }
1397       }
1398   }
1399 
1400   if (fexp != fgot)
1401     abort ();
1402 
1403   fgot = 32.0;
1404   fexp = 0.0;
1405 
1406 #pragma acc data copy (fgot, fdata[0:N])
1407   {
1408 #pragma acc parallel loop
1409     for (i = 0; i < N; i++)
1410       {
1411       float expr = 1.0;
1412 
1413 #pragma acc atomic capture
1414       { fgot -= expr; fdata[i] = fgot; }
1415     }
1416   }
1417 
1418   if (fexp != fgot)
1419     abort ();
1420 
1421   fgot = 32.0;
1422   fexp = 0.0;
1423 
1424 #pragma acc data copy (fgot, fdata[0:N])
1425   {
1426 #pragma acc parallel loop
1427     for (i = 0; i < N; i++)
1428       {
1429         float expr = 1.0;
1430 
1431 #pragma acc atomic capture
1432         { fdata[i] = fgot; fgot = fgot - expr; }
1433       }
1434   }
1435 
1436   if (fexp != fgot)
1437     abort ();
1438 
1439   fgot = 1.0;
1440   fexp = 1.0;
1441 
1442 #pragma acc data copy (fgot, fdata[0:N])
1443   {
1444 #pragma acc parallel loop
1445     for (i = 0; i < N; i++)
1446       {
1447         float expr = 1.0;
1448 
1449 #pragma acc atomic capture
1450         { fdata[i] = fgot; fgot = expr - fgot; }
1451       }
1452   }
1453 
1454   for (i = 0; i < N; i++)
1455     if (i % 2 == 0)
1456       {
1457 	if (fdata[i] != 1.0)
1458 	  abort ();
1459       }
1460     else
1461       {
1462 	if (fdata[i] != 0.0)
1463 	  abort ();
1464       }
1465 
1466   if (fexp != fgot)
1467     abort ();
1468 
1469   fgot = 1.0;
1470   fexp = -31.0;
1471 
1472 #pragma acc data copy (fgot, fdata[0:N])
1473   {
1474 #pragma acc parallel loop
1475     for (i = 0; i < N; i++)
1476       {
1477         float expr = 1.0;
1478 
1479 #pragma acc atomic capture
1480         { fgot = fgot - expr; fdata[i] = fgot; }
1481       }
1482   }
1483 
1484   if (fexp != fgot)
1485     abort ();
1486 
1487   fgot = 1.0;
1488   fexp = 1.0;
1489 
1490 #pragma acc data copy (fgot, fdata[0:N])
1491   {
1492 #pragma acc parallel loop
1493     for (i = 0; i < N; i++)
1494       {
1495         float expr = 1.0;
1496 
1497 #pragma acc atomic capture
1498         { fgot = expr - fgot; fdata[i] = fgot; }
1499       }
1500   }
1501 
1502   for (i = 0; i < N; i++)
1503     if (i % 2 == 0)
1504       {
1505 	if (fdata[i] != 0.0)
1506 	  abort ();
1507       }
1508     else
1509       {
1510 	if (fdata[i] != 1.0)
1511 	  abort ();
1512       }
1513 
1514   if (fexp != fgot)
1515     abort ();
1516 
1517   /* BINOP = / */
1518   fgot = 8192.0*8192.0*64.0;
1519   fexp = 1.0;
1520 
1521 #pragma acc data copy (fgot, fdata[0:N])
1522   {
1523 #pragma acc parallel loop
1524     for (i = 0; i < N; i++)
1525       {
1526         float expr = 2.0;
1527 
1528 #pragma acc atomic capture
1529         { fdata[i] = fgot; fgot /= expr; }
1530       }
1531   }
1532 
1533   if (fexp != fgot)
1534     abort ();
1535 
1536   fgot = 8192.0*8192.0*64.0;
1537   fexp = 1.0;
1538 
1539 #pragma acc data copy (fgot, fdata[0:N])
1540   {
1541 #pragma acc parallel loop
1542     for (i = 0; i < N; i++)
1543       {
1544         float expr = 2.0;
1545 
1546 #pragma acc atomic capture
1547         { fgot /= expr; fdata[i] = fgot; }
1548       }
1549   }
1550 
1551   if (fexp != fgot)
1552     abort ();
1553 
1554   fgot = 8192.0*8192.0*64.0;
1555   fexp = 1.0;
1556 
1557 #pragma acc data copy (fgot, fdata[0:N])
1558   {
1559 #pragma acc parallel loop
1560     for (i = 0; i < N; i++)
1561       {
1562         float expr = 2.0;
1563 
1564 #pragma acc atomic capture
1565         { fdata[i] = fgot; fgot = fgot / expr; }
1566       }
1567   }
1568 
1569   if (fexp != fgot)
1570     abort ();
1571 
1572   fgot = 8192.0*8192.0*64.0;
1573   fexp = 1.0;
1574 
1575 #pragma acc data copy (fgot, fdata[0:N])
1576   {
1577 #pragma acc parallel loop
1578     for (i = 0; i < N; i++)
1579       {
1580         float expr = 1.0;
1581 
1582 #pragma acc atomic capture
1583         { fdata[i] = fgot; fgot = expr / fgot; }
1584       }
1585   }
1586 
1587   if (fexp != fgot)
1588     abort ();
1589 
1590   fgot = 4.0;
1591   fexp = 4.0;
1592 
1593 #pragma acc data copy (fgot, fdata[0:N])
1594   {
1595 #pragma acc parallel loop
1596     for (i = 0; i < N; i++)
1597       {
1598         long long expr = 1LL << N;
1599 
1600 #pragma acc atomic capture
1601         { fgot = fgot / expr; fdata[i] = fgot; }
1602       }
1603   }
1604 
1605   if (fexp != fgot)
1606     abort ();
1607 
1608   fgot = 4.0;
1609   fexp = 4.0;
1610 
1611 #pragma acc data copy (fgot, fdata[0:N])
1612   {
1613 #pragma acc parallel loop
1614     for (i = 0; i < N; i++)
1615       {
1616         float expr = 2.0;
1617 
1618 #pragma acc atomic capture
1619         { fgot = expr / fgot; fdata[i] = fgot; }
1620       }
1621   }
1622 
1623   if (fexp != fgot)
1624     abort ();
1625 
1626   return 0;
1627 }
1628