Hi Richi, on 2023/6/30 19:11, Richard Biener wrote: > On Tue, Jun 13, 2023 at 4:03 AM Kewen Lin <li...@linux.ibm.com> wrote: >> >> This patch adds one extra argument cost_vec to function >> vect_build_gather_load_calls, so that we can do costing >> next to the tranform in vect_build_gather_load_calls. >> For now, the implementation just follows the handlings in >> vect_model_load_cost, it isn't so good, so placing one >> FIXME for any further improvement. This patch should not >> cause any functional changes. >> >> gcc/ChangeLog: >> >> * tree-vect-stmts.cc (vect_build_gather_load_calls): Add the >> handlings >> on costing with one extra argument cost_vec. >> (vectorizable_load): Adjust the call to vect_build_gather_load_calls. >> (vect_model_load_cost): Assert it won't get VMAT_GATHER_SCATTER with >> gs_info.decl set any more. >> --- >> gcc/tree-vect-stmts.cc | 31 +++++++++++++++++++++++-------- >> 1 file changed, 23 insertions(+), 8 deletions(-) >> >> diff --git a/gcc/tree-vect-stmts.cc b/gcc/tree-vect-stmts.cc >> index 44514658be3..744cdf40e26 100644 >> --- a/gcc/tree-vect-stmts.cc >> +++ b/gcc/tree-vect-stmts.cc >> @@ -1135,6 +1135,8 @@ vect_model_load_cost (vec_info *vinfo, >> slp_tree slp_node, >> stmt_vector_for_cost *cost_vec) >> { >> + gcc_assert (memory_access_type != VMAT_GATHER_SCATTER || !gs_info->decl); >> + >> unsigned int inside_cost = 0, prologue_cost = 0; >> bool grouped_access_p = STMT_VINFO_GROUPED_ACCESS (stmt_info); >> >> @@ -2819,7 +2821,8 @@ vect_build_gather_load_calls (vec_info *vinfo, >> stmt_vec_info stmt_info, >> gimple_stmt_iterator *gsi, >> gimple **vec_stmt, >> gather_scatter_info *gs_info, >> - tree mask) >> + tree mask, >> + stmt_vector_for_cost *cost_vec) >> { >> loop_vec_info loop_vinfo = dyn_cast <loop_vec_info> (vinfo); >> class loop *loop = LOOP_VINFO_LOOP (loop_vinfo); >> @@ -2831,6 +2834,23 @@ vect_build_gather_load_calls (vec_info *vinfo, >> stmt_vec_info stmt_info, >> poly_uint64 gather_off_nunits >> = TYPE_VECTOR_SUBPARTS (gs_info->offset_vectype); >> >> + /* FIXME: Keep the previous costing way in vect_model_load_cost by costing >> + N scalar loads, but it should be tweaked to use target specific costs >> + on related gather load calls. */ >> + if (!vec_stmt) > > going over the series now, I'm collecting comments but wanted to get > this one out here: > I'd rather see if (cost_vec) here, that 'vec_stmt' argument is quite > legacy (I think it can > be completely purged everywhere) >
OK, updated with the below new version v2. I guessed you meant we would like to use cost_vec for checking costing or not and use vec_stmts in stmt_info to store the vectorized stmt. diff --git a/gcc/tree-vect-stmts.cc b/gcc/tree-vect-stmts.cc index ec177dcad82..dd8f5421d4e 100644 --- a/gcc/tree-vect-stmts.cc +++ b/gcc/tree-vect-stmts.cc @@ -1136,6 +1136,8 @@ vect_model_load_cost (vec_info *vinfo, slp_tree slp_node, stmt_vector_for_cost *cost_vec) { + gcc_assert (memory_access_type != VMAT_GATHER_SCATTER || !gs_info->decl); + unsigned int inside_cost = 0, prologue_cost = 0; bool grouped_access_p = STMT_VINFO_GROUPED_ACCESS (stmt_info); @@ -2846,7 +2848,8 @@ vect_build_gather_load_calls (vec_info *vinfo, stmt_vec_info stmt_info, gimple_stmt_iterator *gsi, gimple **vec_stmt, gather_scatter_info *gs_info, - tree mask) + tree mask, + stmt_vector_for_cost *cost_vec) { loop_vec_info loop_vinfo = dyn_cast <loop_vec_info> (vinfo); class loop *loop = LOOP_VINFO_LOOP (loop_vinfo); @@ -2858,6 +2861,23 @@ vect_build_gather_load_calls (vec_info *vinfo, stmt_vec_info stmt_info, poly_uint64 gather_off_nunits = TYPE_VECTOR_SUBPARTS (gs_info->offset_vectype); + /* FIXME: Keep the previous costing way in vect_model_load_cost by costing + N scalar loads, but it should be tweaked to use target specific costs + on related gather load calls. */ + if (cost_vec) + { + unsigned int assumed_nunits = vect_nunits_for_cost (vectype); + unsigned int inside_cost; + inside_cost = record_stmt_cost (cost_vec, ncopies * assumed_nunits, + scalar_load, stmt_info, 0, vect_body); + if (dump_enabled_p ()) + dump_printf_loc (MSG_NOTE, vect_location, + "vect_model_load_cost: inside_cost = %d, " + "prologue_cost = 0 .\n", + inside_cost); + return; + } + tree arglist = TYPE_ARG_TYPES (TREE_TYPE (gs_info->decl)); tree rettype = TREE_TYPE (TREE_TYPE (gs_info->decl)); tree srctype = TREE_VALUE (arglist); arglist = TREE_CHAIN (arglist); @@ -9631,13 +9651,8 @@ vectorizable_load (vec_info *vinfo, if (memory_access_type == VMAT_GATHER_SCATTER && gs_info.decl) { - if (costing_p) - vect_model_load_cost (vinfo, stmt_info, ncopies, vf, memory_access_type, - alignment_support_scheme, misalignment, &gs_info, - slp_node, cost_vec); - else - vect_build_gather_load_calls (vinfo, stmt_info, gsi, vec_stmt, &gs_info, - mask); + vect_build_gather_load_calls (vinfo, stmt_info, gsi, vec_stmt, &gs_info, + mask, cost_vec); return true; } -- 2.31.1