1*c1a6fe19SYe Luo // RUN: %libomptarget-compile-generic -fopenmp-version=51
2*c1a6fe19SYe Luo // RUN: %libomptarget-run-generic 2>&1 \
3*c1a6fe19SYe Luo // RUN: | %fcheck-generic
4*c1a6fe19SYe Luo 
5*c1a6fe19SYe Luo #include <stdio.h>
6*c1a6fe19SYe Luo #include <stdlib.h>
7*c1a6fe19SYe Luo 
8*c1a6fe19SYe Luo #define N 1024
9*c1a6fe19SYe Luo #define FROM 64
10*c1a6fe19SYe Luo #define LENGTH 128
11*c1a6fe19SYe Luo 
main()12*c1a6fe19SYe Luo int main() {
13*c1a6fe19SYe Luo   float *A = (float *)malloc(N * sizeof(float));
14*c1a6fe19SYe Luo   float *B = (float *)malloc(N * sizeof(float));
15*c1a6fe19SYe Luo   float *C = (float *)malloc(N * sizeof(float));
16*c1a6fe19SYe Luo 
17*c1a6fe19SYe Luo   for (int i = 0; i < N; i++) {
18*c1a6fe19SYe Luo     C[i] = 0.0;
19*c1a6fe19SYe Luo   }
20*c1a6fe19SYe Luo 
21*c1a6fe19SYe Luo   for (int i = 0; i < N; i++) {
22*c1a6fe19SYe Luo     A[i] = i;
23*c1a6fe19SYe Luo     B[i] = 2 * i;
24*c1a6fe19SYe Luo   }
25*c1a6fe19SYe Luo 
26*c1a6fe19SYe Luo #pragma omp target enter data map(to : A [FROM:LENGTH], B [FROM:LENGTH])
27*c1a6fe19SYe Luo #pragma omp target enter data map(alloc : C [FROM:LENGTH])
28*c1a6fe19SYe Luo 
29*c1a6fe19SYe Luo // A, B and C have been mapped starting at index FROM, but inside the kernel
30*c1a6fe19SYe Luo // they are captured implicitly so the library must look them up using their
31*c1a6fe19SYe Luo // base address.
32*c1a6fe19SYe Luo #pragma omp target
33*c1a6fe19SYe Luo   {
34*c1a6fe19SYe Luo     for (int i = FROM; i < FROM + LENGTH; i++) {
35*c1a6fe19SYe Luo       C[i] = A[i] + B[i];
36*c1a6fe19SYe Luo     }
37*c1a6fe19SYe Luo   }
38*c1a6fe19SYe Luo 
39*c1a6fe19SYe Luo #pragma omp target exit data map(from : C [FROM:LENGTH])
40*c1a6fe19SYe Luo #pragma omp target exit data map(delete : A [FROM:LENGTH], B [FROM:LENGTH])
41*c1a6fe19SYe Luo 
42*c1a6fe19SYe Luo   int errors = 0;
43*c1a6fe19SYe Luo   for (int i = FROM; i < FROM + LENGTH; i++)
44*c1a6fe19SYe Luo     if (C[i] != A[i] + B[i])
45*c1a6fe19SYe Luo       ++errors;
46*c1a6fe19SYe Luo 
47*c1a6fe19SYe Luo   // CHECK: Success
48*c1a6fe19SYe Luo   if (errors)
49*c1a6fe19SYe Luo     fprintf(stderr, "Failure\n");
50*c1a6fe19SYe Luo   else
51*c1a6fe19SYe Luo     fprintf(stderr, "Success\n");
52*c1a6fe19SYe Luo 
53*c1a6fe19SYe Luo   free(A);
54*c1a6fe19SYe Luo   free(B);
55*c1a6fe19SYe Luo   free(C);
56*c1a6fe19SYe Luo 
57*c1a6fe19SYe Luo   return 0;
58*c1a6fe19SYe Luo }
59