diff options
Diffstat (limited to 'offload/test/mapping/target_derefence_array_pointrs.cpp')
| -rw-r--r-- | offload/test/mapping/target_derefence_array_pointrs.cpp | 110 |
1 files changed, 110 insertions, 0 deletions
diff --git a/offload/test/mapping/target_derefence_array_pointrs.cpp b/offload/test/mapping/target_derefence_array_pointrs.cpp new file mode 100644 index 000000000000..a6dd4069a8f5 --- /dev/null +++ b/offload/test/mapping/target_derefence_array_pointrs.cpp @@ -0,0 +1,110 @@ +// RUN: %libomptarget-compilexx-generic -fopenmp-version=51 +// RUN: %libomptarget-run-generic 2>&1 \ +// RUN: | %fcheck-generic + +// FIXME: This is currently broken on all GPU targets +// UNSUPPORTED: amdgcn-amd-amdhsa +// UNSUPPORTED: nvptx64-nvidia-cuda +// UNSUPPORTED: nvptx64-nvidia-cuda-LTO + +#include <stdio.h> +#include <stdlib.h> + +void foo(int **t1d) { + int ***t2d = &t1d; + int ****t3d = &t2d; + *t1d = (int *)malloc(3 * sizeof(int)); + int j, a = 0, b = 0; + + for (j = 0; j < 3; j++) + (*t1d)[j] = 0; +#pragma omp target map(tofrom : (*t1d)[0 : 3]) + { (*t1d)[1] = 1; } + // CHECK: 1 + printf("%d\n", (*t1d)[1]); +#pragma omp target map(tofrom : (**t2d)[0 : 3]) + { (**t2d)[1] = 2; } + // CHECK: 2 + printf("%d\n", (**t2d)[1]); +#pragma omp target map(tofrom : (***t3d)[0 : 3]) + { (***t3d)[1] = 3; } + // CHECK: 3 + printf("%d\n", (***t3d)[1]); +#pragma omp target map(tofrom : (**t1d)) + { (*t1d)[0] = 4; } + // CHECK: 4 + printf("%d\n", (*t1d)[0]); +#pragma omp target map(tofrom : (*(*(t1d + a) + b))) + { *(*(t1d + a) + b) = 5; } + // CHECK: 5 + printf("%d\n", *(*(t1d + a) + b)); +} + +typedef int(T)[3]; +void bar() { + T **a; + int b[2][3]; + int(*p)[3] = b; + a = &p; + for (int i = 0; i < 3; i++) { + (**a)[1] = i; + } +#pragma omp target map((**a)[ : 3]) + { + (**a)[1] = 6; + // CHECK: 6 + printf("%d\n", (**a)[1]); + } +} + +struct SSA { + int i; + SSA *sa; + SSA() { + i = 1; + sa = this; + } +}; + +void zoo(int **f, SSA *sa) { + int *t = *f; + f = (int **)malloc(sa->i * 4 * sizeof(int)); + t = (int *)malloc(sa->i * sizeof(int)); + *(f + sa->i + 1) = t; + *(sa->sa->i + *(f + sa->i + 1)) = 4; + printf("%d\n", *(sa->sa->i + *(1 + sa->i + f))); +#pragma omp target map(sa, *(sa->sa->i + *(1 + sa->i + f))) + { *(sa->sa->i + *(1 + sa->i + f)) = 7; } + // CHECK: 7 + printf("%d\n", *(sa->sa->i + *(1 + sa->i + f))); +} + +void xoo() { + int *x = 0; + SSA *sa = new SSA(); + zoo(&x, sa); +} + +void yoo(int **x) { + *x = (int *)malloc(2 * sizeof(int)); +#pragma omp target map(**x) + { + **x = 8; + // CHECK: 8 + printf("%d\n", **x); + } +#pragma omp target map(*(*x + 1)) + { + *(*x + 1) = 9; + // CHECK: 9 + printf("%d\n", *(*x + 1)); + } +} + +int main() { + int *data = 0; + foo(&data); + bar(); + xoo(); + yoo(&data); +} |
