From 61fc5e098e76c9809f35f449a70c9c8d74773d9d Mon Sep 17 00:00:00 2001 From: Richard Biener Date: Fri, 18 Feb 2022 11:34:52 +0100 Subject: [PATCH] tree-optimization/104582 - Simplify vectorizer cost API and fixes 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. 2022-02-18 Richard Biener 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 | 11 +++++++++++ gcc/tree-vectorizer.h | 12 ++++++++++++ 3 files changed, 38 insertions(+), 24 deletions(-) diff --git a/gcc/tree-vect-loop.cc b/gcc/tree-vect-loop.cc index 896218f..5c7b163 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 000a0f4..6b3dde1 100644 --- a/gcc/tree-vect-stmts.cc +++ b/gcc/tree-vect-stmts.cc @@ -109,6 +109,17 @@ 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 + || kind == scalar_stmt); + 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 ddd0637..da99f28 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. */ -- 2.7.4