aboutsummaryrefslogtreecommitdiff
path: root/libgomp/testsuite/libgomp.c++/private-1.C
diff options
context:
space:
mode:
Diffstat (limited to 'libgomp/testsuite/libgomp.c++/private-1.C')
-rw-r--r--libgomp/testsuite/libgomp.c++/private-1.C247
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;
+}