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

Reply via email to