Hi! 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? 2012-10-11 Jakub Jelinek <ja...@redhat.com> PR tree-optimization/54889 * tree-vect-stmts.c (vectorizable_load): Add VIEW_CONVERT_EXPR if newref doesn't have compatible type with vectype element type. * gfortran.dg/pr54889.f90: New test. --- gcc/tree-vect-stmts.c.jj 2012-10-03 09:01:36.000000000 +0200 +++ gcc/tree-vect-stmts.c 2012-10-11 10:38:38.920249396 +0200 @@ -4752,6 +4752,11 @@ vectorizable_load (gimple stmt, gimple_s running_off, TREE_OPERAND (ref, 1)); + if (!useless_type_conversion_p (TREE_TYPE (vectype), + TREE_TYPE (newref))) + newref = build1 (VIEW_CONVERT_EXPR, TREE_TYPE (vectype), + newref); + newref = force_gimple_operand_gsi (gsi, newref, true, NULL_TREE, true, GSI_SAME_STMT); --- gcc/testsuite/gfortran.dg/pr54889.f90.jj 2012-10-11 10:58:11.982284176 +0200 +++ gcc/testsuite/gfortran.dg/pr54889.f90 2012-10-11 10:59:14.283920937 +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