1!     ACC_PRESENT_OR_CREATE, ACC_PRESENT_OR_COPYIN, etc.
2!     Variant of "../libgomp.oacc-c-c++-common/lib-32.c".
3!     Variant using "openacc_lib.h".
4
5!     { dg-do run }
6
7      PROGRAM MAIN
8      IMPLICIT NONE
9      INCLUDE "openacc_lib.h"
10
11      INTEGER, PARAMETER :: N = 10000
12      INTEGER, ALLOCATABLE :: H(:)
13      INTEGER :: I
14      LOGICAL :: SHARED_MEM
15
16      ALLOCATE (H(N))
17      DO I = 1, N
18         H(I) = I + 0
19      END DO
20
21      SHARED_MEM = ACC_IS_PRESENT (H)
22
23      CALL ACC_PRESENT_OR_CREATE (H, INT (SIZEOF (H), 4))
24      IF (.NOT. ACC_IS_PRESENT (H, INT (SIZEOF (H), 8))) STOP 1
25
26!$ACC PARALLEL LOOP DEFAULT (PRESENT)
27      DO I = 1, N
28         H(I) = I + 1
29      END DO
30!$ACC END PARALLEL LOOP
31
32      DO I = 1, N
33         IF (H(I) .NE. I + MERGE (1, 0, SHARED_MEM)) STOP 2
34         H(I) = I + 2
35      END DO
36
37      CALL ACC_PRESENT_OR_CREATE (H)
38
39!$ACC PARALLEL LOOP DEFAULT (PRESENT)
40      DO I = 1, N
41         IF (H(I) .NE. I + MERGE (2, 1, SHARED_MEM)) STOP 3
42         H(I) = I + 3
43      END DO
44!$ACC END PARALLEL LOOP
45
46      DO I = 1, N
47         IF (H(I) .NE. I + MERGE (3, 2, SHARED_MEM)) STOP 4
48         H(I) = I + 4
49      END DO
50
51      CALL ACC_PCREATE (H, INT (SIZEOF (H), 4))
52
53!$ACC PARALLEL LOOP DEFAULT (PRESENT)
54      DO I = 1, N
55         IF (H(I) .NE. I + MERGE (4, 3, SHARED_MEM)) STOP 5
56         H(I) = I + 5
57      END DO
58!$ACC END PARALLEL LOOP
59
60      DO I = 1, N
61         IF (H(I) .NE. I + MERGE (5, 4, SHARED_MEM)) STOP 6
62         H(I) = I + 6
63      END DO
64
65      CALL ACC_PRESENT_OR_COPYIN (H, INT (SIZEOF (H), 8))
66
67!$ACC PARALLEL LOOP DEFAULT (PRESENT)
68      DO I = 1, N
69         IF (H(I) .NE. I + MERGE (6, 5, SHARED_MEM)) STOP 7
70         H(I) = I + 7
71      END DO
72!$ACC END PARALLEL LOOP
73
74      DO I = 1, N
75         IF (H(I) .NE. I + MERGE (7, 6, SHARED_MEM)) STOP 8
76         H(I) = I + 8
77      END DO
78
79      CALL ACC_PCOPYIN (H, INT (SIZEOF (H), 4))
80
81!$ACC PARALLEL LOOP DEFAULT (PRESENT)
82      DO I = 1, N
83         IF (H(I) .NE. I + MERGE (8, 7, SHARED_MEM)) STOP 9
84         H(I) = I + 9
85      END DO
86!$ACC END PARALLEL LOOP
87
88      DO I = 1, N
89         IF (H(I) .NE. I + MERGE (9, 8, SHARED_MEM)) STOP 10
90         H(I) = I + 10
91      END DO
92
93      CALL ACC_COPYOUT_FINALIZE (H, INT (SIZEOF (H), 4))
94      IF (.NOT. SHARED_MEM) THEN
95         IF (ACC_IS_PRESENT (H, INT (SIZEOF (H), 8))) STOP 11
96      ENDIF
97
98      DO I = 1, N
99         IF (H(I) .NE. I + MERGE (10, 9, SHARED_MEM)) STOP 12
100      END DO
101
102      CALL ACC_PCOPYIN (H)
103      IF (.NOT. ACC_IS_PRESENT (H, INT (SIZEOF (H), 4))) STOP 13
104
105!$ACC PARALLEL LOOP DEFAULT (PRESENT)
106      DO I = 1, N
107         IF (H(I) .NE. I + MERGE (10, 9, SHARED_MEM)) STOP 14
108         H(I) = I + 11
109      END DO
110!$ACC END PARALLEL LOOP
111
112      DO I = 1, N
113         IF (H(I) .NE. I + MERGE (11, 9, SHARED_MEM)) STOP 15
114         H(I) = I + 12
115      END DO
116
117      CALL ACC_PCOPYIN (H, INT (SIZEOF (H), 8))
118
119!$ACC PARALLEL LOOP DEFAULT (PRESENT)
120      DO I = 1, N
121         IF (H(I) .NE. I + MERGE (12, 11, SHARED_MEM)) STOP 16
122         H(I) = I + 13
123      END DO
124!$ACC END PARALLEL LOOP
125
126      DO I = 1, N
127         IF (H(I) .NE. I + MERGE (13, 12, SHARED_MEM)) STOP 17
128         H(I) = I + 14
129      END DO
130
131      CALL ACC_PCREATE (H)
132
133!$ACC PARALLEL LOOP DEFAULT (PRESENT)
134      DO I = 1, N
135         IF (H(I) .NE. I + MERGE (14, 13, SHARED_MEM)) STOP 18
136         H(I) = I + 15
137      END DO
138!$ACC END PARALLEL LOOP
139
140      DO I = 1, N
141         IF (H(I) .NE. I + MERGE (15, 14, SHARED_MEM)) STOP 19
142         H(I) = I + 16
143      END DO
144
145      CALL ACC_PCREATE (H, INT (SIZEOF (H), 8))
146
147!$ACC PARALLEL LOOP DEFAULT (PRESENT)
148      DO I = 1, N
149         IF (H(I) .NE. I + MERGE (16, 15, SHARED_MEM)) STOP 20
150         H(I) = I + 17
151      END DO
152!$ACC END PARALLEL LOOP
153
154      DO I = 1, N
155         IF (H(I) .NE. I + MERGE (17, 16, SHARED_MEM)) STOP 21
156         H(I) = I + 18
157      END DO
158
159      CALL ACC_UPDATE_SELF (H, INT (SIZEOF (H), 4))
160      IF (.NOT. ACC_IS_PRESENT (H, INT (SIZEOF (H), 8))) STOP 22
161
162      DO I = 1, N
163         IF (H(I) .NE. I + MERGE (18, 17, SHARED_MEM)) STOP 23
164      END DO
165
166      CALL ACC_DELETE_FINALIZE (H)
167      IF (.NOT. SHARED_MEM) THEN
168         IF (ACC_IS_PRESENT (H, INT (SIZEOF (H), 4))) STOP 24
169      ENDIF
170
171      DEALLOCATE (H)
172
173      END PROGRAM MAIN
174