Patchwork Fix up vector CONSTRUCTOR verification ICE (PR tree-optimization/54889)

login
register
mail settings
Submitter Jakub Jelinek
Date Oct. 15, 2012, 3:02 p.m.
Message ID <20121015150242.GB584@tucnak.redhat.com>
Download mbox | patch
Permalink /patch/191817/
State New
Headers show

Comments

Jakub Jelinek - Oct. 15, 2012, 3:02 p.m.
On Mon, Oct 15, 2012 at 10:38:02AM +0200, Richard Biener wrote:
> On Fri, Oct 12, 2012 at 8:16 PM, Jakub Jelinek <jakub@redhat.com> wrote:
> > Apparently vectorizable_load is another spot that could create vector
> > CONSTRUCTORs that wouldn't pass the new CONSTRUCTOR verification.
> >
> > Fixed thusly, bootstrapped/regtested on x86_64-linux and i686-linux,
> > ok for trunk?
> 
> You should only need this on the ARRAY_REF path (I wonder what are
> the types that have a mismatch?), for MEM_REF simply use
> build2 (MEM_REF, TREE_TYPE (vectype), ...).
> 
> Ok with that change.

Thanks, here is what I'll commit later today, bootstrapped/regtested on
x86_64-linux and i686-linux:

2012-10-15  Jakub Jelinek  <jakub@redhat.com>

	PR tree-optimization/54889
	* tree-vect-stmts.c (vectorizable_load): Add VIEW_CONVERT_EXPR if
	ARRAY_REF newref doesn't have compatible type with vectype element
	type, use vectype element type for MEM_REF.

	* gfortran.dg/pr54889.f90: New test.


	Jakub

Patch

--- gcc/tree-vect-stmts.c.jj	2012-10-12 20:18:47.568041703 +0200
+++ gcc/tree-vect-stmts.c	2012-10-15 11:47:57.874019752 +0200
@@ -4743,12 +4743,18 @@  vectorizable_load (gimple stmt, gimple_s
 	      tree newref, newoff;
 	      gimple incr;
 	      if (TREE_CODE (ref) == ARRAY_REF)
-		newref = build4 (ARRAY_REF, TREE_TYPE (ref),
-				 unshare_expr (TREE_OPERAND (ref, 0)),
-				 running_off,
-				 NULL_TREE, NULL_TREE);
+		{
+		  newref = build4 (ARRAY_REF, TREE_TYPE (ref),
+				   unshare_expr (TREE_OPERAND (ref, 0)),
+				   running_off,
+				   NULL_TREE, NULL_TREE);
+		  if (!useless_type_conversion_p (TREE_TYPE (vectype),
+						  TREE_TYPE (newref)))
+		    newref = build1 (VIEW_CONVERT_EXPR, TREE_TYPE (vectype),
+				     newref);
+		}
 	      else
-		newref = build2 (MEM_REF, TREE_TYPE (ref),
+		newref = build2 (MEM_REF, TREE_TYPE (vectype),
 				 running_off,
 				 TREE_OPERAND (ref, 1));
 
--- gcc/testsuite/gfortran.dg/pr54889.f90.jj	2012-10-15 11:46:13.252593971 +0200
+++ gcc/testsuite/gfortran.dg/pr54889.f90	2012-10-15 11:46:13.252593971 +0200
@@ -0,0 +1,10 @@ 
+! PR tree-optimization/54889
+! { dg-do compile }
+! { dg-options "-O3" }
+! { dg-additional-options "-mavx" { target { i?86-*-* x86_64-*-* } } }
+
+subroutine foo(x,y,z)
+  logical, pointer :: x(:,:)
+  integer :: y, z
+  x=x(1:y,1:z)
+end subroutine