aboutsummaryrefslogtreecommitdiff
path: root/libgomp
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2019-06-05 09:37:40 +0200
committerJakub Jelinek <jakub@gcc.gnu.org>2019-06-05 09:37:40 +0200
commit28b3a77ca055b31aa20c6d263be42c49be32756b (patch)
treed8b2e5d9a854fa1c38354bd53152dc401bc87199 /libgomp
parent9ea2bfca6a3fd80f14d24557f71efaafae3846a9 (diff)
downloadgcc-28b3a77ca055b31aa20c6d263be42c49be32756b.zip
gcc-28b3a77ca055b31aa20c6d263be42c49be32756b.tar.gz
gcc-28b3a77ca055b31aa20c6d263be42c49be32756b.tar.bz2
omp-low.c (lower_rec_input_clauses): For lastprivate conditional references...
* omp-low.c (lower_rec_input_clauses): For lastprivate conditional references, lookup in in hash map MEM_REF operand instead of the MEM_REF itself. (lower_omp_1): When looking for lastprivate conditional assignments, handle MEM_REFs with REFERENCE_TYPE operands. * testsuite/libgomp.c++/lastprivate-conditional-1.C: New test. * testsuite/libgomp.c++/lastprivate-conditional-2.C: New test. From-SVN: r271948
Diffstat (limited to 'libgomp')
-rw-r--r--libgomp/ChangeLog5
-rw-r--r--libgomp/testsuite/libgomp.c++/lastprivate-conditional-1.C62
-rw-r--r--libgomp/testsuite/libgomp.c++/lastprivate-conditional-2.C104
3 files changed, 171 insertions, 0 deletions
diff --git a/libgomp/ChangeLog b/libgomp/ChangeLog
index 6371092..2ea937e 100644
--- a/libgomp/ChangeLog
+++ b/libgomp/ChangeLog
@@ -1,3 +1,8 @@
+2019-06-05 Jakub Jelinek <jakub@redhat.com>
+
+ * testsuite/libgomp.c++/lastprivate-conditional-1.C: New test.
+ * testsuite/libgomp.c++/lastprivate-conditional-2.C: New test.
+
2019-06-04 Jakub Jelinek <jakub@redhat.com>
* testsuite/libgomp.c-c++-common/lastprivate-conditional-7.c: New test.
diff --git a/libgomp/testsuite/libgomp.c++/lastprivate-conditional-1.C b/libgomp/testsuite/libgomp.c++/lastprivate-conditional-1.C
new file mode 100644
index 0000000..e0ec5d5
--- /dev/null
+++ b/libgomp/testsuite/libgomp.c++/lastprivate-conditional-1.C
@@ -0,0 +1,62 @@
+extern "C" void abort ();
+int w;
+struct S { int s, &t; S () : s (0), t (w) {}; void foo (short &); bool bar (int, int); void baz (short &); };
+
+bool
+S::bar (int i, int q)
+{
+ switch (q)
+ {
+ case 0: return (i % 17) == 7;
+ case 1: return (i % 19) == 2;
+ case 2: return (i % 23) == 5;
+ default: abort ();
+ }
+}
+
+void
+S::foo (short &x)
+{
+ #pragma omp for lastprivate (conditional: x, s, t)
+ for (int i = 0; i < 1025; ++i)
+ {
+ if (bar (i, 0))
+ x = i;
+ if (bar (i, 1))
+ s = i + 3;
+ if (bar (i, 2))
+ t = i + 6;
+ }
+}
+
+void
+S::baz (short &x)
+{
+ #pragma omp parallel for lastprivate (conditional: x, s, t) collapse (3)
+ for (int i = 0; i < 15; ++i)
+ for (int j = -4; j < 9; j++)
+ for (int k = 12; k > 7; --k)
+ {
+ int l = (k - 8) + (j + 4) * 5 + i * 13 * 5;
+ if (bar (l, 0))
+ x = l;
+ if (bar (l, 1))
+ s = l + 3;
+ if (bar (l, 2))
+ t = l + 6;
+ }
+}
+
+int
+main ()
+{
+ short x;
+ S s;
+ #pragma omp parallel
+ s.foo (x);
+ if (x != 1010 || s.s != 1012 || s.t != 1023)
+ abort ();
+ s.baz (x);
+ if (x != 959 || s.s != 974 || s.t != 977)
+ abort ();
+}
diff --git a/libgomp/testsuite/libgomp.c++/lastprivate-conditional-2.C b/libgomp/testsuite/libgomp.c++/lastprivate-conditional-2.C
new file mode 100644
index 0000000..742ef21
--- /dev/null
+++ b/libgomp/testsuite/libgomp.c++/lastprivate-conditional-2.C
@@ -0,0 +1,104 @@
+extern "C" void abort ();
+int w;
+struct S {
+ int s, &t;
+ int *p;
+ S (int *x) : s (0), t (w), p(x) {};
+ void foo (short &);
+ void bar (short &);
+ void baz (short &);
+ void qux (short &);
+};
+
+void
+S::foo (short &x)
+{
+ #pragma omp simd lastprivate (conditional: x, s, t)
+ for (int i = 0; i < 1025; ++i)
+ {
+ if (p[i])
+ x = i;
+ if (p[i + 1025])
+ s = i + 3;
+ if (p[i + 2 * 1025])
+ t = i + 6;
+ }
+}
+
+void
+S::bar (short &x)
+{
+ #pragma omp simd lastprivate (conditional: x, s, t) collapse (3) if (0)
+ for (int i = 0; i < 15; ++i)
+ for (int j = -4; j < 9; j++)
+ for (int k = 12; k > 7; --k)
+ {
+ int l = (k - 8) + (j + 4) * 5 + i * 13 * 5;
+ if (p[l])
+ x = l;
+ if (p[l + 1025])
+ s = l + 3;
+ if (p[l + 1025 * 2])
+ t = l + 6;
+ }
+}
+
+void
+S::baz (short &x)
+{
+ #pragma omp parallel for simd lastprivate (conditional: x, s, t) if (simd: 0)
+ for (int i = 0; i < 1025; ++i)
+ {
+ if (p[i])
+ x = i;
+ if (p[i + 1025])
+ s = i + 3;
+ if (p[i + 2 * 1025])
+ t = i + 6;
+ }
+}
+
+void
+S::qux (short &x)
+{
+ #pragma omp for simd lastprivate (conditional: x, s, t) collapse (3) schedule (simd: guided, 8)
+ for (int i = 0; i < 15; ++i)
+ for (int j = -4; j < 9; j++)
+ for (int k = 12; k > 7; --k)
+ {
+ int l = (k - 8) + (j + 4) * 5 + i * 13 * 5;
+ if (p[l])
+ x = l;
+ if (p[l + 1025])
+ s = l + 3;
+ if (p[l + 1025 * 2])
+ t = l + 6;
+ }
+}
+
+int
+main ()
+{
+ short x;
+ int a[3 * 1025];
+ for (int i = 0; i < 1025; ++i)
+ {
+ a[i] = ((i % 17) == 7);
+ a[1025 + i] = ((i % 19) == 2);
+ a[2 * 1025 + i] = ((i % 23) == 5);
+ }
+ S s = a;
+ s.foo (x);
+ if (x != 1010 || s.s != 1012 || s.t != 1023)
+ abort ();
+ s.bar (x);
+ if (x != 959 || s.s != 974 || s.t != 977)
+ abort ();
+ #pragma omp parallel
+ s.baz (x);
+ if (x != 1010 || s.s != 1012 || s.t != 1023)
+ abort ();
+ s.qux (x);
+ if (x != 959 || s.s != 974 || s.t != 977)
+ abort ();
+}