[PATCH] vect: Pass scalar_costs to finish_cost
Richard Biener
richard.guenther@gmail.com
Mon Nov 8 11:03:41 GMT 2021
On Mon, Nov 8, 2021 at 11:48 AM Richard Sandiford via Gcc-patches
<gcc-patches@gcc.gnu.org> wrote:
>
> When finishing the vector costs, it can be useful to know
> what the associated scalar costs were. This allows targets
> to read information collected about the original scalar loop
> when trying to make a final judgement about the cost of the
> vector code.
Again, what kind of information would you be looking for here?
> This patch therefore passes the scalar costs to
> vector_costs::finish_cost. The parameter is null for the
> scalar costs themselves.
>
> Tested on aarch64-linux-gnu and x86_64-linux-gnu. OK to install?
>
> Richard
>
>
> gcc/
> * tree-vectorizer.h (vector_costs::finish_cost): Take the
> corresponding scalar costs as a parameter.
> (finish_cost): Likewise.
> * tree-vect-loop.c (vect_compute_single_scalar_iteration_cost)
> (vect_estimate_min_profitable_iters): Update accordingly.
> * tree-vect-slp.c (vect_bb_vectorization_profitable_p): Likewise.
> * tree-vectorizer.c (vector_costs::finish_cost): Likewise.
> * config/aarch64/aarch64.c (aarch64_vector_costs::finish_cost):
> Likewise.
> * config/rs6000/rs6000.c (rs6000_cost_data::finish_cost): Likewise.
> ---
> gcc/config/aarch64/aarch64.c | 6 +++---
> gcc/config/rs6000/rs6000.c | 6 +++---
> gcc/tree-vect-loop.c | 6 +++---
> gcc/tree-vect-slp.c | 7 ++++---
> gcc/tree-vectorizer.c | 2 +-
> gcc/tree-vectorizer.h | 14 +++++++++-----
> 6 files changed, 23 insertions(+), 18 deletions(-)
>
> diff --git a/gcc/config/aarch64/aarch64.c b/gcc/config/aarch64/aarch64.c
> index 19f67415234..ebb937211ed 100644
> --- a/gcc/config/aarch64/aarch64.c
> +++ b/gcc/config/aarch64/aarch64.c
> @@ -14745,7 +14745,7 @@ public:
> stmt_vec_info stmt_info, tree vectype,
> int misalign,
> vect_cost_model_location where) override;
> - void finish_cost () override;
> + void finish_cost (const vector_costs *) override;
>
> private:
> void record_potential_advsimd_unrolling (loop_vec_info);
> @@ -16138,7 +16138,7 @@ aarch64_vector_costs::adjust_body_cost (unsigned int body_cost)
> }
>
> void
> -aarch64_vector_costs::finish_cost ()
> +aarch64_vector_costs::finish_cost (const vector_costs *scalar_costs)
> {
> loop_vec_info loop_vinfo = dyn_cast<loop_vec_info> (m_vinfo);
> if (loop_vinfo
> @@ -16146,7 +16146,7 @@ aarch64_vector_costs::finish_cost ()
> && aarch64_use_new_vector_costs_p ())
> m_costs[vect_body] = adjust_body_cost (m_costs[vect_body]);
>
> - vector_costs::finish_cost ();
> + vector_costs::finish_cost (scalar_costs);
> }
>
> static void initialize_aarch64_code_model (struct gcc_options *);
> diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c
> index ec054800491..cd44ac61336 100644
> --- a/gcc/config/rs6000/rs6000.c
> +++ b/gcc/config/rs6000/rs6000.c
> @@ -5268,7 +5268,7 @@ public:
> stmt_vec_info stmt_info, tree vectype,
> int misalign,
> vect_cost_model_location where) override;
> - void finish_cost () override;
> + void finish_cost (const vector_costs *) override;
>
> protected:
> void update_target_cost_per_stmt (vect_cost_for_stmt, stmt_vec_info,
> @@ -5522,7 +5522,7 @@ rs6000_cost_data::adjust_vect_cost_per_loop (loop_vec_info loop_vinfo)
> }
>
> void
> -rs6000_cost_data::finish_cost ()
> +rs6000_cost_data::finish_cost (const vector_costs *scalar_costs)
> {
> if (loop_vec_info loop_vinfo = dyn_cast<loop_vec_info> (m_vinfo))
> {
> @@ -5539,7 +5539,7 @@ rs6000_cost_data::finish_cost ()
> m_costs[vect_body] += 10000;
> }
>
> - vector_costs::finish_cost ();
> + vector_costs::finish_cost (scalar_costs);
> }
>
> /* Implement targetm.loop_unroll_adjust. */
> diff --git a/gcc/tree-vect-loop.c b/gcc/tree-vect-loop.c
> index 887275a5071..190b52142e4 100644
> --- a/gcc/tree-vect-loop.c
> +++ b/gcc/tree-vect-loop.c
> @@ -1301,7 +1301,7 @@ vect_compute_single_scalar_iteration_cost (loop_vec_info loop_vinfo)
> (void) add_stmt_cost (loop_vinfo->scalar_costs, si->count,
> si->kind, si->stmt_info, si->vectype,
> si->misalign, si->where);
> - loop_vinfo->scalar_costs->finish_cost ();
> + loop_vinfo->scalar_costs->finish_cost (nullptr);
> }
>
>
> @@ -4130,8 +4130,8 @@ vect_estimate_min_profitable_iters (loop_vec_info loop_vinfo,
> }
>
> /* Complete the target-specific cost calculations. */
> - finish_cost (loop_vinfo->vector_costs, &vec_prologue_cost,
> - &vec_inside_cost, &vec_epilogue_cost);
> + finish_cost (loop_vinfo->vector_costs, loop_vinfo->scalar_costs,
> + &vec_prologue_cost, &vec_inside_cost, &vec_epilogue_cost);
>
> vec_outside_cost = (int)(vec_prologue_cost + vec_epilogue_cost);
>
> diff --git a/gcc/tree-vect-slp.c b/gcc/tree-vect-slp.c
> index d437bfd20d0..94c75497495 100644
> --- a/gcc/tree-vect-slp.c
> +++ b/gcc/tree-vect-slp.c
> @@ -5344,7 +5344,8 @@ vect_bb_vectorization_profitable_p (bb_vec_info bb_vinfo,
> while (si < li_scalar_costs.length ()
> && li_scalar_costs[si].first == sl);
> unsigned dummy;
> - finish_cost (scalar_target_cost_data, &dummy, &scalar_cost, &dummy);
> + finish_cost (scalar_target_cost_data, nullptr,
> + &dummy, &scalar_cost, &dummy);
> delete scalar_target_cost_data;
>
> /* Complete the target-specific vector cost calculation. */
> @@ -5356,8 +5357,8 @@ vect_bb_vectorization_profitable_p (bb_vec_info bb_vinfo,
> }
> while (vi < li_vector_costs.length ()
> && li_vector_costs[vi].first == vl);
> - finish_cost (vect_target_cost_data, &vec_prologue_cost,
> - &vec_inside_cost, &vec_epilogue_cost);
> + finish_cost (vect_target_cost_data, scalar_target_cost_data,
> + &vec_prologue_cost, &vec_inside_cost, &vec_epilogue_cost);
> delete vect_target_cost_data;
>
> vec_outside_cost = vec_prologue_cost + vec_epilogue_cost;
> diff --git a/gcc/tree-vectorizer.c b/gcc/tree-vectorizer.c
> index dcbb2a3f13a..71f12b3257e 100644
> --- a/gcc/tree-vectorizer.c
> +++ b/gcc/tree-vectorizer.c
> @@ -1703,7 +1703,7 @@ vector_costs::add_stmt_cost (int count, vect_cost_for_stmt kind,
> /* See the comment above the declaration for details. */
>
> void
> -vector_costs::finish_cost ()
> +vector_costs::finish_cost (const vector_costs *)
> {
> gcc_assert (!m_finished);
> m_finished = true;
> diff --git a/gcc/tree-vectorizer.h b/gcc/tree-vectorizer.h
> index 8dba3a34aa9..da212334c06 100644
> --- a/gcc/tree-vectorizer.h
> +++ b/gcc/tree-vectorizer.h
> @@ -1415,8 +1415,11 @@ public:
> vect_cost_model_location where);
>
> /* Finish calculating the cost of the code. The results can be
> - read back using the functions below. */
> - virtual void finish_cost ();
> + read back using the functions below.
> +
> + If the costs describe vector code, SCALAR_COSTS gives the costs
> + of the corresponding scalar code, otherwise it is null. */
> + virtual void finish_cost (const vector_costs *scalar_costs);
>
> /* The costs in THIS and OTHER both describe ways of vectorizing
> a main loop. Return true if the costs described by THIS are
> @@ -1691,10 +1694,11 @@ add_stmt_cost (vector_costs *costs, stmt_info_for_cost *i)
> /* Alias targetm.vectorize.finish_cost. */
>
> static inline void
> -finish_cost (vector_costs *costs, unsigned *prologue_cost,
> - unsigned *body_cost, unsigned *epilogue_cost)
> +finish_cost (vector_costs *costs, const vector_costs *scalar_costs,
> + unsigned *prologue_cost, unsigned *body_cost,
> + unsigned *epilogue_cost)
> {
> - costs->finish_cost ();
> + costs->finish_cost (scalar_costs);
> *prologue_cost = costs->prologue_cost ();
> *body_cost = costs->body_cost ();
> *epilogue_cost = costs->epilogue_cost ();
> --
> 2.25.1
>
More information about the Gcc-patches
mailing list