aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2019-02-09 09:55:39 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2019-02-09 09:55:39 +0100
commitde3ed9259f3b3cda69d44332b194c1c29666c719 (patch)
tree4a141d2e5c9110ed370ee53844c75df4c88df255
parent4fe5c8c730ead2286103b95a4226f9d23b95a68a (diff)
downloadgcc-de3ed9259f3b3cda69d44332b194c1c29666c719.zip
gcc-de3ed9259f3b3cda69d44332b194c1c29666c719.tar.gz
gcc-de3ed9259f3b3cda69d44332b194c1c29666c719.tar.bz2
re PR middle-end/89246 (LTO produces references to cloned symbols which the compiler failed to clone)
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: r268718
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/config/i386/i386.c48
-rw-r--r--gcc/testsuite/ChangeLog6
-rw-r--r--gcc/testsuite/gcc.dg/gomp/pr89246-1.c19
-rw-r--r--gcc/testsuite/gcc.dg/gomp/pr89246-2.c13
5 files changed, 72 insertions, 21 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 0079a69..c6a97e1 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+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-02-09 Alan Modra <amodra@gmail.com>
PR target/88343
diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
index 579a3ee..12bc792 100644
--- a/gcc/config/i386/i386.c
+++ b/gcc/config/i386/i386.c
@@ -50447,28 +50447,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 E_QImode:
- case E_HImode:
- case E_SImode:
- case E_DImode:
- case E_SFmode:
- case E_DFmode:
- /* case E_SCmode: */
- /* case E_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", 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 E_QImode:
+ case E_HImode:
+ case E_SImode:
+ case E_DImode:
+ case E_SFmode:
+ case E_DFmode:
+ /* case E_SCmode: */
+ /* case E_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", arg_type);
+ return 0;
+ }
+ }
if (!TREE_PUBLIC (node->decl))
{
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 814a861..dd887d3 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,9 @@
+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.
+
2019-02-08 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/88739
diff --git a/gcc/testsuite/gcc.dg/gomp/pr89246-1.c b/gcc/testsuite/gcc.dg/gomp/pr89246-1.c
new file mode 100644
index 0000000..dfe629c
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/pr89246-1.c
@@ -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
index 0000000..ccdcaf5
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/pr89246-2.c
@@ -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);
+}