xref: /llvm-project/offload/test/mapping/ompx_hold/target.c (revision 330d8983d25d08580fc1642fea48b2473f47a9da)
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