On Mon, Oct 15, 2012 at 10:38:02AM +0200, Richard Biener wrote: > On Fri, Oct 12, 2012 at 8:16 PM, Jakub Jelinek <ja...@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 <ja...@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. --- 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 Jakub