aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2020-02-05 11:32:37 +0100
committerJakub Jelinek <jakub@redhat.com>2020-02-05 11:32:37 +0100
commitb843bcb89519293404bb00d2ed09aae529b54d7f (patch)
treebcc9c051915ffe04939c1c31d9460d9bcf97d08f /gcc
parent27736735f6fcba464b90c3a9dff13b7e5c8bdc6e (diff)
downloadgcc-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/ChangeLog7
-rw-r--r--gcc/omp-simd-clone.c12
-rw-r--r--gcc/testsuite/ChangeLog9
-rw-r--r--gcc/testsuite/c-c++-common/gomp/pr93555-1.c18
-rw-r--r--gcc/testsuite/c-c++-common/gomp/pr93555-2.c16
-rw-r--r--gcc/testsuite/gfortran.dg/gomp/pr93555.f9011
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