]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
backport: re PR middle-end/89246 (LTO produces references to cloned symbols which...
authorJakub Jelinek <jakub@redhat.com>
Fri, 30 Aug 2019 11:50:04 +0000 (13:50 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Fri, 30 Aug 2019 11:50:04 +0000 (13:50 +0200)
Backported from mainline
2019-02-09  Jakub Jelinek  <jakub@redhat.com>

PR middle-end/89246
* config/i386/i386.c (ix86_simd_clone_compute_vecsize_and_simdlen):
If !node->definition and TYPE_ARG_TYPES is non-NULL, use
TYPE_ARG_TYPES instead of DECL_ARGUMENTS.

* gcc.dg/gomp/pr89246-1.c: New test.
* gcc.dg/gomp/pr89246-2.c: New test.

From-SVN: r275107

gcc/ChangeLog
gcc/config/i386/i386.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/gomp/pr89246-1.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/gomp/pr89246-2.c [new file with mode: 0644]

index 99e38ac01621cf7c7ae314915e3fc296825f9030..4bfe52f5237703c2ad5a1024e4da1c493a194c6f 100644 (file)
@@ -1,6 +1,13 @@
 2019-08-30  Jakub Jelinek  <jakub@redhat.com>
 
        Backported from mainline
+       2019-02-09  Jakub Jelinek  <jakub@redhat.com>
+
+       PR middle-end/89246
+       * config/i386/i386.c (ix86_simd_clone_compute_vecsize_and_simdlen):
+       If !node->definition and TYPE_ARG_TYPES is non-NULL, use
+       TYPE_ARG_TYPES instead of DECL_ARGUMENTS.
+
        2019-01-16  David Malcolm  <dmalcolm@redhat.com>
 
        PR target/88861
index a46c0e987ab11bf76065b320c12041d01e9e6ca2..fc12b5588c8b389c48ca3930519130e0caed0436 100644 (file)
@@ -51754,28 +51754,34 @@ ix86_simd_clone_compute_vecsize_and_simdlen (struct cgraph_node *node,
 
   tree t;
   int i;
+  tree type_arg_types = TYPE_ARG_TYPES (TREE_TYPE (node->decl));
+  bool decl_arg_p = (node->definition || type_arg_types == NULL_TREE);
 
-  for (t = DECL_ARGUMENTS (node->decl), i = 0; t; t = DECL_CHAIN (t), i++)
-    switch (TYPE_MODE (TREE_TYPE (t)))
-      {
-      case QImode:
-      case HImode:
-      case SImode:
-      case DImode:
-      case SFmode:
-      case DFmode:
-      /* case SCmode: */
-      /* case DCmode: */
-       if (!AGGREGATE_TYPE_P (TREE_TYPE (t)))
-         break;
-       /* FALLTHRU */
-      default:
-       if (clonei->args[i].arg_type == SIMD_CLONE_ARG_TYPE_UNIFORM)
-         break;
-       warning_at (DECL_SOURCE_LOCATION (node->decl), 0,
-                   "unsupported argument type %qT for simd\n", TREE_TYPE (t));
-       return 0;
-      }
+  for (t = (decl_arg_p ? DECL_ARGUMENTS (node->decl) : type_arg_types), i = 0;
+       t && t != void_list_node; t = TREE_CHAIN (t), i++)
+    {
+      tree arg_type = decl_arg_p ? TREE_TYPE (t) : TREE_VALUE (t);
+      switch (TYPE_MODE (arg_type))
+       {
+       case QImode:
+       case HImode:
+       case SImode:
+       case DImode:
+       case SFmode:
+       case DFmode:
+       /* case SCmode: */
+       /* case DCmode: */
+         if (!AGGREGATE_TYPE_P (arg_type))
+           break;
+         /* FALLTHRU */
+       default:
+         if (clonei->args[i].arg_type == SIMD_CLONE_ARG_TYPE_UNIFORM)
+           break;
+         warning_at (DECL_SOURCE_LOCATION (node->decl), 0,
+                     "unsupported argument type %qT for simd\n", arg_type);
+         return 0;
+       }
+    }
 
   if (clonei->cilk_elemental)
     {
index ac912ab819b50154184ac4cc6a9622202b33cc15..f43dc1a7ed7406669b8c62d9e657bde0c38b99e8 100644 (file)
@@ -3,6 +3,10 @@
        Backported from mainline
        2019-02-09  Jakub Jelinek  <jakub@redhat.com>
 
+       PR middle-end/89246
+       * gcc.dg/gomp/pr89246-1.c: New test.
+       * gcc.dg/gomp/pr89246-2.c: New test.
+
        PR target/88861
        * g++.dg/opt/pr89188.C: Include ../torture/pr88861.C.
 
diff --git a/gcc/testsuite/gcc.dg/gomp/pr89246-1.c b/gcc/testsuite/gcc.dg/gomp/pr89246-1.c
new file mode 100644 (file)
index 0000000..dfe629c
--- /dev/null
@@ -0,0 +1,19 @@
+/* PR middle-end/89246 */
+/* { dg-do link { target { int128 && vect_simd_clones } } } */
+/* { dg-options "-O2 -fopenmp-simd -w" } */
+/* { dg-additional-sources "pr89246-2.c" } */
+
+#pragma omp declare simd
+int foo (__int128 x)
+{
+  return x;
+}
+
+#pragma omp declare simd
+extern int bar (int x);
+
+int
+main ()
+{
+  return foo (0) + bar (0);
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/pr89246-2.c b/gcc/testsuite/gcc.dg/gomp/pr89246-2.c
new file mode 100644 (file)
index 0000000..ccdcaf5
--- /dev/null
@@ -0,0 +1,13 @@
+/* PR middle-end/89246 */
+/* { dg-do compile { target int128 } } */
+/* { dg-options "-O0 -fno-openmp -fno-openmp-simd" } */
+
+#pragma omp declare simd
+extern int foo (__int128 x);
+
+#pragma omp declare simd
+int
+bar (int x)
+{
+  return x + foo (0);
+}