On Thu, Nov 21, 2019 at 1:08 PM Richard Sandiford
<richard.sandif...@arm.com> wrote:
>
> This patch fixes some cases in which we weren't checking whether we had
> a vector mode before calling related_vector_mode or before making vector
> optab queries.
>
> Tested on aarch64-linux-gnu and x86_64-linux-gnu.  OK to install?

OK.

> Richard
>
>
> 2019-11-21  Richard Sandiford  <richard.sandif...@arm.com>
>
> gcc/
>         PR tree-optimization/92595
>         * tree-vect-stmts.c (get_group_load_store_type): Add a VECTOR_MODE_P
>         check.
>         (vectorizable_store, vectorizable_load): Likewise.
>
> gcc/testsuite/
>         PR tree-optimization/92595
>         * g++.dg/vect/pr92595.cc: New test.
>
> Index: gcc/tree-vect-stmts.c
> ===================================================================
> --- gcc/tree-vect-stmts.c       2019-11-21 12:02:44.058240392 +0000
> +++ gcc/tree-vect-stmts.c       2019-11-21 12:03:00.986124573 +0000
> @@ -2309,6 +2309,7 @@ get_group_load_store_type (stmt_vec_info
>                   || alignment_support_scheme == dr_unaligned_supported)
>               && known_eq (nunits, (group_size - gap) * 2)
>               && known_eq (nunits, group_size)
> +             && VECTOR_MODE_P (TYPE_MODE (vectype))
>               && related_vector_mode (TYPE_MODE (vectype), elmode,
>                                       group_size - gap).exists (&vmode)
>               && (convert_optab_handler (vec_init_optab,
> @@ -7823,8 +7824,9 @@ vectorizable_store (stmt_vec_info stmt_i
>                  of vector elts directly.  */
>               scalar_mode elmode = SCALAR_TYPE_MODE (elem_type);
>               machine_mode vmode;
> -             if (!related_vector_mode (TYPE_MODE (vectype), elmode,
> -                                       group_size).exists (&vmode)
> +             if (!VECTOR_MODE_P (TYPE_MODE (vectype))
> +                 || !related_vector_mode (TYPE_MODE (vectype), elmode,
> +                                          group_size).exists (&vmode)
>                   || (convert_optab_handler (vec_extract_optab,
>                                              TYPE_MODE (vectype), vmode)
>                       == CODE_FOR_nothing))
> @@ -7841,6 +7843,7 @@ vectorizable_store (stmt_vec_info stmt_i
>                      element extracts from the original vector type and
>                      element size stores.  */
>                   if (int_mode_for_size (lsize, 0).exists (&elmode)
> +                     && VECTOR_MODE_P (TYPE_MODE (vectype))
>                       && related_vector_mode (TYPE_MODE (vectype), elmode,
>                                               lnunits).exists (&vmode)
>                       && (convert_optab_handler (vec_extract_optab,
> @@ -8923,8 +8926,9 @@ vectorizable_load (stmt_vec_info stmt_in
>                  vector elts directly.  */
>               scalar_mode elmode = SCALAR_TYPE_MODE (TREE_TYPE (vectype));
>               machine_mode vmode;
> -             if (related_vector_mode (TYPE_MODE (vectype), elmode,
> -                                      group_size).exists (&vmode)
> +             if (VECTOR_MODE_P (TYPE_MODE (vectype))
> +                 && related_vector_mode (TYPE_MODE (vectype), elmode,
> +                                         group_size).exists (&vmode)
>                   && (convert_optab_handler (vec_init_optab,
>                                              TYPE_MODE (vectype), vmode)
>                       != CODE_FOR_nothing))
> @@ -8948,6 +8952,7 @@ vectorizable_load (stmt_vec_info stmt_in
>                   /* If we can't construct such a vector fall back to
>                      element loads of the original vector type.  */
>                   if (int_mode_for_size (lsize, 0).exists (&elmode)
> +                     && VECTOR_MODE_P (TYPE_MODE (vectype))
>                       && related_vector_mode (TYPE_MODE (vectype), elmode,
>                                               lnunits).exists (&vmode)
>                       && (convert_optab_handler (vec_init_optab, vmode, 
> elmode)
> Index: gcc/testsuite/g++.dg/vect/pr92595.cc
> ===================================================================
> --- /dev/null   2019-09-17 11:41:18.176664108 +0100
> +++ gcc/testsuite/g++.dg/vect/pr92595.cc        2019-11-21 12:03:00.982124598 
> +0000
> @@ -0,0 +1,32 @@
> +// { dg-do compile }
> +// { dg-require-effective-target c++11 }
> +// { dg-additional-options "-O3" }
> +// { dg-additional-options "-O3 -m32 -mno-sse" { target { i?86-*-* 
> x86_64-*-* } } }
> +
> +void *operator new(__SIZE_TYPE__, void *a) { return a; }
> +class b {
> +public:
> +  using c = int *;
> +  c e();
> +  c h();
> +};
> +template <typename d> class j : b {
> +public:
> +  void l() {
> +    for (auto f = h(), g = e(); f != g; ++f)
> +      new (f) d();
> +  }
> +};
> +class m {
> +public:
> +  enum i {};
> +  struct C {
> +    i : 8;
> +    i k : 8;
> +  };
> +};
> +class o {
> +  j<m::C> n;
> +  o();
> +};
> +o::o() { n.l(); }

Reply via email to