Richard Biener <rguent...@suse.de> writes: > This simplifies the vectorizer cost API by providing overloads > to add_stmt_cost and record_stmt_cost suitable for scalar stmt > and branch stmt costing which do not need information like > a vector type or alignment. It also fixes two mistakes where > costs for versioning tests were recorded as vector stmt rather > than scalar stmt. > > This is a first patch to simplify the actual fix for PR104582. > > Bootstrapped and tested on x86_64-unknown-linux-gnu. > > OK?
LGTM. Maybe the record_stmt_cost overload should accept scalar_stmt too though? It seems inconsistent to allow it only for add_stmt_cost. Not a strong opinion though, just a suggestion. Thanks, Richard > 2022-02-18 Richard Biener <rguent...@suse.de> > > PR tree-optimization/104582 > * tree-vectorizer.h (add_stmt_cost): New overload. > (record_stmt_cost): Likewise. > * tree-vect-loop.cc (vect_compute_single_scalar_iteration_cost): > Use add_stmt_costs. > (vect_get_known_peeling_cost): Use new overloads. > (vect_estimate_min_profitable_iters): Likewise. Consistently > use scalar_stmt for costing versioning checks. > * tree-vect-stmts.cc (record_stmt_cost): New overload. > --- > gcc/tree-vect-loop.cc | 39 +++++++++++++++------------------------ > gcc/tree-vect-stmts.cc | 10 ++++++++++ > gcc/tree-vectorizer.h | 12 ++++++++++++ > 3 files changed, 37 insertions(+), 24 deletions(-) > > diff --git a/gcc/tree-vect-loop.cc b/gcc/tree-vect-loop.cc > index 896218f23ea..5c7b163f01c 100644 > --- a/gcc/tree-vect-loop.cc > +++ b/gcc/tree-vect-loop.cc > @@ -1323,13 +1323,8 @@ vect_compute_single_scalar_iteration_cost > (loop_vec_info loop_vinfo) > > /* Now accumulate cost. */ > loop_vinfo->scalar_costs = init_cost (loop_vinfo, true); > - stmt_info_for_cost *si; > - int j; > - FOR_EACH_VEC_ELT (LOOP_VINFO_SCALAR_ITERATION_COST (loop_vinfo), > - j, si) > - (void) add_stmt_cost (loop_vinfo->scalar_costs, si->count, > - si->kind, si->stmt_info, si->vectype, > - si->misalign, si->where); > + add_stmt_costs (loop_vinfo->scalar_costs, > + &LOOP_VINFO_SCALAR_ITERATION_COST (loop_vinfo)); > loop_vinfo->scalar_costs->finish_cost (nullptr); > } > > @@ -3873,10 +3868,10 @@ vect_get_known_peeling_cost (loop_vec_info > loop_vinfo, int peel_iters_prologue, > iterations are unknown, count a taken branch per peeled loop. */ > if (peel_iters_prologue > 0) > retval = record_stmt_cost (prologue_cost_vec, 1, cond_branch_taken, > - NULL, NULL_TREE, 0, vect_prologue); > + vect_prologue); > if (*peel_iters_epilogue > 0) > retval += record_stmt_cost (epilogue_cost_vec, 1, cond_branch_taken, > - NULL, NULL_TREE, 0, vect_epilogue); > + vect_epilogue); > } > > stmt_info_for_cost *si; > @@ -3946,8 +3941,7 @@ vect_estimate_min_profitable_iters (loop_vec_info > loop_vinfo, > { > /* FIXME: Make cost depend on complexity of individual check. */ > unsigned len = LOOP_VINFO_MAY_MISALIGN_STMTS (loop_vinfo).length (); > - (void) add_stmt_cost (target_cost_data, len, vector_stmt, > - NULL, NULL_TREE, 0, vect_prologue); > + (void) add_stmt_cost (target_cost_data, len, scalar_stmt, > vect_prologue); > if (dump_enabled_p ()) > dump_printf (MSG_NOTE, > "cost model: Adding cost of checks for loop " > @@ -3959,13 +3953,12 @@ vect_estimate_min_profitable_iters (loop_vec_info > loop_vinfo, > { > /* FIXME: Make cost depend on complexity of individual check. */ > unsigned len = LOOP_VINFO_COMP_ALIAS_DDRS (loop_vinfo).length (); > - (void) add_stmt_cost (target_cost_data, len, vector_stmt, > - NULL, NULL_TREE, 0, vect_prologue); > + (void) add_stmt_cost (target_cost_data, len, scalar_stmt, > vect_prologue); > len = LOOP_VINFO_CHECK_UNEQUAL_ADDRS (loop_vinfo).length (); > if (len) > /* Count LEN - 1 ANDs and LEN comparisons. */ > (void) add_stmt_cost (target_cost_data, len * 2 - 1, > - scalar_stmt, NULL, NULL_TREE, 0, vect_prologue); > + scalar_stmt, vect_prologue); > len = LOOP_VINFO_LOWER_BOUNDS (loop_vinfo).length (); > if (len) > { > @@ -3976,7 +3969,7 @@ vect_estimate_min_profitable_iters (loop_vec_info > loop_vinfo, > if (!LOOP_VINFO_LOWER_BOUNDS (loop_vinfo)[i].unsigned_p) > nstmts += 1; > (void) add_stmt_cost (target_cost_data, nstmts, > - scalar_stmt, NULL, NULL_TREE, 0, vect_prologue); > + scalar_stmt, vect_prologue); > } > if (dump_enabled_p ()) > dump_printf (MSG_NOTE, > @@ -3998,7 +3991,7 @@ vect_estimate_min_profitable_iters (loop_vec_info > loop_vinfo, > > if (LOOP_REQUIRES_VERSIONING (loop_vinfo)) > (void) add_stmt_cost (target_cost_data, 1, cond_branch_taken, > - NULL, NULL_TREE, 0, vect_prologue); > + vect_prologue); > > /* Count statements in scalar loop. Using this as scalar cost for a single > iteration for now. > @@ -4104,21 +4097,19 @@ vect_estimate_min_profitable_iters (loop_vec_info > loop_vinfo, > > if (prologue_need_br_taken_cost) > (void) add_stmt_cost (target_cost_data, 1, cond_branch_taken, > - NULL, NULL_TREE, 0, vect_prologue); > + vect_prologue); > > if (prologue_need_br_not_taken_cost) > (void) add_stmt_cost (target_cost_data, 1, > - cond_branch_not_taken, NULL, NULL_TREE, 0, > - vect_prologue); > + cond_branch_not_taken, vect_prologue); > > if (epilogue_need_br_taken_cost) > (void) add_stmt_cost (target_cost_data, 1, cond_branch_taken, > - NULL, NULL_TREE, 0, vect_epilogue); > + vect_epilogue); > > if (epilogue_need_br_not_taken_cost) > (void) add_stmt_cost (target_cost_data, 1, > - cond_branch_not_taken, NULL, NULL_TREE, 0, > - vect_epilogue); > + cond_branch_not_taken, vect_epilogue); > > /* Take care of special costs for rgroup controls of partial vectors. */ > if (LOOP_VINFO_FULLY_MASKED_P (loop_vinfo)) > @@ -4204,9 +4195,9 @@ vect_estimate_min_profitable_iters (loop_vec_info > loop_vinfo, > } > > (void) add_stmt_cost (target_cost_data, prologue_stmts, > - scalar_stmt, NULL, NULL_TREE, 0, vect_prologue); > + scalar_stmt, vect_prologue); > (void) add_stmt_cost (target_cost_data, body_stmts, > - scalar_stmt, NULL, NULL_TREE, 0, vect_body); > + scalar_stmt, vect_body); > } > > /* FORNOW: The scalar outside cost is incremented in one of the > diff --git a/gcc/tree-vect-stmts.cc b/gcc/tree-vect-stmts.cc > index 000a0f4b47e..acb9fa611c1 100644 > --- a/gcc/tree-vect-stmts.cc > +++ b/gcc/tree-vect-stmts.cc > @@ -109,6 +109,16 @@ record_stmt_cost (stmt_vector_for_cost *body_cost_vec, > int count, > (builtin_vectorization_cost (kind, vectype, misalign) * count); > } > > +unsigned > +record_stmt_cost (stmt_vector_for_cost *body_cost_vec, int count, > + enum vect_cost_for_stmt kind, > + enum vect_cost_model_location where) > +{ > + gcc_assert (kind == cond_branch_taken || kind == cond_branch_not_taken); > + return record_stmt_cost (body_cost_vec, count, kind, NULL, > + NULL_TREE, 0, where); > +} > + > /* Return a variable of type ELEM_TYPE[NELEMS]. */ > > static tree > diff --git a/gcc/tree-vectorizer.h b/gcc/tree-vectorizer.h > index ddd0637185c..da99f28c0dc 100644 > --- a/gcc/tree-vectorizer.h > +++ b/gcc/tree-vectorizer.h > @@ -1762,6 +1762,15 @@ add_stmt_cost (vector_costs *costs, int count, > return cost; > } > > +static inline unsigned > +add_stmt_cost (vector_costs *costs, int count, enum vect_cost_for_stmt kind, > + enum vect_cost_model_location where) > +{ > + gcc_assert (kind == cond_branch_taken || kind == cond_branch_not_taken > + || kind == scalar_stmt); > + return add_stmt_cost (costs, count, kind, NULL, NULL_TREE, 0, where); > +} > + > /* Alias targetm.vectorize.add_stmt_cost. */ > > static inline unsigned > @@ -2120,6 +2129,9 @@ extern bool supportable_narrowing_operation (enum > tree_code, tree, tree, > extern unsigned record_stmt_cost (stmt_vector_for_cost *, int, > enum vect_cost_for_stmt, stmt_vec_info, > tree, int, enum vect_cost_model_location); > +extern unsigned record_stmt_cost (stmt_vector_for_cost *, int, > + enum vect_cost_for_stmt, > + enum vect_cost_model_location); > > /* Overload of record_stmt_cost with VECTYPE derived from STMT_INFO. */