[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