On July 2, 2021 7:12:15 PM GMT+02:00, "H.J. Lu" <hjl.to...@gmail.com> wrote:
>Since vec_duplicate only works on scalar, don't use it on vector in
>store constructor expansion.

OK. 

Richard. 

>gcc/
>
>       PR middle-end/101294
>       * expr.c (store_constructor): Don't use vec_duplicate on vector.
>
>gcc/testsuite/
>
>       PR middle-end/101294
>       * gcc.dg/pr101294.c: New test.
>---
> gcc/expr.c                      |  3 ++-
> gcc/testsuite/gcc.dg/pr101294.c | 15 +++++++++++++++
> 2 files changed, 17 insertions(+), 1 deletion(-)
> create mode 100644 gcc/testsuite/gcc.dg/pr101294.c
>
>diff --git a/gcc/expr.c b/gcc/expr.c
>index 025033c9ecf..bd85bbfdd6f 100644
>--- a/gcc/expr.c
>+++ b/gcc/expr.c
>@@ -7078,7 +7078,8 @@ store_constructor (tree exp, rtx target, int
>cleared, poly_int64 size,
>           && eltmode == GET_MODE_INNER (mode)
>           && ((icode = optab_handler (vec_duplicate_optab, mode))
>               != CODE_FOR_nothing)
>-          && (elt = uniform_vector_p (exp)))
>+          && (elt = uniform_vector_p (exp))
>+          && !VECTOR_TYPE_P (TREE_TYPE (elt)))
>         {
>           class expand_operand ops[2];
>           create_output_operand (&ops[0], target, mode);
>diff --git a/gcc/testsuite/gcc.dg/pr101294.c
>b/gcc/testsuite/gcc.dg/pr101294.c
>new file mode 100644
>index 00000000000..ca59b35f4be
>--- /dev/null
>+++ b/gcc/testsuite/gcc.dg/pr101294.c
>@@ -0,0 +1,15 @@
>+/* PR middle-end/101294 */
>+/* { dg-do compile } */
>+/* { dg-options "-O0" } */
>+/* { dg-additional-options "-mavx" { target avx } } */
>+
>+typedef __attribute__((__vector_size__ (sizeof (unsigned long long))))
>unsigned long long U;
>+typedef __attribute__((__vector_size__ (4 * sizeof (unsigned long
>long)))) unsigned long long V;
>+
>+extern U x;
>+
>+void
>+foo (void)
>+{
>+  x = __builtin_shufflevector ((U){}, (V){}, 3);
>+}

Reply via email to