diff options
Diffstat (limited to 'libgomp/testsuite/libgomp.c++/private-1.C')
-rw-r--r-- | libgomp/testsuite/libgomp.c++/private-1.C | 247 |
1 files changed, 247 insertions, 0 deletions
diff --git a/libgomp/testsuite/libgomp.c++/private-1.C b/libgomp/testsuite/libgomp.c++/private-1.C new file mode 100644 index 0000000..19ee726 --- /dev/null +++ b/libgomp/testsuite/libgomp.c++/private-1.C @@ -0,0 +1,247 @@ +/* PR c++/110347 */ + +#include <omp.h> +#include <stdint.h> +#include <stdlib.h> + +struct S { + int A, B[10], *C; + void f (int dev); + void g (int dev); +}; + +template<typename T> +struct St { + T A, B[10], *C; + void ft (int dev); + void gt (int dev); +}; + + +void +S::f (int dev) +{ + A = 5; + C = (int *) malloc (sizeof (int) * 10); + uintptr_t c_saved = (uintptr_t) C; + for (int i = 0; i < 10; i++) + B[i] = C[i] = i+5; + + #pragma omp target private(A) private(B) private(C) device(dev) + { + A = 99; + for (int i = 0; i < 10; i++) + B[i] = -i-23; + C = &A; + } + + if (A != 5) + abort (); + if (c_saved != (uintptr_t) C) + abort (); + for (int i = 0; i < 10; i++) + if (B[i] != i + 5 || C[i] != i+5) + abort (); + + #pragma omp parallel if (0) private(A) private(B) private(C) + { + A = 99; + for (int i = 0; i < 10; i++) + B[i] = -i-23; + C = &A; + } + + if (A != 5) + abort (); + if (c_saved != (uintptr_t) C) + abort (); + for (int i = 0; i < 10; i++) + if (B[i] != i + 5 || C[i] != i+5) + abort (); + + free (C); +} + +void +S::g (int dev) +{ + A = 5; + C = (int *) malloc (sizeof (int) * 10); + uintptr_t c_saved = (uintptr_t) C; + for (int i = 0; i < 10; i++) + B[i] = C[i] = i+5; + + #pragma omp target private(A) private(B) private(C) \ + allocate(allocator(omp_low_lat_mem_alloc), align(128): A, B, C) \ + device(dev) + { +#if 0 /* FIXME: The following is disabled because of PR middle-end/113436. */ + if (((uintptr_t) &A) % 128 != 0) + abort (); + if (((uintptr_t) &B) % 128 != 0) + abort (); + if (((uintptr_t) &C) % 128 != 0) + abort (); +#endif + A = 99; + for (int i = 0; i < 10; i++) + B[i] = -i-23; + C = &A; + } + + if (A != 5) + abort (); + if (c_saved != (uintptr_t) C) + abort (); + for (int i = 0; i < 10; i++) + if (B[i] != i + 5 || C[i] != i+5) + abort (); + + #pragma omp parallel if (0) private(A) private(B) private(C) \ + allocate(allocator(omp_low_lat_mem_alloc), align(128): A, B, C) + { + if (((uintptr_t) &A) % 128 != 0) + abort (); + if (((uintptr_t) &B) % 128 != 0) + abort (); + if (((uintptr_t) &C) % 128 != 0) + abort (); + A = 99; + for (int i = 0; i < 10; i++) + B[i] = -i-23; + C = &A; + } + + if (A != 5) + abort (); + if (c_saved != (uintptr_t) C) + abort (); + for (int i = 0; i < 10; i++) + if (B[i] != i + 5 || C[i] != i+5) + abort (); + + free (C); +} + + +template<typename T> +void +St<T>::ft (int dev) +{ + A = 5; + C = (T *) malloc (sizeof (T) * 10); + uintptr_t c_saved = (uintptr_t) C; + for (int i = 0; i < 10; i++) + B[i] = C[i] = i+5; + + #pragma omp target private(A) private(B) private(C) device(dev) + { + A = 99; + for (int i = 0; i < 10; i++) + B[i] = -i-23; + C = &A; + } + + if (A != 5) + abort (); + if (c_saved != (uintptr_t) C) + abort (); + for (int i = 0; i < 10; i++) + if (B[i] != i + 5 || C[i] != i+5) + abort (); + + #pragma omp parallel if (0) private(A) private(B) private(C) + { + A = 99; + for (int i = 0; i < 10; i++) + B[i] = -i-23; + C = &A; + } + + if (A != 5) + abort (); + if (c_saved != (uintptr_t) C) + abort (); + for (int i = 0; i < 10; i++) + if (B[i] != i + 5 || C[i] != i+5) + abort (); + + free (C); +} + +template<typename T> +void +St<T>::gt (int dev) +{ + A = 5; + C = (T *) malloc (sizeof (T) * 10); + uintptr_t c_saved = (uintptr_t) C; + for (int i = 0; i < 10; i++) + B[i] = C[i] = i+5; + + #pragma omp target private(A) private(B) private(C) \ + allocate(allocator(omp_low_lat_mem_alloc), align(128): A, B, C) \ + device(dev) + { +#if 0 /* FIXME: The following is disabled because of PR middle-end/113436. */ + if (((uintptr_t) &A) % 128 != 0) + abort (); + if (((uintptr_t) &B) % 128 != 0) + abort (); + if (((uintptr_t) &C) % 128 != 0) + abort (); +#endif + A = 99; + for (int i = 0; i < 10; i++) + B[i] = -i-23; + C = &A; + } + + if (A != 5) + abort (); + if (c_saved != (uintptr_t) C) + abort (); + for (int i = 0; i < 10; i++) + if (B[i] != i + 5 || C[i] != i+5) + abort (); + + #pragma omp parallel if (0) private(A) private(B) private(C) \ + allocate(allocator(omp_low_lat_mem_alloc), align(128): A, B, C) + { + if (((uintptr_t) &A) % 128 != 0) + abort (); + if (((uintptr_t) &B) % 128 != 0) + abort (); + if (((uintptr_t) &C) % 128 != 0) + abort (); + A = 99; + for (int i = 0; i < 10; i++) + B[i] = -i-23; + C = &A; + } + + if (A != 5) + abort (); + if (c_saved != (uintptr_t) C) + abort (); + for (int i = 0; i < 10; i++) + if (B[i] != i + 5 || C[i] != i+5) + abort (); + + free (C); +} + +int +main () +{ + struct S s; + struct St<int> st; + for (int dev = 0; dev <= omp_get_num_devices(); dev++) + { + s.f (dev); + st.ft (dev); + s.g (dev); + st.gt (dev); + } + return 0; +} |