| // RUN: %libomptarget-compilexx-run-and-check-generic | |
| #include <omp.h> | |
| #include <stdio.h> | |
| #define TRUE 1 | |
| #define FALSE 0 | |
| struct TY1 { | |
| int i1, i2, i3; | |
| static constexpr auto name = "TY1"; | |
| }; | |
| struct TY2 { | |
| int i1, i2, i3; | |
| static constexpr auto name = "TY2"; | |
| }; | |
| // TY1 is not mapped, TY2 is | |
| #pragma omp declare mapper(TY2 t) map(to : t.i1) map(from : t.i3) | |
| struct TY3 { | |
| TY2 n; | |
| static constexpr auto name = "TY3"; | |
| }; | |
| struct TY4 { | |
| int a; | |
| TY2 n; | |
| int b; | |
| static constexpr auto name = "TY4"; | |
| }; | |
| template <typename T> int testType() { | |
| T t1[2], t2[3], t3[4]; | |
| for (int i = 0; i < 2; i++) | |
| t1[i].i1 = t3[i].i1 = 1; | |
| #pragma omp target map(tofrom : t1, t2, t3) | |
| for (int i = 0; i < 2; i++) { | |
| t1[i].i3 = t3[i].i3 = t1[i].i1; | |
| t1[i].i1 = t3[i].i1 = 7; | |
| } | |
| for (int i = 0; i < 2; i++) { | |
| if (t1[i].i3 != 1) { | |
| printf("failed %s. t1[%d].i3 (%d) != t1[%d].i1 (%d)\n", T::name, i, | |
| t1[i].i3, i, t1[i].i1); | |
| return 1; | |
| } | |
| if (t3[i].i3 != 1) { | |
| printf("failed %s. t3[%d].i3 (%d) != t3[%d].i1 (%d)\n", T::name, i, | |
| t3[i].i3, i, t3[i].i1); | |
| return 1; | |
| } | |
| } | |
| int pt0 = omp_target_is_present(&t1[0], omp_get_default_device()); | |
| int pt1 = omp_target_is_present(&t2[1], omp_get_default_device()); | |
| int pt2 = omp_target_is_present(&t3[2], omp_get_default_device()); | |
| printf("present check for %s: t1 %i, t2 %i, t3 %i, expected 3x 0\n", T::name, | |
| pt0, pt1, pt2); | |
| return pt0 + pt1 + pt2; | |
| } | |
| template <typename T> int testTypeNestedPtr(T t1[2], T t2[3], T t3[4]) { | |
| for (int i = 0; i < 2; i++) | |
| t1[i].n.i1 = t3[i].n.i1 = 1; | |
| #pragma omp target map(tofrom : t1[0 : 2], t2[0 : 3], t3[0 : 4]) | |
| for (int i = 0; i < 2; i++) { | |
| t1[i].n.i3 = t3[i].n.i3 = t1[i].n.i1; | |
| t1[i].n.i1 = t3[i].n.i1 = 7; | |
| } | |
| for (int i = 0; i < 2; i++) { | |
| if (t1[i].n.i3 != t1[i].n.i1) { | |
| printf("failed %s-ptr. t1[%d].i3 (%d) != t1[%d].i1 (%d)\n", T::name, i, | |
| t1[i].n.i3, i, t1[i].n.i1); | |
| return 1; | |
| } | |
| if (t3[i].n.i3 != t3[i].n.i1) { | |
| printf("failed %s-ptr. t3[%d].i3 (%d) != t3[%d].i1 (%d)\n", T::name, i, | |
| t3[i].n.i3, i, t3[i].n.i1); | |
| return 1; | |
| } | |
| } | |
| int pt0 = omp_target_is_present(&t1[0], omp_get_default_device()); | |
| int pt1 = omp_target_is_present(&t2[1], omp_get_default_device()); | |
| int pt2 = omp_target_is_present(&t3[2], omp_get_default_device()); | |
| printf("present check for %s-ptr: t1 %i, t2 %i, t3 %i, expected 3x 0\n", | |
| T::name, pt0, pt1, pt2); | |
| return pt0 + pt1 + pt2; | |
| } | |
| template <typename T> int testTypeNested() { | |
| T t1[2], t2[3], t3[4]; | |
| testTypeNestedPtr(t1, t2, t3); | |
| for (int i = 0; i < 2; i++) | |
| t1[i].n.i1 = t3[i].n.i1 = 1; | |
| #pragma omp target map(tofrom : t1, t2, t3) | |
| for (int i = 0; i < 2; i++) { | |
| t1[i].n.i3 = t3[i].n.i3 = t1[i].n.i1; | |
| t1[i].n.i1 = t3[i].n.i1 = 7; | |
| } | |
| for (int i = 0; i < 2; i++) { | |
| if (t1[i].n.i3 != t1[i].n.i1) { | |
| printf("failed %s. t1[%d].i3 (%d) != t1[%d].i1 (%d)\n", T::name, i, | |
| t1[i].n.i3, i, t1[i].n.i1); | |
| return 1; | |
| } | |
| if (t3[i].n.i3 != t3[i].n.i1) { | |
| printf("failed %s. t3[%d].i3 (%d) != t3[%d].i1 (%d)\n", T::name, i, | |
| t3[i].n.i3, i, t3[i].n.i1); | |
| return 1; | |
| } | |
| } | |
| int pt0 = omp_target_is_present(&t1[0], omp_get_default_device()); | |
| int pt1 = omp_target_is_present(&t2[1], omp_get_default_device()); | |
| int pt2 = omp_target_is_present(&t3[2], omp_get_default_device()); | |
| printf("present check for %s: t1 %i, t2 %i, t3 %i, expected 3x 0\n", T::name, | |
| pt0, pt1, pt2); | |
| return pt0 + pt1 + pt2; | |
| } | |
| int main(int argc, char **argv) { | |
| int r = 0; | |
| r += testType<TY1>(); | |
| // CHECK: present check for TY1: t1 0, t2 0, t3 0, expected 3x 0 | |
| r += testType<TY2>(); | |
| // CHECK: present check for TY2: t1 0, t2 0, t3 0, expected 3x 0 | |
| r += testTypeNested<TY3>(); | |
| // CHECK: present check for TY3-ptr: t1 0, t2 0, t3 0, expected 3x 0 | |
| // CHECK: present check for TY3: t1 0, t2 0, t3 0, expected 3x 0 | |
| r += testTypeNested<TY4>(); | |
| // CHECK: present check for TY4-ptr: t1 0, t2 0, t3 0, expected 3x 0 | |
| // CHECK: present check for TY4: t1 0, t2 0, t3 0, expected 3x 0 | |
| return r; | |
| } |