diff options
Diffstat (limited to 'gcc/tree-vect-data-refs.c')
-rw-r--r-- | gcc/tree-vect-data-refs.c | 34 |
1 files changed, 22 insertions, 12 deletions
diff --git a/gcc/tree-vect-data-refs.c b/gcc/tree-vect-data-refs.c index 4abd27e..1370170 100644 --- a/gcc/tree-vect-data-refs.c +++ b/gcc/tree-vect-data-refs.c @@ -136,6 +136,8 @@ vect_get_smallest_scalar_type (stmt_vec_info stmt_info, || gimple_assign_rhs_code (assign) == WIDEN_SUM_EXPR || gimple_assign_rhs_code (assign) == WIDEN_MULT_EXPR || gimple_assign_rhs_code (assign) == WIDEN_LSHIFT_EXPR + || gimple_assign_rhs_code (assign) == WIDEN_PLUS_EXPR + || gimple_assign_rhs_code (assign) == WIDEN_MINUS_EXPR || gimple_assign_rhs_code (assign) == FLOAT_EXPR)) { tree rhs_type = TREE_TYPE (gimple_assign_rhs1 (assign)); @@ -688,7 +690,8 @@ vect_slp_analyze_node_dependences (vec_info *vinfo, slp_tree node, stmt_vec_info last_access_info = vect_find_last_scalar_stmt_in_slp (node); for (unsigned k = 0; k < SLP_TREE_SCALAR_STMTS (node).length (); ++k) { - stmt_vec_info access_info = SLP_TREE_SCALAR_STMTS (node)[k]; + stmt_vec_info access_info + = vect_orig_stmt (SLP_TREE_SCALAR_STMTS (node)[k]); if (access_info == last_access_info) continue; data_reference *dr_a = STMT_VINFO_DATA_REF (access_info); @@ -759,7 +762,8 @@ vect_slp_analyze_node_dependences (vec_info *vinfo, slp_tree node, = vect_find_first_scalar_stmt_in_slp (node); for (unsigned k = 0; k < SLP_TREE_SCALAR_STMTS (node).length (); ++k) { - stmt_vec_info access_info = SLP_TREE_SCALAR_STMTS (node)[k]; + stmt_vec_info access_info + = vect_orig_stmt (SLP_TREE_SCALAR_STMTS (node)[k]); if (access_info == first_access_info) continue; data_reference *dr_a = STMT_VINFO_DATA_REF (access_info); @@ -1184,14 +1188,9 @@ static void vect_update_misalignment_for_peel (dr_vec_info *dr_info, dr_vec_info *dr_peel_info, int npeel) { - /* It can be assumed that if dr_info has the same alignment as dr_peel, - it is aligned in the vector loop. */ + /* If dr_info is aligned of dr_peel_info is, then mark it so. */ if (vect_dr_aligned_if_peeled_dr_is (dr_info, dr_peel_info)) { - gcc_assert (!known_alignment_for_access_p (dr_info) - || !known_alignment_for_access_p (dr_peel_info) - || (DR_MISALIGNMENT (dr_info) - == DR_MISALIGNMENT (dr_peel_info))); SET_DR_MISALIGNMENT (dr_info, 0); return; } @@ -2164,7 +2163,7 @@ vect_enhance_data_refs_alignment (loop_vec_info loop_vinfo) { unsigned max_allowed_peel = param_vect_max_peeling_for_alignment; - if (flag_vect_cost_model == VECT_COST_MODEL_CHEAP) + if (flag_vect_cost_model <= VECT_COST_MODEL_CHEAP) max_allowed_peel = 0; if (max_allowed_peel != (unsigned)-1) { @@ -2262,7 +2261,7 @@ vect_enhance_data_refs_alignment (loop_vec_info loop_vinfo) do_versioning = (optimize_loop_nest_for_speed_p (loop) && !loop->inner /* FORNOW */ - && flag_vect_cost_model != VECT_COST_MODEL_CHEAP); + && flag_vect_cost_model > VECT_COST_MODEL_CHEAP); if (do_versioning) { @@ -2428,7 +2427,13 @@ vect_slp_analyze_node_alignment (vec_info *vinfo, slp_tree node) /* We need to commit to a vector type for the group now. */ if (is_a <bb_vec_info> (vinfo) && !vect_update_shared_vectype (first_stmt_info, SLP_TREE_VECTYPE (node))) - return false; + { + if (dump_enabled_p ()) + dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location, + "desired vector type conflicts with earlier one " + "for %G", first_stmt_info->stmt); + return false; + } dr_vec_info *dr_info = STMT_VINFO_DR_INFO (first_stmt_info); vect_compute_data_ref_alignment (vinfo, dr_info); @@ -2438,7 +2443,8 @@ vect_slp_analyze_node_alignment (vec_info *vinfo, slp_tree node) /* For creating the data-ref pointer we need alignment of the first element as well. */ - first_stmt_info = vect_find_first_scalar_stmt_in_slp (node); + first_stmt_info + = vect_stmt_to_vectorize (vect_find_first_scalar_stmt_in_slp (node)); if (first_stmt_info != SLP_TREE_SCALAR_STMTS (node)[0]) { first_dr_info = STMT_VINFO_DR_INFO (first_stmt_info); @@ -3678,6 +3684,10 @@ vect_prune_runtime_alias_test_list (loop_vec_info loop_vinfo) unsigned int count = (comp_alias_ddrs.length () + check_unequal_addrs.length ()); + if (count && flag_vect_cost_model == VECT_COST_MODEL_VERY_CHEAP) + return opt_result::failure_at + (vect_location, "would need a runtime alias check\n"); + if (dump_enabled_p ()) dump_printf_loc (MSG_NOTE, vect_location, "improved number of alias checks from %d to %d\n", |