xref: /llvm-project/offload/test/mapping/ompx_hold/target.c (revision 330d8983d25d08580fc1642fea48b2473f47a9da)
1 // RUN: %libomptarget-compile-generic -fopenmp-extensions
2 // RUN: %libomptarget-run-generic | %fcheck-generic -strict-whitespace
3 
4 #include <omp.h>
5 #include <stdio.h>
6 
7 #define CHECK_PRESENCE(Var1, Var2, Var3)                                       \
8   printf("    presence of %s, %s, %s: %d, %d, %d\n", #Var1, #Var2, #Var3,      \
9          omp_target_is_present(&Var1, omp_get_default_device()),               \
10          omp_target_is_present(&Var2, omp_get_default_device()),               \
11          omp_target_is_present(&Var3, omp_get_default_device()))
12 
main()13 int main() {
14   int m, r, d;
15   // CHECK: presence of m, r, d: 0, 0, 0
16   CHECK_PRESENCE(m, r, d);
17 
18   // -----------------------------------------------------------------------
19   // CHECK-NEXT: check:{{.*}}
20   printf("check: dyn>0, hold=0, dec dyn=0\n");
21 
22   // CHECK-NEXT: once
23   printf("  once\n");
24 #pragma omp target map(tofrom : m) map(alloc : r, d)
25   ;
26   // CHECK-NEXT: presence of m, r, d: 0, 0, 0
27   CHECK_PRESENCE(m, r, d);
28 
29   // CHECK-NEXT: twice
30   printf("  twice\n");
31 #pragma omp target data map(tofrom : m) map(alloc : r, d)
32   {
33     // CHECK-NEXT: presence of m, r, d: 1, 1, 1
34     CHECK_PRESENCE(m, r, d);
35 #pragma omp target map(tofrom : m) map(alloc : r, d)
36     ;
37     // CHECK-NEXT: presence of m, r, d: 1, 1, 1
38     CHECK_PRESENCE(m, r, d);
39   }
40   // CHECK-NEXT: presence of m, r, d: 0, 0, 0
41   CHECK_PRESENCE(m, r, d);
42 
43   // -----------------------------------------------------------------------
44   // CHECK: check:{{.*}}
45   printf("check: dyn=0, hold>0, dec hold=0\n");
46 
47   // CHECK-NEXT: once
48   printf("  once\n");
49 #pragma omp target map(ompx_hold, tofrom : m) map(ompx_hold, alloc : r, d)
50   ;
51   // CHECK-NEXT: presence of m, r, d: 0, 0, 0
52   CHECK_PRESENCE(m, r, d);
53 
54   // CHECK-NEXT: twice
55   printf("  twice\n");
56 #pragma omp target data map(ompx_hold, tofrom : m) map(ompx_hold, alloc : r, d)
57   {
58     // CHECK-NEXT: presence of m, r, d: 1, 1, 1
59     CHECK_PRESENCE(m, r, d);
60 #pragma omp target map(ompx_hold, tofrom : m) map(ompx_hold, alloc : r, d)
61     ;
62     // CHECK-NEXT: presence of m, r, d: 1, 1, 1
63     CHECK_PRESENCE(m, r, d);
64   }
65   // CHECK-NEXT: presence of m, r, d: 0, 0, 0
66   CHECK_PRESENCE(m, r, d);
67 
68   // -----------------------------------------------------------------------
69   // CHECK: check:{{.*}}
70   printf("check: dyn>0, hold>0, dec dyn=0, dec hold=0\n");
71 
72   // CHECK-NEXT: once each
73   printf("  once each\n");
74 #pragma omp target data map(ompx_hold, tofrom : m) map(ompx_hold, alloc : r, d)
75   {
76     // CHECK-NEXT: presence of m, r, d: 1, 1, 1
77     CHECK_PRESENCE(m, r, d);
78 #pragma omp target map(tofrom : m) map(alloc : r, d)
79     ;
80     // CHECK-NEXT: presence of m, r, d: 1, 1, 1
81     CHECK_PRESENCE(m, r, d);
82   }
83   // CHECK-NEXT: presence of m, r, d: 0, 0, 0
84   CHECK_PRESENCE(m, r, d);
85 
86   // CHECK-NEXT: twice each
87   printf("  twice each\n");
88 #pragma omp target data map(ompx_hold, tofrom : m) map(ompx_hold, alloc : r, d)
89   {
90     // CHECK-NEXT: presence of m, r, d: 1, 1, 1
91     CHECK_PRESENCE(m, r, d);
92 #pragma omp target data map(ompx_hold, tofrom : m) map(ompx_hold, alloc : r, d)
93     {
94       // CHECK-NEXT: presence of m, r, d: 1, 1, 1
95       CHECK_PRESENCE(m, r, d);
96 #pragma omp target data map(tofrom : m) map(alloc : r, d)
97       {
98         // CHECK-NEXT: presence of m, r, d: 1, 1, 1
99         CHECK_PRESENCE(m, r, d);
100 #pragma omp target map(tofrom : m) map(alloc : r, d)
101         ;
102         // CHECK-NEXT: presence of m, r, d: 1, 1, 1
103         CHECK_PRESENCE(m, r, d);
104       }
105       // CHECK-NEXT: presence of m, r, d: 1, 1, 1
106       CHECK_PRESENCE(m, r, d);
107     }
108     // CHECK-NEXT: presence of m, r, d: 1, 1, 1
109     CHECK_PRESENCE(m, r, d);
110   }
111   // CHECK-NEXT: presence of m, r, d: 0, 0, 0
112   CHECK_PRESENCE(m, r, d);
113 
114   // -----------------------------------------------------------------------
115   // CHECK: check:{{.*}}
116   printf("check: dyn>0, hold>0, dec hold=0, dec dyn=0\n");
117 
118   // CHECK-NEXT: once each
119   printf("  once each\n");
120 #pragma omp target data map(tofrom : m) map(alloc : r, d)
121   {
122     // CHECK-NEXT: presence of m, r, d: 1, 1, 1
123     CHECK_PRESENCE(m, r, d);
124 #pragma omp target map(ompx_hold, tofrom : m) map(ompx_hold, alloc : r, d)
125     ;
126     // CHECK-NEXT: presence of m, r, d: 1, 1, 1
127     CHECK_PRESENCE(m, r, d);
128   }
129   // CHECK-NEXT: presence of m, r, d: 0, 0, 0
130   CHECK_PRESENCE(m, r, d);
131 
132   // CHECK-NEXT: twice each
133   printf("  twice each\n");
134 #pragma omp target data map(tofrom : m) map(alloc : r, d)
135   {
136     // CHECK-NEXT: presence of m, r, d: 1, 1, 1
137     CHECK_PRESENCE(m, r, d);
138 #pragma omp target data map(tofrom : m) map(alloc : r, d)
139     {
140       // CHECK-NEXT: presence of m, r, d: 1, 1, 1
141       CHECK_PRESENCE(m, r, d);
142 #pragma omp target data map(ompx_hold, tofrom : m) map(ompx_hold, alloc : r, d)
143       {
144         // CHECK-NEXT: presence of m, r, d: 1, 1, 1
145         CHECK_PRESENCE(m, r, d);
146 #pragma omp target map(ompx_hold, tofrom : m) map(ompx_hold, alloc : r, d)
147         ;
148         // CHECK-NEXT: presence of m, r, d: 1, 1, 1
149         CHECK_PRESENCE(m, r, d);
150       }
151       // CHECK-NEXT: presence of m, r, d: 1, 1, 1
152       CHECK_PRESENCE(m, r, d);
153     }
154     // CHECK-NEXT: presence of m, r, d: 1, 1, 1
155     CHECK_PRESENCE(m, r, d);
156   }
157   // CHECK-NEXT: presence of m, r, d: 0, 0, 0
158   CHECK_PRESENCE(m, r, d);
159 
160   return 0;
161 }
162