1 // RUN: %libomptarget-compilexx-run-and-check-generic
2 
3 #include <omp.h>
4 #include <stdio.h>
5 
6 #define N 1024
7 
8 int A[N];
9 int B[N];
10 int C[N];
main()11 int main() {
12   for (int i = 0; i < N; i++)
13     A[i] = B[i] = i;
14 
15 #pragma omp parallel num_threads(2)
16   {
17     if (omp_get_thread_num() == 1) {
18 // map data A & B and move to
19 #pragma omp target enter data map(to : A, B) depend(out : A[0]) nowait
20 
21 // no data move since already mapped
22 #pragma omp target map(A, B) depend(out : A[0]) nowait
23       {
24         for (int i = 0; i < N; i++)
25           ++A[i];
26         for (int i = 0; i < N; i++)
27           ++B[i];
28       }
29 
30 // no data move since already mapped
31 #pragma omp target teams num_teams(1) map(A, B) depend(out : A[0]) nowait
32       {
33         for (int i = 0; i < N; i++)
34           ++A[i];
35         for (int i = 0; i < N; i++)
36           ++B[i];
37       }
38 
39 // A updated via update
40 #pragma omp target update from(A) depend(out : A[0]) nowait
41 
42 // B updated via exit, A just released
43 #pragma omp target exit data map(release                                       \
44                                  : A) map(from                                 \
45                                           : B) depend(out                      \
46                                                       : A[0]) nowait
47     } // if
48   }   // parallel
49 
50   int Sum = 0;
51   for (int i = 0; i < N; i++)
52     Sum += A[i] + B[i];
53   // Sum is 2 * N * (2 + N - 1 + 2) / 2
54   // CHECK: Sum = 1051648.
55   printf("Sum = %d.\n", Sum);
56 
57   return Sum != 2 * N * (2 + N - 1 + 2) / 2;
58 }
59 
60