diff options
author | Jakub Jelinek <jakub@redhat.com> | 2014-03-27 14:18:52 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2014-03-27 14:18:52 +0100 |
commit | 47519a144635d5629368cf8e2f4b766ebdc963d9 (patch) | |
tree | fc4c9c5d99c998c3e3086017941ad3ae7152640c | |
parent | 82bb2e4069a7fdaa7cf8ccad2bdf7a6f8f4614c0 (diff) | |
download | gcc-47519a144635d5629368cf8e2f4b766ebdc963d9.zip gcc-47519a144635d5629368cf8e2f4b766ebdc963d9.tar.gz gcc-47519a144635d5629368cf8e2f4b766ebdc963d9.tar.bz2 |
re PR middle-end/60682 ([OpenMP] ICE on an assignment of local variable inside SIMD loop)
PR middle-end/60682
* omp-low.c (lower_omp_1): For gimple_clobber_p stmts,
if they need regimplification, just drop them instead of
calling gimple_regimplify_operands on them.
* g++.dg/gomp/pr60682.C: New test.
From-SVN: r208864
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/omp-low.c | 15 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/gomp/pr60682.C | 44 |
4 files changed, 70 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index fcec2ad..fb61812 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2014-03-27 Jakub Jelinek <jakub@redhat.com> + + PR middle-end/60682 + * omp-low.c (lower_omp_1): For gimple_clobber_p stmts, + if they need regimplification, just drop them instead of + calling gimple_regimplify_operands on them. + 2014-03-27 Marcus Shawcroft <marcus.shawcroft@arm.com> PR target/60580 diff --git a/gcc/omp-low.c b/gcc/omp-low.c index 7cc398e..11bb2d3 100644 --- a/gcc/omp-low.c +++ b/gcc/omp-low.c @@ -10124,7 +10124,20 @@ lower_omp_1 (gimple_stmt_iterator *gsi_p, omp_context *ctx) if ((ctx || task_shared_vars) && walk_gimple_op (stmt, lower_omp_regimplify_p, ctx ? NULL : &wi)) - gimple_regimplify_operands (stmt, gsi_p); + { + /* Just remove clobbers, this should happen only if we have + "privatized" local addressable variables in SIMD regions, + the clobber isn't needed in that case and gimplifying address + of the ARRAY_REF into a pointer and creating MEM_REF based + clobber would create worse code than we get with the clobber + dropped. */ + if (gimple_clobber_p (stmt)) + { + gsi_replace (gsi_p, gimple_build_nop (), true); + break; + } + gimple_regimplify_operands (stmt, gsi_p); + } break; } } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index fd9149e..c2a13d9 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2014-03-27 Jakub Jelinek <jakub@redhat.com> + + PR middle-end/60682 + * g++.dg/gomp/pr60682.C: New test. + 2014-03-27 John David Anglin <danglin@gcc.gnu.org> * gcc.dg/torture/pr60092.c: Remove default dg-skip-if arguments. diff --git a/gcc/testsuite/g++.dg/gomp/pr60682.C b/gcc/testsuite/g++.dg/gomp/pr60682.C new file mode 100644 index 0000000..fdd7a20 --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/pr60682.C @@ -0,0 +1,44 @@ +// PR middle-end/60682 +// { dg-do compile } +// { dg-options "-O2 -fopenmp-simd" } + +struct A +{ + float a; + A () {} + A (const A &x) { a = x.a; } +}; + +struct B +{ + A a[16]; +}; + +struct C +{ + float a[1]; + C () {} + C (const C &x) { a[0] = x.a[0]; } +}; + +struct D +{ + C a[16]; +}; + +void +foo (int x, B &y, D &z) +{ +#pragma omp simd + for (int i = 0; i < x; ++i) + { + A a; + y.a[i] = a; + } +#pragma omp simd + for (int i = 0; i < x; ++i) + { + C a; + z.a[i] = a; + } +} |