diff mbox series

Add missing VECTOR_MODE_P checks (PR 92595)

Message ID mptpnhlfn4b.fsf@arm.com
State New
Headers show
Series Add missing VECTOR_MODE_P checks (PR 92595) | expand

Commit Message

Richard Sandiford Nov. 21, 2019, 12:08 p.m. UTC
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.sandiford@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.

Comments

Richard Biener Nov. 21, 2019, 2:02 p.m. UTC | #1
On Thu, Nov 21, 2019 at 1:08 PM Richard Sandiford
<richard.sandiford@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.sandiford@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(); }
diff mbox series

Patch

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