diff options
author | Jakub Jelinek <jakub@redhat.com> | 2020-02-05 11:32:37 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@redhat.com> | 2020-02-05 11:32:37 +0100 |
commit | b843bcb89519293404bb00d2ed09aae529b54d7f (patch) | |
tree | bcc9c051915ffe04939c1c31d9460d9bcf97d08f /gcc | |
parent | 27736735f6fcba464b90c3a9dff13b7e5c8bdc6e (diff) | |
download | gcc-b843bcb89519293404bb00d2ed09aae529b54d7f.zip gcc-b843bcb89519293404bb00d2ed09aae529b54d7f.tar.gz gcc-b843bcb89519293404bb00d2ed09aae529b54d7f.tar.bz2 |
openmp: Avoid ICEs with declare simd; declare simd inbranch [PR93555]
The testcases ICE because when processing the declare simd inbranch,
we don't create the i == 0 clone as it already exists, which means
clone_info->nargs is not adjusted, but we then rely on it being adjusted
when trying other clones.
2020-02-05 Jakub Jelinek <jakub@redhat.com>
PR middle-end/93555
* omp-simd-clone.c (expand_simd_clones): If simd_clone_mangle or
simd_clone_create failed when i == 0, adjust clone->nargs by
clone->inbranch.
* c-c++-common/gomp/pr93555-1.c: New test.
* c-c++-common/gomp/pr93555-2.c: New test.
* gfortran.dg/gomp/pr93555.f90: New test.
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/omp-simd-clone.c | 12 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 9 | ||||
-rw-r--r-- | gcc/testsuite/c-c++-common/gomp/pr93555-1.c | 18 | ||||
-rw-r--r-- | gcc/testsuite/c-c++-common/gomp/pr93555-2.c | 16 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/gomp/pr93555.f90 | 11 |
6 files changed, 70 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 85083e8..aec156e 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2020-02-05 Jakub Jelinek <jakub@redhat.com> + + PR middle-end/93555 + * omp-simd-clone.c (expand_simd_clones): If simd_clone_mangle or + simd_clone_create failed when i == 0, adjust clone->nargs by + clone->inbranch. + 2020-02-05 Martin Liska <mliska@suse.cz> PR c++/92717 diff --git a/gcc/omp-simd-clone.c b/gcc/omp-simd-clone.c index 8e6cee1..71ff034 100644 --- a/gcc/omp-simd-clone.c +++ b/gcc/omp-simd-clone.c @@ -1713,14 +1713,22 @@ expand_simd_clones (struct cgraph_node *node) already. */ tree id = simd_clone_mangle (node, clone); if (id == NULL_TREE) - continue; + { + if (i == 0) + clone->nargs += clone->inbranch; + continue; + } /* Only when we are sure we want to create the clone actually clone the function (or definitions) or create another extern FUNCTION_DECL (for prototypes without definitions). */ struct cgraph_node *n = simd_clone_create (node); if (n == NULL) - continue; + { + if (i == 0) + clone->nargs += clone->inbranch; + continue; + } n->simdclone = clone; clone->origin = node; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 3b2be71..584b111c 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,4 +1,11 @@ -2020-02-05 Jun Ma <JunMa@linux.alibaba.com> +2020-02-05 Jakub Jelinek <jakub@redhat.com> + + PR middle-end/93555 + * c-c++-common/gomp/pr93555-1.c: New test. + * c-c++-common/gomp/pr93555-2.c: New test. + * gfortran.dg/gomp/pr93555.f90: New test. + +2020-02-05 Jun Ma <JunMa@linux.alibaba.com> * g++.dg/coroutines/co-await-14-return-ref-to-auto.C: New test. diff --git a/gcc/testsuite/c-c++-common/gomp/pr93555-1.c b/gcc/testsuite/c-c++-common/gomp/pr93555-1.c new file mode 100644 index 0000000..2eb76a2 --- /dev/null +++ b/gcc/testsuite/c-c++-common/gomp/pr93555-1.c @@ -0,0 +1,18 @@ +/* PR middle-end/93555 */ +/* { dg-do compile } */ + +#pragma omp declare simd +#pragma omp declare simd inbranch +int +foo (int x) +{ + return x; +} + +#pragma omp declare simd inbranch +#pragma omp declare simd +int +bar (int x) +{ + return x; +} diff --git a/gcc/testsuite/c-c++-common/gomp/pr93555-2.c b/gcc/testsuite/c-c++-common/gomp/pr93555-2.c new file mode 100644 index 0000000..091f5bd --- /dev/null +++ b/gcc/testsuite/c-c++-common/gomp/pr93555-2.c @@ -0,0 +1,16 @@ +/* PR middle-end/93555 */ +/* { dg-do compile } */ + +#pragma omp declare simd +#pragma omp declare simd inbranch +void +foo (void) +{ +} + +#pragma omp declare simd inbranch +#pragma omp declare simd +void +bar (void) +{ +} diff --git a/gcc/testsuite/gfortran.dg/gomp/pr93555.f90 b/gcc/testsuite/gfortran.dg/gomp/pr93555.f90 new file mode 100644 index 0000000..4a97fee --- /dev/null +++ b/gcc/testsuite/gfortran.dg/gomp/pr93555.f90 @@ -0,0 +1,11 @@ +! PR middle-end/93555 +! { dg-do compile } + +subroutine foo + !$omp declare simd(foo) + !$omp declare simd(foo) inbranch +end +subroutine bar + !$omp declare simd(bar) inbranch + !$omp declare simd(bar) +end |