The following makes us create less useless statements (as can be seen from the needed change to recip-vec-sqrtf-avx.c where we now fully unroll one of the loops).
Bootstrapped and tested on x86_64-unknown-linux-gnu, applied. Richard. 2015-06-16 Richard Biener <rguent...@suse.de> * tree-vect-stmts.c (vectorizable_store): Adjust. (vectorizable_load): Likewise. * tree-vect-data-refs.c (vect_create_addr_base_for_vector_ref): Simplify. (vect_create_data_ref_ptr): Likewise. (bump_vector_ptr): Adjust. * gcc.target/i386/recip-vec-sqrtf-avx.c: Disable unrolling. Index: gcc/tree-vect-stmts.c =================================================================== *** gcc/tree-vect-stmts.c (revision 224324) --- gcc/tree-vect-stmts.c (working copy) *************** vectorizable_store (gimple stmt, gimple_ *** 5572,5582 **** vect_permute_store_chain(). */ vec_oprnd = result_chain[i]; ! data_ref = build2 (MEM_REF, TREE_TYPE (vec_oprnd), dataref_ptr, ! dataref_offset ! ? dataref_offset ! : build_int_cst (reference_alias_ptr_type ! (DR_REF (first_dr)), 0)); align = TYPE_ALIGN_UNIT (vectype); if (aligned_access_p (first_dr)) misalign = 0; --- 5572,5583 ---- vect_permute_store_chain(). */ vec_oprnd = result_chain[i]; ! data_ref = fold_build2 (MEM_REF, TREE_TYPE (vec_oprnd), ! dataref_ptr, ! dataref_offset ! ? dataref_offset ! : build_int_cst (reference_alias_ptr_type ! (DR_REF (first_dr)), 0)); align = TYPE_ALIGN_UNIT (vectype); if (aligned_access_p (first_dr)) misalign = 0; *************** vectorizable_store (gimple stmt, gimple_ *** 5595,5601 **** TYPE_ALIGN (elem_type)); misalign = DR_MISALIGNMENT (first_dr); } ! if (dataref_offset == NULL_TREE) set_ptr_info_alignment (get_ptr_info (dataref_ptr), align, misalign); --- 5596,5603 ---- TYPE_ALIGN (elem_type)); misalign = DR_MISALIGNMENT (first_dr); } ! if (dataref_offset == NULL_TREE ! && TREE_CODE (dataref_ptr) == SSA_NAME) set_ptr_info_alignment (get_ptr_info (dataref_ptr), align, misalign); *************** vectorizable_load (gimple stmt, gimple_s *** 6637,6647 **** unsigned int align, misalign; data_ref ! = build2 (MEM_REF, vectype, dataref_ptr, ! dataref_offset ! ? dataref_offset ! : build_int_cst (reference_alias_ptr_type ! (DR_REF (first_dr)), 0)); align = TYPE_ALIGN_UNIT (vectype); if (alignment_support_scheme == dr_aligned) { --- 6645,6655 ---- unsigned int align, misalign; data_ref ! = fold_build2 (MEM_REF, vectype, dataref_ptr, ! dataref_offset ! ? dataref_offset ! : build_int_cst (reference_alias_ptr_type ! (DR_REF (first_dr)), 0)); align = TYPE_ALIGN_UNIT (vectype); if (alignment_support_scheme == dr_aligned) { *************** vectorizable_load (gimple stmt, gimple_s *** 6663,6669 **** TYPE_ALIGN (elem_type)); misalign = DR_MISALIGNMENT (first_dr); } ! if (dataref_offset == NULL_TREE) set_ptr_info_alignment (get_ptr_info (dataref_ptr), align, misalign); break; --- 6671,6678 ---- TYPE_ALIGN (elem_type)); misalign = DR_MISALIGNMENT (first_dr); } ! if (dataref_offset == NULL_TREE ! && TREE_CODE (dataref_ptr) == SSA_NAME) set_ptr_info_alignment (get_ptr_info (dataref_ptr), align, misalign); break; *************** vectorizable_load (gimple stmt, gimple_s *** 6680,6686 **** dr_explicit_realign, dataref_ptr, NULL); ! ptr = copy_ssa_name (dataref_ptr); new_stmt = gimple_build_assign (ptr, BIT_AND_EXPR, dataref_ptr, build_int_cst --- 6689,6698 ---- dr_explicit_realign, dataref_ptr, NULL); ! if (TREE_CODE (dataref_ptr) == SSA_NAME) ! ptr = copy_ssa_name (dataref_ptr); ! else ! ptr = make_ssa_name (TREE_TYPE (dataref_ptr)); new_stmt = gimple_build_assign (ptr, BIT_AND_EXPR, dataref_ptr, build_int_cst *************** vectorizable_load (gimple stmt, gimple_s *** 6710,6716 **** build_int_cst (TREE_TYPE (ptr), -(HOST_WIDE_INT)TYPE_ALIGN_UNIT (vectype))); ! ptr = copy_ssa_name (dataref_ptr, new_stmt); gimple_assign_set_lhs (new_stmt, ptr); vect_finish_stmt_generation (stmt, new_stmt, gsi); data_ref --- 6722,6728 ---- build_int_cst (TREE_TYPE (ptr), -(HOST_WIDE_INT)TYPE_ALIGN_UNIT (vectype))); ! ptr = copy_ssa_name (ptr, new_stmt); gimple_assign_set_lhs (new_stmt, ptr); vect_finish_stmt_generation (stmt, new_stmt, gsi); data_ref *************** vectorizable_load (gimple stmt, gimple_s *** 6720,6726 **** break; } case dr_explicit_realign_optimized: ! new_temp = copy_ssa_name (dataref_ptr); new_stmt = gimple_build_assign (new_temp, BIT_AND_EXPR, dataref_ptr, build_int_cst --- 6732,6741 ---- break; } case dr_explicit_realign_optimized: ! if (TREE_CODE (dataref_ptr) == SSA_NAME) ! new_temp = copy_ssa_name (dataref_ptr); ! else ! new_temp = make_ssa_name (TREE_TYPE (dataref_ptr)); new_stmt = gimple_build_assign (new_temp, BIT_AND_EXPR, dataref_ptr, build_int_cst Index: gcc/tree-vect-data-refs.c =================================================================== *** gcc/tree-vect-data-refs.c (revision 224324) --- gcc/tree-vect-data-refs.c (working copy) *************** vect_create_addr_base_for_vector_ref (gi *** 3956,3968 **** } vect_ptr_type = build_pointer_type (STMT_VINFO_VECTYPE (stmt_info)); - addr_base = fold_convert (vect_ptr_type, addr_base); dest = vect_get_new_vect_var (vect_ptr_type, vect_pointer_var, base_name); ! addr_base = force_gimple_operand (addr_base, &seq, false, dest); gimple_seq_add_seq (new_stmt_list, seq); if (DR_PTR_INFO (dr) ! && TREE_CODE (addr_base) == SSA_NAME) { vect_duplicate_ssa_name_ptr_info (addr_base, dr, stmt_info); if (offset || byte_offset) --- 3956,3968 ---- } vect_ptr_type = build_pointer_type (STMT_VINFO_VECTYPE (stmt_info)); dest = vect_get_new_vect_var (vect_ptr_type, vect_pointer_var, base_name); ! addr_base = force_gimple_operand (addr_base, &seq, true, dest); gimple_seq_add_seq (new_stmt_list, seq); if (DR_PTR_INFO (dr) ! && TREE_CODE (addr_base) == SSA_NAME ! && !SSA_NAME_PTR_INFO (addr_base)) { vect_duplicate_ssa_name_ptr_info (addr_base, dr, stmt_info); if (offset || byte_offset) *************** vect_create_data_ref_ptr (gimple stmt, t *** 4048,4054 **** tree aggr_ptr_type; tree aggr_ptr; tree new_temp; - gimple vec_stmt; gimple_seq new_stmt_list = NULL; edge pe = NULL; basic_block new_bb; --- 4048,4053 ---- *************** vect_create_data_ref_ptr (gimple stmt, t *** 4196,4223 **** } *initial_address = new_temp; ! ! /* Create: p = (aggr_type *) initial_base */ ! if (TREE_CODE (new_temp) != SSA_NAME ! || !useless_type_conversion_p (aggr_ptr_type, TREE_TYPE (new_temp))) ! { ! vec_stmt = gimple_build_assign (aggr_ptr, ! fold_convert (aggr_ptr_type, new_temp)); ! aggr_ptr_init = make_ssa_name (aggr_ptr, vec_stmt); ! /* Copy the points-to information if it exists. */ ! if (DR_PTR_INFO (dr)) ! vect_duplicate_ssa_name_ptr_info (aggr_ptr_init, dr, stmt_info); ! gimple_assign_set_lhs (vec_stmt, aggr_ptr_init); ! if (pe) ! { ! new_bb = gsi_insert_on_edge_immediate (pe, vec_stmt); ! gcc_assert (!new_bb); ! } ! else ! gsi_insert_before (gsi, vec_stmt, GSI_SAME_STMT); ! } ! else ! aggr_ptr_init = new_temp; /* (3) Handle the updating of the aggregate-pointer inside the loop. This is needed when ONLY_INIT is false, and also when AT_LOOP is the --- 4195,4201 ---- } *initial_address = new_temp; ! aggr_ptr_init = new_temp; /* (3) Handle the updating of the aggregate-pointer inside the loop. This is needed when ONLY_INIT is false, and also when AT_LOOP is the *************** bump_vector_ptr (tree dataref_ptr, gimpl *** 4342,4348 **** if (bump) update = bump; ! new_dataref_ptr = copy_ssa_name (dataref_ptr); incr_stmt = gimple_build_assign (new_dataref_ptr, POINTER_PLUS_EXPR, dataref_ptr, update); vect_finish_stmt_generation (stmt, incr_stmt, gsi); --- 4320,4329 ---- if (bump) update = bump; ! if (TREE_CODE (dataref_ptr) == SSA_NAME) ! new_dataref_ptr = copy_ssa_name (dataref_ptr); ! else ! new_dataref_ptr = make_ssa_name (TREE_TYPE (dataref_ptr)); incr_stmt = gimple_build_assign (new_dataref_ptr, POINTER_PLUS_EXPR, dataref_ptr, update); vect_finish_stmt_generation (stmt, incr_stmt, gsi); Index: gcc/testsuite/gcc.target/i386/recip-vec-sqrtf-avx.c =================================================================== --- gcc/testsuite/gcc.target/i386/recip-vec-sqrtf-avx.c (revision 224513) +++ gcc/testsuite/gcc.target/i386/recip-vec-sqrtf-avx.c (working copy) @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-O2 -ffast-math -ftree-vectorize -mavx -mtune=generic -mfpmath=sse -mrecip" } */ +/* { dg-options "-O2 -ffast-math -ftree-vectorize -mavx -mtune=generic -mfpmath=sse -mrecip --param max-completely-peel-times=1" } */ float a[32]; float b[32];