xref: /llvm-project/offload/test/mapping/target_has_device_addr.c (revision 330d8983d25d08580fc1642fea48b2473f47a9da)
1*330d8983SJohannes Doerfert // RUN: %libomptarget-compile-generic -fopenmp-version=51
2*330d8983SJohannes Doerfert // RUN: %libomptarget-run-generic 2>&1 \
3*330d8983SJohannes Doerfert // RUN: | %fcheck-generic
4*330d8983SJohannes Doerfert 
5*330d8983SJohannes Doerfert // UNSUPPORTED: amdgcn-amd-amdhsa
6*330d8983SJohannes Doerfert 
7*330d8983SJohannes Doerfert #include <omp.h>
8*330d8983SJohannes Doerfert #include <stdio.h>
9*330d8983SJohannes Doerfert #include <stdlib.h>
10*330d8983SJohannes Doerfert 
11*330d8983SJohannes Doerfert #define N 1024
12*330d8983SJohannes Doerfert #define FROM 64
13*330d8983SJohannes Doerfert #define LENGTH 128
14*330d8983SJohannes Doerfert 
foo()15*330d8983SJohannes Doerfert void foo() {
16*330d8983SJohannes Doerfert   const int device_id = omp_get_default_device();
17*330d8983SJohannes Doerfert   float *A;
18*330d8983SJohannes Doerfert   A = (float *)omp_target_alloc((FROM + LENGTH) * sizeof(float), device_id);
19*330d8983SJohannes Doerfert 
20*330d8983SJohannes Doerfert   float *A_dev = NULL;
21*330d8983SJohannes Doerfert #pragma omp target has_device_addr(A[FROM : LENGTH]) map(A_dev)
22*330d8983SJohannes Doerfert   { A_dev = A; }
23*330d8983SJohannes Doerfert   // CHECK: Success
24*330d8983SJohannes Doerfert   if (A_dev == NULL || A_dev != A)
25*330d8983SJohannes Doerfert     fprintf(stderr, "Failure %p %p \n", A_dev, A);
26*330d8983SJohannes Doerfert   else
27*330d8983SJohannes Doerfert     fprintf(stderr, "Success\n");
28*330d8983SJohannes Doerfert }
29*330d8983SJohannes Doerfert 
bar()30*330d8983SJohannes Doerfert void bar() {
31*330d8983SJohannes Doerfert   short x[10];
32*330d8983SJohannes Doerfert   short *xp = &x[0];
33*330d8983SJohannes Doerfert 
34*330d8983SJohannes Doerfert   x[1] = 111;
35*330d8983SJohannes Doerfert #pragma omp target data map(tofrom : xp[0 : 2]) use_device_addr(xp[0 : 2])
36*330d8983SJohannes Doerfert #pragma omp target has_device_addr(xp[0 : 2])
37*330d8983SJohannes Doerfert   {
38*330d8983SJohannes Doerfert     xp[1] = 222;
39*330d8983SJohannes Doerfert     // CHECK: 222
40*330d8983SJohannes Doerfert     printf("%d %p\n", xp[1], &xp[1]);
41*330d8983SJohannes Doerfert   }
42*330d8983SJohannes Doerfert   // CHECK: 222
43*330d8983SJohannes Doerfert   printf("%d %p\n", xp[1], &xp[1]);
44*330d8983SJohannes Doerfert }
45*330d8983SJohannes Doerfert 
moo()46*330d8983SJohannes Doerfert void moo() {
47*330d8983SJohannes Doerfert   short *b = malloc(sizeof(short));
48*330d8983SJohannes Doerfert   b = b - 1;
49*330d8983SJohannes Doerfert 
50*330d8983SJohannes Doerfert   b[1] = 111;
51*330d8983SJohannes Doerfert #pragma omp target data map(tofrom : b[1]) use_device_addr(b[1])
52*330d8983SJohannes Doerfert #pragma omp target has_device_addr(b[1])
53*330d8983SJohannes Doerfert   {
54*330d8983SJohannes Doerfert     b[1] = 222;
55*330d8983SJohannes Doerfert     // CHECK: 222
56*330d8983SJohannes Doerfert     printf("%hd %p %p %p\n", b[1], b, &b[1], &b);
57*330d8983SJohannes Doerfert   }
58*330d8983SJohannes Doerfert   // CHECK: 222
59*330d8983SJohannes Doerfert   printf("%hd %p %p %p\n", b[1], b, &b[1], &b);
60*330d8983SJohannes Doerfert }
61*330d8983SJohannes Doerfert 
zoo()62*330d8983SJohannes Doerfert void zoo() {
63*330d8983SJohannes Doerfert   short x[10];
64*330d8983SJohannes Doerfert   short *(xp[10]);
65*330d8983SJohannes Doerfert   xp[1] = &x[0];
66*330d8983SJohannes Doerfert   short **xpp = &xp[0];
67*330d8983SJohannes Doerfert 
68*330d8983SJohannes Doerfert   x[1] = 111;
69*330d8983SJohannes Doerfert #pragma omp target data map(tofrom : xpp[1][1]) use_device_addr(xpp[1][1])
70*330d8983SJohannes Doerfert #pragma omp target has_device_addr(xpp[1][1])
71*330d8983SJohannes Doerfert   {
72*330d8983SJohannes Doerfert     xpp[1][1] = 222;
73*330d8983SJohannes Doerfert     // CHECK: 222
74*330d8983SJohannes Doerfert     printf("%d %p %p\n", xpp[1][1], xpp[1], &xpp[1][1]);
75*330d8983SJohannes Doerfert   }
76*330d8983SJohannes Doerfert   // CHECK: 222
77*330d8983SJohannes Doerfert   printf("%d %p %p\n", xpp[1][1], xpp[1], &xpp[1][1]);
78*330d8983SJohannes Doerfert }
xoo()79*330d8983SJohannes Doerfert void xoo() {
80*330d8983SJohannes Doerfert   short a[10], b[10];
81*330d8983SJohannes Doerfert   a[1] = 111;
82*330d8983SJohannes Doerfert   b[1] = 111;
83*330d8983SJohannes Doerfert #pragma omp target data map(to : a[0 : 2], b[0 : 2]) use_device_addr(a, b)
84*330d8983SJohannes Doerfert #pragma omp target has_device_addr(a) has_device_addr(b[0])
85*330d8983SJohannes Doerfert   {
86*330d8983SJohannes Doerfert     a[1] = 222;
87*330d8983SJohannes Doerfert     b[1] = 222;
88*330d8983SJohannes Doerfert     // CHECK: 222 222
89*330d8983SJohannes Doerfert     printf("%hd %hd %p %p %p\n", a[1], b[1], &a, b, &b);
90*330d8983SJohannes Doerfert   }
91*330d8983SJohannes Doerfert   // CHECK:111
92*330d8983SJohannes Doerfert   printf("%hd %hd %p %p %p\n", a[1], b[1], &a, b, &b); // 111 111 p1d p2d p3d
93*330d8983SJohannes Doerfert }
main()94*330d8983SJohannes Doerfert int main() {
95*330d8983SJohannes Doerfert   foo();
96*330d8983SJohannes Doerfert   bar();
97*330d8983SJohannes Doerfert   moo();
98*330d8983SJohannes Doerfert   zoo();
99*330d8983SJohannes Doerfert   xoo();
100*330d8983SJohannes Doerfert   return 0;
101*330d8983SJohannes Doerfert }
102