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(); }