diff options
author | Jakub Jelinek <jakub@redhat.com> | 2019-02-09 09:55:39 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2019-02-09 09:55:39 +0100 |
commit | de3ed9259f3b3cda69d44332b194c1c29666c719 (patch) | |
tree | 4a141d2e5c9110ed370ee53844c75df4c88df255 | |
parent | 4fe5c8c730ead2286103b95a4226f9d23b95a68a (diff) | |
download | gcc-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/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/config/i386/i386.c | 48 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/gomp/pr89246-1.c | 19 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/gomp/pr89246-2.c | 13 |
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); +} |