diff options
author | Jakub Jelinek <jakub@redhat.com> | 2019-06-05 09:37:40 +0200 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2019-06-05 09:37:40 +0200 |
commit | 28b3a77ca055b31aa20c6d263be42c49be32756b (patch) | |
tree | d8b2e5d9a854fa1c38354bd53152dc401bc87199 /libgomp | |
parent | 9ea2bfca6a3fd80f14d24557f71efaafae3846a9 (diff) | |
download | gcc-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/ChangeLog | 5 | ||||
-rw-r--r-- | libgomp/testsuite/libgomp.c++/lastprivate-conditional-1.C | 62 | ||||
-rw-r--r-- | libgomp/testsuite/libgomp.c++/lastprivate-conditional-2.C | 104 |
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 (); +} |