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