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 dyn=0\n");
21*330d8983SJohannes Doerfert
22*330d8983SJohannes Doerfert // CHECK-NEXT: once
23*330d8983SJohannes Doerfert printf(" once\n");
24*330d8983SJohannes Doerfert #pragma omp target map(tofrom : m) map(alloc : r, d)
25*330d8983SJohannes Doerfert ;
26*330d8983SJohannes Doerfert // CHECK-NEXT: presence of m, r, d: 0, 0, 0
27*330d8983SJohannes Doerfert CHECK_PRESENCE(m, r, d);
28*330d8983SJohannes Doerfert
29*330d8983SJohannes Doerfert // CHECK-NEXT: twice
30*330d8983SJohannes Doerfert printf(" twice\n");
31*330d8983SJohannes Doerfert #pragma omp target data map(tofrom : m) map(alloc : 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 #pragma omp target map(tofrom : m) map(alloc : r, d)
36*330d8983SJohannes Doerfert ;
37*330d8983SJohannes Doerfert // CHECK-NEXT: presence of m, r, d: 1, 1, 1
38*330d8983SJohannes Doerfert CHECK_PRESENCE(m, r, d);
39*330d8983SJohannes Doerfert }
40*330d8983SJohannes Doerfert // CHECK-NEXT: presence of m, r, d: 0, 0, 0
41*330d8983SJohannes Doerfert CHECK_PRESENCE(m, r, d);
42*330d8983SJohannes Doerfert
43*330d8983SJohannes Doerfert // -----------------------------------------------------------------------
44*330d8983SJohannes Doerfert // CHECK: check:{{.*}}
45*330d8983SJohannes Doerfert printf("check: dyn=0, hold>0, dec hold=0\n");
46*330d8983SJohannes Doerfert
47*330d8983SJohannes Doerfert // CHECK-NEXT: once
48*330d8983SJohannes Doerfert printf(" once\n");
49*330d8983SJohannes Doerfert #pragma omp target map(ompx_hold, tofrom : m) map(ompx_hold, alloc : r, d)
50*330d8983SJohannes Doerfert ;
51*330d8983SJohannes Doerfert // CHECK-NEXT: presence of m, r, d: 0, 0, 0
52*330d8983SJohannes Doerfert CHECK_PRESENCE(m, r, d);
53*330d8983SJohannes Doerfert
54*330d8983SJohannes Doerfert // CHECK-NEXT: twice
55*330d8983SJohannes Doerfert printf(" twice\n");
56*330d8983SJohannes Doerfert #pragma omp target data map(ompx_hold, tofrom : m) map(ompx_hold, alloc : r, d)
57*330d8983SJohannes Doerfert {
58*330d8983SJohannes Doerfert // CHECK-NEXT: presence of m, r, d: 1, 1, 1
59*330d8983SJohannes Doerfert CHECK_PRESENCE(m, r, d);
60*330d8983SJohannes Doerfert #pragma omp target map(ompx_hold, tofrom : m) map(ompx_hold, alloc : r, d)
61*330d8983SJohannes Doerfert ;
62*330d8983SJohannes Doerfert // CHECK-NEXT: presence of m, r, d: 1, 1, 1
63*330d8983SJohannes Doerfert CHECK_PRESENCE(m, r, d);
64*330d8983SJohannes Doerfert }
65*330d8983SJohannes Doerfert // CHECK-NEXT: presence of m, r, d: 0, 0, 0
66*330d8983SJohannes Doerfert CHECK_PRESENCE(m, r, d);
67*330d8983SJohannes Doerfert
68*330d8983SJohannes Doerfert // -----------------------------------------------------------------------
69*330d8983SJohannes Doerfert // CHECK: check:{{.*}}
70*330d8983SJohannes Doerfert printf("check: dyn>0, hold>0, dec dyn=0, dec hold=0\n");
71*330d8983SJohannes Doerfert
72*330d8983SJohannes Doerfert // CHECK-NEXT: once each
73*330d8983SJohannes Doerfert printf(" once each\n");
74*330d8983SJohannes Doerfert #pragma omp target data map(ompx_hold, tofrom : m) map(ompx_hold, alloc : r, d)
75*330d8983SJohannes Doerfert {
76*330d8983SJohannes Doerfert // CHECK-NEXT: presence of m, r, d: 1, 1, 1
77*330d8983SJohannes Doerfert CHECK_PRESENCE(m, r, d);
78*330d8983SJohannes Doerfert #pragma omp target map(tofrom : m) map(alloc : r, d)
79*330d8983SJohannes Doerfert ;
80*330d8983SJohannes Doerfert // CHECK-NEXT: presence of m, r, d: 1, 1, 1
81*330d8983SJohannes Doerfert CHECK_PRESENCE(m, r, d);
82*330d8983SJohannes Doerfert }
83*330d8983SJohannes Doerfert // CHECK-NEXT: presence of m, r, d: 0, 0, 0
84*330d8983SJohannes Doerfert CHECK_PRESENCE(m, r, d);
85*330d8983SJohannes Doerfert
86*330d8983SJohannes Doerfert // CHECK-NEXT: twice each
87*330d8983SJohannes Doerfert printf(" twice each\n");
88*330d8983SJohannes Doerfert #pragma omp target data map(ompx_hold, tofrom : m) map(ompx_hold, alloc : r, d)
89*330d8983SJohannes Doerfert {
90*330d8983SJohannes Doerfert // CHECK-NEXT: presence of m, r, d: 1, 1, 1
91*330d8983SJohannes Doerfert CHECK_PRESENCE(m, r, d);
92*330d8983SJohannes Doerfert #pragma omp target data map(ompx_hold, tofrom : m) map(ompx_hold, alloc : r, d)
93*330d8983SJohannes Doerfert {
94*330d8983SJohannes Doerfert // CHECK-NEXT: presence of m, r, d: 1, 1, 1
95*330d8983SJohannes Doerfert CHECK_PRESENCE(m, r, d);
96*330d8983SJohannes Doerfert #pragma omp target data map(tofrom : m) map(alloc : r, d)
97*330d8983SJohannes Doerfert {
98*330d8983SJohannes Doerfert // CHECK-NEXT: presence of m, r, d: 1, 1, 1
99*330d8983SJohannes Doerfert CHECK_PRESENCE(m, r, d);
100*330d8983SJohannes Doerfert #pragma omp target map(tofrom : m) map(alloc : r, d)
101*330d8983SJohannes Doerfert ;
102*330d8983SJohannes Doerfert // CHECK-NEXT: presence of m, r, d: 1, 1, 1
103*330d8983SJohannes Doerfert CHECK_PRESENCE(m, 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 }
108*330d8983SJohannes Doerfert // CHECK-NEXT: presence of m, r, d: 1, 1, 1
109*330d8983SJohannes Doerfert CHECK_PRESENCE(m, r, d);
110*330d8983SJohannes Doerfert }
111*330d8983SJohannes Doerfert // CHECK-NEXT: presence of m, r, d: 0, 0, 0
112*330d8983SJohannes Doerfert CHECK_PRESENCE(m, r, d);
113*330d8983SJohannes Doerfert
114*330d8983SJohannes Doerfert // -----------------------------------------------------------------------
115*330d8983SJohannes Doerfert // CHECK: check:{{.*}}
116*330d8983SJohannes Doerfert printf("check: dyn>0, hold>0, dec hold=0, dec dyn=0\n");
117*330d8983SJohannes Doerfert
118*330d8983SJohannes Doerfert // CHECK-NEXT: once each
119*330d8983SJohannes Doerfert printf(" once each\n");
120*330d8983SJohannes Doerfert #pragma omp target data map(tofrom : m) map(alloc : r, d)
121*330d8983SJohannes Doerfert {
122*330d8983SJohannes Doerfert // CHECK-NEXT: presence of m, r, d: 1, 1, 1
123*330d8983SJohannes Doerfert CHECK_PRESENCE(m, r, d);
124*330d8983SJohannes Doerfert #pragma omp target map(ompx_hold, tofrom : m) map(ompx_hold, alloc : 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: twice each
133*330d8983SJohannes Doerfert printf(" twice each\n");
134*330d8983SJohannes Doerfert #pragma omp target data map(tofrom : m) map(alloc : r, d)
135*330d8983SJohannes Doerfert {
136*330d8983SJohannes Doerfert // CHECK-NEXT: presence of m, r, d: 1, 1, 1
137*330d8983SJohannes Doerfert CHECK_PRESENCE(m, r, d);
138*330d8983SJohannes Doerfert #pragma omp target data map(tofrom : m) map(alloc : r, d)
139*330d8983SJohannes Doerfert {
140*330d8983SJohannes Doerfert // CHECK-NEXT: presence of m, r, d: 1, 1, 1
141*330d8983SJohannes Doerfert CHECK_PRESENCE(m, r, d);
142*330d8983SJohannes Doerfert #pragma omp target data map(ompx_hold, tofrom : m) map(ompx_hold, alloc : r, d)
143*330d8983SJohannes Doerfert {
144*330d8983SJohannes Doerfert // CHECK-NEXT: presence of m, r, d: 1, 1, 1
145*330d8983SJohannes Doerfert CHECK_PRESENCE(m, r, d);
146*330d8983SJohannes Doerfert #pragma omp target map(ompx_hold, tofrom : m) map(ompx_hold, alloc : r, d)
147*330d8983SJohannes Doerfert ;
148*330d8983SJohannes Doerfert // CHECK-NEXT: presence of m, r, d: 1, 1, 1
149*330d8983SJohannes Doerfert CHECK_PRESENCE(m, r, d);
150*330d8983SJohannes Doerfert }
151*330d8983SJohannes Doerfert // CHECK-NEXT: presence of m, r, d: 1, 1, 1
152*330d8983SJohannes Doerfert CHECK_PRESENCE(m, r, d);
153*330d8983SJohannes Doerfert }
154*330d8983SJohannes Doerfert // CHECK-NEXT: presence of m, r, d: 1, 1, 1
155*330d8983SJohannes Doerfert CHECK_PRESENCE(m, r, d);
156*330d8983SJohannes Doerfert }
157*330d8983SJohannes Doerfert // CHECK-NEXT: presence of m, r, d: 0, 0, 0
158*330d8983SJohannes Doerfert CHECK_PRESENCE(m, r, d);
159*330d8983SJohannes Doerfert
160*330d8983SJohannes Doerfert return 0;
161*330d8983SJohannes Doerfert }
162