1*330d8983SJohannes Doerfert // RUN: %libomptarget-compile-generic -fopenmp-extensions
2*330d8983SJohannes Doerfert // RUN: %libomptarget-run-generic | %fcheck-generic -strict-whitespace
3*330d8983SJohannes Doerfert
4*330d8983SJohannes Doerfert #include <omp.h>
5*330d8983SJohannes Doerfert #include <stdio.h>
6*330d8983SJohannes Doerfert
7*330d8983SJohannes Doerfert #define CHECK_PRESENCE(Var1, Var2, Var3) \
8*330d8983SJohannes Doerfert printf(" presence of %s, %s, %s: %d, %d, %d\n", #Var1, #Var2, #Var3, \
9*330d8983SJohannes Doerfert omp_target_is_present(&Var1, omp_get_default_device()), \
10*330d8983SJohannes Doerfert omp_target_is_present(&Var2, omp_get_default_device()), \
11*330d8983SJohannes Doerfert omp_target_is_present(&Var3, omp_get_default_device()))
12*330d8983SJohannes Doerfert
main()13*330d8983SJohannes Doerfert int main() {
14*330d8983SJohannes Doerfert int m, r, d;
15*330d8983SJohannes Doerfert // CHECK: presence of m, r, d: 0, 0, 0
16*330d8983SJohannes Doerfert CHECK_PRESENCE(m, r, d);
17*330d8983SJohannes Doerfert
18*330d8983SJohannes Doerfert // -----------------------------------------------------------------------
19*330d8983SJohannes Doerfert // CHECK-NEXT: check:{{.*}}
20*330d8983SJohannes Doerfert printf("check: dyn>0, hold=0, dec/reset dyn=0\n");
21*330d8983SJohannes Doerfert
22*330d8983SJohannes Doerfert // CHECK-NEXT: structured{{.*}}
23*330d8983SJohannes Doerfert printf(" structured dec of dyn\n");
24*330d8983SJohannes Doerfert #pragma omp target data map(tofrom : m) map(alloc : r, d)
25*330d8983SJohannes Doerfert {
26*330d8983SJohannes Doerfert // CHECK-NEXT: presence of m, r, d: 1, 1, 1
27*330d8983SJohannes Doerfert CHECK_PRESENCE(m, r, d);
28*330d8983SJohannes Doerfert #pragma omp target data map(tofrom : m) map(alloc : r, d)
29*330d8983SJohannes Doerfert {
30*330d8983SJohannes Doerfert // CHECK-NEXT: presence of m, r, d: 1, 1, 1
31*330d8983SJohannes Doerfert CHECK_PRESENCE(m, r, d);
32*330d8983SJohannes Doerfert }
33*330d8983SJohannes Doerfert // CHECK-NEXT: presence of m, r, d: 1, 1, 1
34*330d8983SJohannes Doerfert CHECK_PRESENCE(m, r, d);
35*330d8983SJohannes Doerfert }
36*330d8983SJohannes Doerfert // CHECK-NEXT: presence of m, r, d: 0, 0, 0
37*330d8983SJohannes Doerfert CHECK_PRESENCE(m, r, d);
38*330d8983SJohannes Doerfert
39*330d8983SJohannes Doerfert // CHECK-NEXT: dynamic{{.*}}
40*330d8983SJohannes Doerfert printf(" dynamic dec/reset of dyn\n");
41*330d8983SJohannes Doerfert #pragma omp target data map(tofrom : m) map(alloc : r, d)
42*330d8983SJohannes Doerfert {
43*330d8983SJohannes Doerfert // CHECK-NEXT: presence of m, r, d: 1, 1, 1
44*330d8983SJohannes Doerfert CHECK_PRESENCE(m, r, d);
45*330d8983SJohannes Doerfert #pragma omp target data map(tofrom : m) map(alloc : r, d)
46*330d8983SJohannes Doerfert {
47*330d8983SJohannes Doerfert // CHECK-NEXT: presence of m, r, d: 1, 1, 1
48*330d8983SJohannes Doerfert CHECK_PRESENCE(m, r, d);
49*330d8983SJohannes Doerfert #pragma omp target exit data map(from : m) map(release : r)
50*330d8983SJohannes Doerfert // CHECK-NEXT: presence of m, r, d: 1, 1, 1
51*330d8983SJohannes Doerfert CHECK_PRESENCE(m, r, d);
52*330d8983SJohannes Doerfert #pragma omp target exit data map(from : m) map(release : r) map(delete : d)
53*330d8983SJohannes Doerfert // CHECK-NEXT: presence of m, r, d: 0, 0, 0
54*330d8983SJohannes Doerfert CHECK_PRESENCE(m, r, d);
55*330d8983SJohannes Doerfert }
56*330d8983SJohannes Doerfert // CHECK-NEXT: presence of m, r, d: 0, 0, 0
57*330d8983SJohannes Doerfert CHECK_PRESENCE(m, r, d);
58*330d8983SJohannes Doerfert #pragma omp target exit data map(from : m) map(release : r) map(delete : d)
59*330d8983SJohannes Doerfert // CHECK-NEXT: presence of m, r, d: 0, 0, 0
60*330d8983SJohannes Doerfert CHECK_PRESENCE(m, r, d);
61*330d8983SJohannes Doerfert }
62*330d8983SJohannes Doerfert // CHECK-NEXT: presence of m, r, d: 0, 0, 0
63*330d8983SJohannes Doerfert CHECK_PRESENCE(m, r, d);
64*330d8983SJohannes Doerfert
65*330d8983SJohannes Doerfert // -----------------------------------------------------------------------
66*330d8983SJohannes Doerfert // CHECK: check:{{.*}}
67*330d8983SJohannes Doerfert printf("check: dyn=0, hold>0, dec/reset dyn=0, dec hold=0\n");
68*330d8983SJohannes Doerfert
69*330d8983SJohannes Doerfert // Structured dec of dyn would require dyn>0.
70*330d8983SJohannes Doerfert
71*330d8983SJohannes Doerfert // CHECK-NEXT: dynamic{{.*}}
72*330d8983SJohannes Doerfert printf(" dynamic dec/reset of dyn\n");
73*330d8983SJohannes Doerfert #pragma omp target data map(ompx_hold, tofrom : m) map(ompx_hold, alloc : r, d)
74*330d8983SJohannes Doerfert {
75*330d8983SJohannes Doerfert // CHECK-NEXT: presence of m, r, d: 1, 1, 1
76*330d8983SJohannes Doerfert CHECK_PRESENCE(m, r, d);
77*330d8983SJohannes Doerfert #pragma omp target data map(ompx_hold, tofrom : m) map(ompx_hold, alloc : r, d)
78*330d8983SJohannes Doerfert {
79*330d8983SJohannes Doerfert // CHECK-NEXT: presence of m, r, d: 1, 1, 1
80*330d8983SJohannes Doerfert CHECK_PRESENCE(m, r, d);
81*330d8983SJohannes Doerfert #pragma omp target exit data map(from : m) map(release : r)
82*330d8983SJohannes Doerfert // CHECK-NEXT: presence of m, r, d: 1, 1, 1
83*330d8983SJohannes Doerfert CHECK_PRESENCE(m, r, d);
84*330d8983SJohannes Doerfert #pragma omp target exit data map(from : m) map(release : r) map(delete : d)
85*330d8983SJohannes Doerfert // CHECK-NEXT: presence of m, r, d: 1, 1, 1
86*330d8983SJohannes Doerfert CHECK_PRESENCE(m, r, d);
87*330d8983SJohannes Doerfert }
88*330d8983SJohannes Doerfert // CHECK-NEXT: presence of m, r, d: 1, 1, 1
89*330d8983SJohannes Doerfert CHECK_PRESENCE(m, r, d);
90*330d8983SJohannes Doerfert #pragma omp target exit data map(from : m) map(release : r) map(delete : d)
91*330d8983SJohannes Doerfert // CHECK-NEXT: presence of m, r, d: 1, 1, 1
92*330d8983SJohannes Doerfert CHECK_PRESENCE(m, r, d);
93*330d8983SJohannes Doerfert }
94*330d8983SJohannes Doerfert // CHECK-NEXT: presence of m, r, d: 0, 0, 0
95*330d8983SJohannes Doerfert CHECK_PRESENCE(m, r, d);
96*330d8983SJohannes Doerfert
97*330d8983SJohannes Doerfert // -----------------------------------------------------------------------
98*330d8983SJohannes Doerfert // CHECK: check:{{.*}}
99*330d8983SJohannes Doerfert printf("check: dyn>0, hold>0, dec/reset dyn=0, dec hold=0\n");
100*330d8983SJohannes Doerfert
101*330d8983SJohannes Doerfert // CHECK-NEXT: structured{{.*}}
102*330d8983SJohannes Doerfert printf(" structured dec of dyn\n");
103*330d8983SJohannes Doerfert #pragma omp target data map(ompx_hold, tofrom : m) map(ompx_hold, alloc : r, d)
104*330d8983SJohannes Doerfert {
105*330d8983SJohannes Doerfert // CHECK-NEXT: presence of m, r, d: 1, 1, 1
106*330d8983SJohannes Doerfert CHECK_PRESENCE(m, r, d);
107*330d8983SJohannes Doerfert #pragma omp target data map(ompx_hold, tofrom : m) map(ompx_hold, alloc : r, d)
108*330d8983SJohannes Doerfert {
109*330d8983SJohannes Doerfert // CHECK-NEXT: presence of m, r, d: 1, 1, 1
110*330d8983SJohannes Doerfert CHECK_PRESENCE(m, r, d);
111*330d8983SJohannes Doerfert #pragma omp target data map(tofrom : m) map(alloc : r, d)
112*330d8983SJohannes Doerfert {
113*330d8983SJohannes Doerfert // CHECK-NEXT: presence of m, r, d: 1, 1, 1
114*330d8983SJohannes Doerfert CHECK_PRESENCE(m, r, d);
115*330d8983SJohannes Doerfert #pragma omp target data map(tofrom : m) map(alloc : r, d)
116*330d8983SJohannes Doerfert {
117*330d8983SJohannes Doerfert // CHECK-NEXT: presence of m, r, d: 1, 1, 1
118*330d8983SJohannes Doerfert CHECK_PRESENCE(m, r, d);
119*330d8983SJohannes Doerfert }
120*330d8983SJohannes Doerfert // CHECK-NEXT: presence of m, r, d: 1, 1, 1
121*330d8983SJohannes Doerfert CHECK_PRESENCE(m, r, d);
122*330d8983SJohannes Doerfert }
123*330d8983SJohannes Doerfert // CHECK-NEXT: presence of m, r, d: 1, 1, 1
124*330d8983SJohannes Doerfert CHECK_PRESENCE(m, r, d);
125*330d8983SJohannes Doerfert }
126*330d8983SJohannes Doerfert // CHECK-NEXT: presence of m, r, d: 1, 1, 1
127*330d8983SJohannes Doerfert CHECK_PRESENCE(m, r, d);
128*330d8983SJohannes Doerfert }
129*330d8983SJohannes Doerfert // CHECK-NEXT: presence of m, r, d: 0, 0, 0
130*330d8983SJohannes Doerfert CHECK_PRESENCE(m, r, d);
131*330d8983SJohannes Doerfert
132*330d8983SJohannes Doerfert // CHECK-NEXT: dynamic{{.*}}
133*330d8983SJohannes Doerfert printf(" dynamic dec/reset of dyn\n");
134*330d8983SJohannes Doerfert #pragma omp target enter data map(to : m) map(alloc : r, d)
135*330d8983SJohannes Doerfert // CHECK-NEXT: presence of m, r, d: 1, 1, 1
136*330d8983SJohannes Doerfert CHECK_PRESENCE(m, r, d);
137*330d8983SJohannes Doerfert #pragma omp target enter data map(to : m) map(alloc : r, d)
138*330d8983SJohannes Doerfert // CHECK-NEXT: presence of m, r, d: 1, 1, 1
139*330d8983SJohannes Doerfert CHECK_PRESENCE(m, r, d);
140*330d8983SJohannes Doerfert #pragma omp target data map(ompx_hold, tofrom : m) map(ompx_hold, alloc : r, d)
141*330d8983SJohannes Doerfert {
142*330d8983SJohannes Doerfert // CHECK-NEXT: presence of m, r, d: 1, 1, 1
143*330d8983SJohannes Doerfert CHECK_PRESENCE(m, r, d);
144*330d8983SJohannes Doerfert #pragma omp target data map(ompx_hold, tofrom : m) map(ompx_hold, alloc : r, d)
145*330d8983SJohannes Doerfert {
146*330d8983SJohannes Doerfert // CHECK-NEXT: presence of m, r, d: 1, 1, 1
147*330d8983SJohannes Doerfert CHECK_PRESENCE(m, r, d);
148*330d8983SJohannes Doerfert #pragma omp target exit data map(from : m) map(release : r)
149*330d8983SJohannes Doerfert // CHECK-NEXT: presence of m, r, d: 1, 1, 1
150*330d8983SJohannes Doerfert CHECK_PRESENCE(m, r, d);
151*330d8983SJohannes Doerfert #pragma omp target exit data map(from : m) map(release : r) map(delete : d)
152*330d8983SJohannes Doerfert // CHECK-NEXT: presence of m, r, d: 1, 1, 1
153*330d8983SJohannes Doerfert CHECK_PRESENCE(m, r, d);
154*330d8983SJohannes Doerfert }
155*330d8983SJohannes Doerfert // CHECK-NEXT: presence of m, r, d: 1, 1, 1
156*330d8983SJohannes Doerfert CHECK_PRESENCE(m, r, d);
157*330d8983SJohannes Doerfert #pragma omp target exit data map(from : m) map(release : r) map(delete : d)
158*330d8983SJohannes Doerfert // CHECK-NEXT: presence of m, r, d: 1, 1, 1
159*330d8983SJohannes Doerfert CHECK_PRESENCE(m, r, d);
160*330d8983SJohannes Doerfert }
161*330d8983SJohannes Doerfert // CHECK-NEXT: presence of m, r, d: 0, 0, 0
162*330d8983SJohannes Doerfert CHECK_PRESENCE(m, r, d);
163*330d8983SJohannes Doerfert
164*330d8983SJohannes Doerfert // -----------------------------------------------------------------------
165*330d8983SJohannes Doerfert // CHECK: check:{{.*}}
166*330d8983SJohannes Doerfert printf("check: dyn>0, hold>0, dec hold=0, dec/reset dyn=0\n");
167*330d8983SJohannes Doerfert
168*330d8983SJohannes Doerfert // CHECK-NEXT: structured{{.*}}
169*330d8983SJohannes Doerfert printf(" structured dec of dyn\n");
170*330d8983SJohannes Doerfert #pragma omp target data map(tofrom : m) map(alloc : r, d)
171*330d8983SJohannes Doerfert {
172*330d8983SJohannes Doerfert // CHECK-NEXT: presence of m, r, d: 1, 1, 1
173*330d8983SJohannes Doerfert CHECK_PRESENCE(m, r, d);
174*330d8983SJohannes Doerfert #pragma omp target data map(tofrom : m) map(alloc : r, d)
175*330d8983SJohannes Doerfert {
176*330d8983SJohannes Doerfert // CHECK-NEXT: presence of m, r, d: 1, 1, 1
177*330d8983SJohannes Doerfert CHECK_PRESENCE(m, r, d);
178*330d8983SJohannes Doerfert #pragma omp target data map(ompx_hold, tofrom : m) map(ompx_hold, alloc : r, d)
179*330d8983SJohannes Doerfert {
180*330d8983SJohannes Doerfert // CHECK-NEXT: presence of m, r, d: 1, 1, 1
181*330d8983SJohannes Doerfert CHECK_PRESENCE(m, r, d);
182*330d8983SJohannes Doerfert #pragma omp target data map(ompx_hold, tofrom : m) map(ompx_hold, alloc : r, d)
183*330d8983SJohannes Doerfert {
184*330d8983SJohannes Doerfert // CHECK-NEXT: presence of m, r, d: 1, 1, 1
185*330d8983SJohannes Doerfert CHECK_PRESENCE(m, r, d);
186*330d8983SJohannes Doerfert }
187*330d8983SJohannes Doerfert // CHECK-NEXT: presence of m, r, d: 1, 1, 1
188*330d8983SJohannes Doerfert CHECK_PRESENCE(m, r, d);
189*330d8983SJohannes Doerfert }
190*330d8983SJohannes Doerfert // CHECK-NEXT: presence of m, r, d: 1, 1, 1
191*330d8983SJohannes Doerfert CHECK_PRESENCE(m, r, d);
192*330d8983SJohannes Doerfert }
193*330d8983SJohannes Doerfert // CHECK-NEXT: presence of m, r, d: 1, 1, 1
194*330d8983SJohannes Doerfert CHECK_PRESENCE(m, r, d);
195*330d8983SJohannes Doerfert }
196*330d8983SJohannes Doerfert // CHECK-NEXT: presence of m, r, d: 0, 0, 0
197*330d8983SJohannes Doerfert CHECK_PRESENCE(m, r, d);
198*330d8983SJohannes Doerfert
199*330d8983SJohannes Doerfert // CHECK-NEXT: dynamic{{.*}}
200*330d8983SJohannes Doerfert printf(" dynamic dec/reset of dyn\n");
201*330d8983SJohannes Doerfert #pragma omp target enter data map(to : m) map(alloc : r, d)
202*330d8983SJohannes Doerfert // CHECK-NEXT: presence of m, r, d: 1, 1, 1
203*330d8983SJohannes Doerfert CHECK_PRESENCE(m, r, d);
204*330d8983SJohannes Doerfert #pragma omp target enter data map(to : m) map(alloc : r, d)
205*330d8983SJohannes Doerfert // CHECK-NEXT: presence of m, r, d: 1, 1, 1
206*330d8983SJohannes Doerfert CHECK_PRESENCE(m, r, d);
207*330d8983SJohannes Doerfert #pragma omp target data map(ompx_hold, tofrom : m) map(ompx_hold, alloc : r, d)
208*330d8983SJohannes Doerfert {
209*330d8983SJohannes Doerfert // CHECK-NEXT: presence of m, r, d: 1, 1, 1
210*330d8983SJohannes Doerfert CHECK_PRESENCE(m, r, d);
211*330d8983SJohannes Doerfert #pragma omp target data map(ompx_hold, tofrom : m) map(ompx_hold, alloc : r, d)
212*330d8983SJohannes Doerfert {
213*330d8983SJohannes Doerfert // CHECK-NEXT: presence of m, r, d: 1, 1, 1
214*330d8983SJohannes Doerfert CHECK_PRESENCE(m, r, d);
215*330d8983SJohannes Doerfert }
216*330d8983SJohannes Doerfert // CHECK-NEXT: presence of m, r, d: 1, 1, 1
217*330d8983SJohannes Doerfert CHECK_PRESENCE(m, r, d);
218*330d8983SJohannes Doerfert }
219*330d8983SJohannes Doerfert // CHECK-NEXT: presence of m, r, d: 1, 1, 1
220*330d8983SJohannes Doerfert CHECK_PRESENCE(m, r, d);
221*330d8983SJohannes Doerfert #pragma omp target exit data map(from : m) map(release : r)
222*330d8983SJohannes Doerfert // CHECK-NEXT: presence of m, r, d: 1, 1, 1
223*330d8983SJohannes Doerfert CHECK_PRESENCE(m, r, d);
224*330d8983SJohannes Doerfert #pragma omp target exit data map(from : m) map(release : r) map(delete : d)
225*330d8983SJohannes Doerfert // CHECK-NEXT: presence of m, r, d: 0, 0, 0
226*330d8983SJohannes Doerfert CHECK_PRESENCE(m, r, d);
227*330d8983SJohannes Doerfert
228*330d8983SJohannes Doerfert return 0;
229*330d8983SJohannes Doerfert }
230