diff mbox series

tree-ssa: Fix ICE in build_vector_type [PR93780]

Message ID 20200217232237.GO2155@tucnak
State New
Headers show
Series tree-ssa: Fix ICE in build_vector_type [PR93780] | expand

Commit Message

Jakub Jelinek Feb. 17, 2020, 11:22 p.m. UTC
Hi!

The following testcase ICEs, because execute_update_addresses_taken attempts
to create a VECTOR_TYPE with non-power of 2 number of elts.
Fixed by guarding it with the corresponding predicate.

Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?

2020-02-17  Jakub Jelinek  <jakub@redhat.com>

	PR tree-optimization/93780
	* tree-ssa.c (non_rewritable_lvalue_p): Check valid_vector_subparts_p
	before calling build_vector_type.
	(execute_update_addresses_taken): Likewise.

	* gcc.dg/pr93780.c: New test.


	Jakub

Comments

Richard Biener Feb. 18, 2020, 8:05 a.m. UTC | #1
On Tue, 18 Feb 2020, Jakub Jelinek wrote:

> Hi!
> 
> The following testcase ICEs, because execute_update_addresses_taken attempts
> to create a VECTOR_TYPE with non-power of 2 number of elts.
> Fixed by guarding it with the corresponding predicate.
> 
> Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?

OK.

Richard.

> 2020-02-17  Jakub Jelinek  <jakub@redhat.com>
> 
> 	PR tree-optimization/93780
> 	* tree-ssa.c (non_rewritable_lvalue_p): Check valid_vector_subparts_p
> 	before calling build_vector_type.
> 	(execute_update_addresses_taken): Likewise.
> 
> 	* gcc.dg/pr93780.c: New test.
> 
> --- gcc/tree-ssa.c.jj	2020-01-12 11:54:38.515381696 +0100
> +++ gcc/tree-ssa.c	2020-02-17 10:54:32.481615050 +0100
> @@ -1550,7 +1550,8 @@ non_rewritable_lvalue_p (tree lhs)
>  	      && multiple_p (lhs_bits,
>  			     tree_to_uhwi
>  			       (TYPE_SIZE (TREE_TYPE (TREE_TYPE (decl)))),
> -			     &nelts))
> +			     &nelts)
> +	      && valid_vector_subparts_p (nelts))
>  	    {
>  	      if (known_eq (nelts, 1u))
>  		return false;
> @@ -1925,7 +1926,8 @@ execute_update_addresses_taken (void)
>  					     (TYPE_SIZE (TREE_TYPE
>  							   (TREE_TYPE (sym)))),
>  					   &nelts)
> -			    && maybe_ne (nelts, 1u))
> +			    && maybe_ne (nelts, 1u)
> +			    && valid_vector_subparts_p (nelts))
>  			  temtype = build_vector_type (temtype, nelts);
>  			tree tem = make_ssa_name (temtype);
>  			gimple *pun
> --- gcc/testsuite/gcc.dg/pr93780.c.jj	2020-02-17 10:44:31.839583128 +0100
> +++ gcc/testsuite/gcc.dg/pr93780.c	2020-02-17 10:44:16.453812697 +0100
> @@ -0,0 +1,15 @@
> +/* PR tree-optimization/93780 */
> +/* { dg-do compile } */
> +/* { dg-options "-O2" } */
> +/* { dg-additional-options "-mavx" { target avx } } */
> +
> +typedef float V __attribute__((vector_size (32)));
> +
> +float
> +foo (void)
> +{
> +  const float init[6] = {};
> +  V v = {};
> +  __builtin_memcpy (&v, init, sizeof (init));
> +  return v[0];
> +}
> 
> 	Jakub
> 
>
diff mbox series

Patch

--- gcc/tree-ssa.c.jj	2020-01-12 11:54:38.515381696 +0100
+++ gcc/tree-ssa.c	2020-02-17 10:54:32.481615050 +0100
@@ -1550,7 +1550,8 @@  non_rewritable_lvalue_p (tree lhs)
 	      && multiple_p (lhs_bits,
 			     tree_to_uhwi
 			       (TYPE_SIZE (TREE_TYPE (TREE_TYPE (decl)))),
-			     &nelts))
+			     &nelts)
+	      && valid_vector_subparts_p (nelts))
 	    {
 	      if (known_eq (nelts, 1u))
 		return false;
@@ -1925,7 +1926,8 @@  execute_update_addresses_taken (void)
 					     (TYPE_SIZE (TREE_TYPE
 							   (TREE_TYPE (sym)))),
 					   &nelts)
-			    && maybe_ne (nelts, 1u))
+			    && maybe_ne (nelts, 1u)
+			    && valid_vector_subparts_p (nelts))
 			  temtype = build_vector_type (temtype, nelts);
 			tree tem = make_ssa_name (temtype);
 			gimple *pun
--- gcc/testsuite/gcc.dg/pr93780.c.jj	2020-02-17 10:44:31.839583128 +0100
+++ gcc/testsuite/gcc.dg/pr93780.c	2020-02-17 10:44:16.453812697 +0100
@@ -0,0 +1,15 @@ 
+/* PR tree-optimization/93780 */
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+/* { dg-additional-options "-mavx" { target avx } } */
+
+typedef float V __attribute__((vector_size (32)));
+
+float
+foo (void)
+{
+  const float init[6] = {};
+  V v = {};
+  __builtin_memcpy (&v, init, sizeof (init));
+  return v[0];
+}