The following fixes a vectorizer ICE in 187.facerec with -Ofast -mavx. It occurs because we wreck hybrid SLP vectorization by setting STMT_VINFO_VEC_STMT from the SLP vectorization side.
Fixed as follows. Bootstrapped and tested on x86_64-unknown-linux-gnu. Richard. 2015-06-25 Richard Biener <rguent...@suse.de> * tree-vect-slp.c (vect_detect_hybrid_slp_stmts): Improve debug dumping. (vect_create_mask_and_perm): Do not set STMT_VINFO_VEC_STMT and cleanup resulting dead code and parameters. (vect_transform_slp_perm_load): Adjust. * gfortran.dg/vect/vect-9.f90: New testcase. Index: gcc/tree-vect-slp.c =================================================================== *** gcc/tree-vect-slp.c (revision 224893) --- gcc/tree-vect-slp.c (working copy) *************** vect_detect_hybrid_slp_stmts (slp_tree n *** 1998,2008 **** || VECTORIZABLE_CYCLE_DEF (STMT_VINFO_DEF_TYPE (use_vinfo))) && !(gimple_code (use_stmt) == GIMPLE_PHI && STMT_VINFO_DEF_TYPE (use_vinfo) == vect_reduction_def)) ! stype = hybrid; } } ! if (stype == hybrid) { if (dump_enabled_p ()) { --- 1968,1987 ---- || VECTORIZABLE_CYCLE_DEF (STMT_VINFO_DEF_TYPE (use_vinfo))) && !(gimple_code (use_stmt) == GIMPLE_PHI && STMT_VINFO_DEF_TYPE (use_vinfo) == vect_reduction_def)) ! { ! if (dump_enabled_p ()) ! { ! dump_printf_loc (MSG_NOTE, vect_location, "use of SLP " ! "def in non-SLP stmt: "); ! dump_gimple_stmt (MSG_NOTE, TDF_SLIM, use_stmt, 0); ! } ! stype = hybrid; ! } } } ! if (stype == hybrid ! && !HYBRID_SLP_STMT (stmt_vinfo)) { if (dump_enabled_p ()) { *************** vect_get_slp_defs (vec<tree> ops, slp_tr *** 3005,3011 **** the created stmts must be inserted. */ static inline void ! vect_create_mask_and_perm (gimple stmt, gimple next_scalar_stmt, tree mask, int first_vec_indx, int second_vec_indx, gimple_stmt_iterator *gsi, slp_tree node, tree vectype, vec<tree> dr_chain, --- 2984,2990 ---- the created stmts must be inserted. */ static inline void ! vect_create_mask_and_perm (gimple stmt, tree mask, int first_vec_indx, int second_vec_indx, gimple_stmt_iterator *gsi, slp_tree node, tree vectype, vec<tree> dr_chain, *************** vect_create_mask_and_perm (gimple stmt, *** 3013,3019 **** { tree perm_dest; gimple perm_stmt = NULL; - stmt_vec_info next_stmt_info; int i, stride; tree first_vec, second_vec, data_ref; --- 2992,2997 ---- *************** vect_create_mask_and_perm (gimple stmt, *** 3044,3053 **** first_vec_indx += stride; second_vec_indx += stride; } - - /* Mark the scalar stmt as vectorized. */ - next_stmt_info = vinfo_for_stmt (next_scalar_stmt); - STMT_VINFO_VEC_STMT (next_stmt_info) = perm_stmt; } --- 3022,3027 ---- *************** vect_transform_slp_perm_load (slp_tree n *** 3160,3168 **** gimple stmt = SLP_TREE_SCALAR_STMTS (node)[0]; stmt_vec_info stmt_info = vinfo_for_stmt (stmt); tree mask_element_type = NULL_TREE, mask_type; ! int i, j, k, nunits, vec_index = 0, scalar_index; tree vectype = STMT_VINFO_VECTYPE (stmt_info); - gimple next_scalar_stmt; int group_size = SLP_INSTANCE_GROUP_SIZE (slp_node_instance); int first_mask_element; int index, unroll_factor, current_mask_element, ncopies; --- 3134,3141 ---- gimple stmt = SLP_TREE_SCALAR_STMTS (node)[0]; stmt_vec_info stmt_info = vinfo_for_stmt (stmt); tree mask_element_type = NULL_TREE, mask_type; ! int i, j, k, nunits, vec_index = 0; tree vectype = STMT_VINFO_VECTYPE (stmt_info); int group_size = SLP_INSTANCE_GROUP_SIZE (slp_node_instance); int first_mask_element; int index, unroll_factor, current_mask_element, ncopies; *************** vect_transform_slp_perm_load (slp_tree n *** 3234,3240 **** {c2,a3,b3,c3}. */ { - scalar_index = 0; index = 0; vect_stmts_counter = 0; vec_index = 0; --- 3207,3212 ---- *************** vect_transform_slp_perm_load (slp_tree n *** 3295,3304 **** second_vec_index = vec_index; } ! next_scalar_stmt ! = SLP_TREE_SCALAR_STMTS (node)[scalar_index++]; ! ! vect_create_mask_and_perm (stmt, next_scalar_stmt, mask_vec, first_vec_index, second_vec_index, gsi, node, vectype, dr_chain, ncopies, vect_stmts_counter++); --- 3267,3273 ---- second_vec_index = vec_index; } ! vect_create_mask_and_perm (stmt, mask_vec, first_vec_index, second_vec_index, gsi, node, vectype, dr_chain, ncopies, vect_stmts_counter++); Index: gcc/testsuite/gfortran.dg/vect/vect-9.f90 =================================================================== *** gcc/testsuite/gfortran.dg/vect/vect-9.f90 (revision 0) --- gcc/testsuite/gfortran.dg/vect/vect-9.f90 (working copy) *************** *** 0 **** --- 1,34 ---- + ! { dg-do compile } + ! { dg-additional-options "-Ofast" } + ! { dg-additional-options "-mavx" { target x86_64-*-* i?86-*-* } } + + SUBROUTINE PASSB4 (IDO,L1,CC,CH,WA1,WA2,WA3) + IMPLICIT REAL(4) (A-H, O-Z) + DIMENSION CC(IDO,4,L1) ,CH(IDO,L1,4) ,& + WA1(*) ,WA2(*) ,WA3(*) + 102 DO 104 K=1,L1 + DO 103 I=2,IDO,2 + TI1 = CC(I,1,K)-CC(I,3,K) + TI2 = CC(I,1,K)+CC(I,3,K) + TI3 = CC(I,2,K)+CC(I,4,K) + TR4 = CC(I,4,K)-CC(I,2,K) + TR1 = CC(I-1,1,K)-CC(I-1,3,K) + TR2 = CC(I-1,1,K)+CC(I-1,3,K) + TI4 = CC(I-1,2,K)-CC(I-1,4,K) + TR3 = CC(I-1,2,K)+CC(I-1,4,K) + CH(I-1,K,1) = TR2+TR3 + CR3 = TR2-TR3 + CH(I,K,1) = TI2+TI3 + CI3 = TI2-TI3 + CR2 = TR1+TR4 + CI4 = TI1-TI4 + CH(I-1,K,2) = TI1 + CH(I,K,2) = CR2 + CH(I-1,K,3) = WA2(I-1)*CR3-WA2(I)*CI3 + CH(I,K,3) = WA2(I-1)*CI3+WA2(I)*CR3 + CH(I-1,K,4) = CI4 + CH(I,K,4) = CI4 + 103 CONTINUE + 104 CONTINUE + RETURN + END