committed, thanks.

On Tue, Jan 3, 2023 at 2:56 PM <juzhe.zh...@rivai.ai> wrote:

> From: Ju-Zhe Zhong <juzhe.zh...@rivai.ai>
>
> Currently we support this optimization:
>
> bb 0:
>  vsetvli a5,zero,e32,mf2
> bb 1:
>  vsetvli a5,zero,e64,m1 --> vsetvli zero,zero,e64,m1
>
> According RVV ISA, we can do this optimization only if both RATIO and AVL
> are equal.
> However, current VSETVL PASS missed the check of AVL. This patch add this
> condition
> check to fix bugs.
>
> gcc/ChangeLog:
>
>         * config/riscv/riscv-vsetvl.cc
> (vector_infos_manager::all_same_avl_p): New function.
>         (pass_vsetvl::can_refine_vsetvl_p): Add AVL check.
>         (pass_vsetvl::commit_vsetvls): Ditto.
>         * config/riscv/riscv-vsetvl.h: New function declaration.
>
> ---
>  gcc/config/riscv/riscv-vsetvl.cc | 35 ++++++++++++++++++++++++++++----
>  gcc/config/riscv/riscv-vsetvl.h  |  3 +++
>  2 files changed, 34 insertions(+), 4 deletions(-)
>
> diff --git a/gcc/config/riscv/riscv-vsetvl.cc
> b/gcc/config/riscv/riscv-vsetvl.cc
> index ce1e9e3609f..1afe76304fb 100644
> --- a/gcc/config/riscv/riscv-vsetvl.cc
> +++ b/gcc/config/riscv/riscv-vsetvl.cc
> @@ -1440,6 +1440,29 @@ vector_infos_manager::all_same_ratio_p (sbitmap
> bitdata) const
>    return true;
>  }
>
> +bool
> +vector_infos_manager::all_same_avl_p (const basic_block cfg_bb,
> +                                     sbitmap bitdata) const
> +{
> +  if (bitmap_empty_p (bitdata))
> +    return false;
> +
> +  const auto &block_info = vector_block_infos[cfg_bb->index];
> +  if (!block_info.local_dem.demand_p (DEMAND_AVL))
> +    return true;
> +
> +  avl_info avl = block_info.local_dem.get_avl_info ();
> +  unsigned int bb_index;
> +  sbitmap_iterator sbi;
> +
> +  EXECUTE_IF_SET_IN_BITMAP (bitdata, 0, bb_index, sbi)
> +  {
> +    if (vector_exprs[bb_index]->get_avl_info () != avl)
> +      return false;
> +  }
> +  return true;
> +}
> +
>  size_t
>  vector_infos_manager::expr_set_num (sbitmap bitdata) const
>  {
> @@ -2113,6 +2136,10 @@ pass_vsetvl::can_refine_vsetvl_p (const basic_block
> cfg_bb, uint8_t ratio) const
>         m_vector_manager->vector_avin[cfg_bb->index]))
>      return false;
>
> +  if (!m_vector_manager->all_same_avl_p (
> +       cfg_bb, m_vector_manager->vector_avin[cfg_bb->index]))
> +    return false;
> +
>    size_t expr_id
>      = bitmap_first_set_bit (m_vector_manager->vector_avin[cfg_bb->index]);
>    if (m_vector_manager->vector_exprs[expr_id]->get_ratio () != ratio)
> @@ -2227,11 +2254,11 @@ pass_vsetvl::commit_vsetvls (void)
>
>               insn_info *insn = require->get_insn ();
>               vector_insn_info prev_info = vector_insn_info ();
> -             if (m_vector_manager->all_same_ratio_p (
> -                   m_vector_manager->vector_avout[eg->src->index]))
> +             sbitmap bitdata =
> m_vector_manager->vector_avout[eg->src->index];
> +             if (m_vector_manager->all_same_ratio_p (bitdata)
> +                 && m_vector_manager->all_same_avl_p (eg->dest, bitdata))
>                 {
> -                 size_t first = bitmap_first_set_bit (
> -                   m_vector_manager->vector_avout[eg->src->index]);
> +                 size_t first = bitmap_first_set_bit (bitdata);
>                   prev_info = *m_vector_manager->vector_exprs[first];
>                 }
>
> diff --git a/gcc/config/riscv/riscv-vsetvl.h
> b/gcc/config/riscv/riscv-vsetvl.h
> index 6f27004fab1..c8218a6ff00 100644
> --- a/gcc/config/riscv/riscv-vsetvl.h
> +++ b/gcc/config/riscv/riscv-vsetvl.h
> @@ -333,6 +333,9 @@ public:
>    /* Get all relaxer expression id for corresponding vector info.  */
>    auto_vec<size_t> get_all_available_exprs (const vector_insn_info &)
> const;
>
> +  /* Return true if all expression set in bitmap are same AVL.  */
> +  bool all_same_avl_p (const basic_block, sbitmap) const;
> +
>    /* Return true if all expression set in bitmap are same ratio.  */
>    bool all_same_ratio_p (sbitmap) const;
>
> --
> 2.36.3
>
>

Reply via email to