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