On Sat, Nov 16, 2024 at 5:27 AM Andrew Pinski <quic_apin...@quicinc.com> wrote:
>
> This is the first patch in improving this code.
> Since there are a few places which get the index and they
> check the same thing, let's factor that out into one function.
>
> Bootstrapped and tested on x86_64-linux-gnu.

OK.

Thanks,
Richard.

> gcc/ChangeLog:
>
>         * cfgexpand.cc (INVALID_STACK_INDEX): New defined.
>         (decl_stack_index): New function.
>         (visit_op): Use decl_stack_index.
>         (visit_conflict): Likewise.
>         (add_scope_conflicts_1): Likewise.
>
> Signed-off-by: Andrew Pinski <quic_apin...@quicinc.com>
> ---
>  gcc/cfgexpand.cc | 62 +++++++++++++++++++++++++++++-------------------
>  1 file changed, 37 insertions(+), 25 deletions(-)
>
> diff --git a/gcc/cfgexpand.cc b/gcc/cfgexpand.cc
> index ed890f692e5..b88e8827667 100644
> --- a/gcc/cfgexpand.cc
> +++ b/gcc/cfgexpand.cc
> @@ -338,6 +338,8 @@ static unsigned stack_vars_alloc;
>  static unsigned stack_vars_num;
>  static hash_map<tree, unsigned> *decl_to_stack_part;
>
> +#define INVALID_STACK_INDEX ((unsigned)-1)
> +
>  /* Conflict bitmaps go on this obstack.  This allows us to destroy
>     all of them in one big sweep.  */
>  static bitmap_obstack stack_var_bitmap_obstack;
> @@ -526,6 +528,27 @@ stack_var_conflict_p (unsigned x, unsigned y)
>    return bitmap_bit_p (a->conflicts, y);
>  }
>
> +/* Returns the DECL's index into the stack_vars array.
> +   If the DECL does not exist return INVALID_STACK_INDEX.  */
> +static unsigned
> +decl_stack_index (tree decl)
> +{
> +  if (!decl)
> +    return INVALID_STACK_INDEX;
> +  if (!DECL_P (decl))
> +    return INVALID_STACK_INDEX;
> +  if (DECL_RTL_IF_SET (decl) != pc_rtx)
> +    return INVALID_STACK_INDEX;
> +  unsigned *v = decl_to_stack_part->get (decl);
> +  if (!v)
> +    return INVALID_STACK_INDEX;
> +
> +  unsigned indx = *v;
> +  gcc_checking_assert (indx != INVALID_STACK_INDEX);
> +  gcc_checking_assert (indx < stack_vars_num);
> +  return indx;
> +}
> +
>  /* Callback for walk_stmt_ops.  If OP is a decl touched by add_stack_var
>     enter its partition number into bitmap DATA.  */
>
> @@ -534,14 +557,9 @@ visit_op (gimple *, tree op, tree, void *data)
>  {
>    bitmap active = (bitmap)data;
>    op = get_base_address (op);
> -  if (op
> -      && DECL_P (op)
> -      && DECL_RTL_IF_SET (op) == pc_rtx)
> -    {
> -      unsigned *v = decl_to_stack_part->get (op);
> -      if (v)
> -       bitmap_set_bit (active, *v);
> -    }
> +  unsigned idx = decl_stack_index (op);
> +  if (idx != INVALID_STACK_INDEX)
> +    bitmap_set_bit (active, idx);
>    return false;
>  }
>
> @@ -554,20 +572,15 @@ visit_conflict (gimple *, tree op, tree, void *data)
>  {
>    bitmap active = (bitmap)data;
>    op = get_base_address (op);
> -  if (op
> -      && DECL_P (op)
> -      && DECL_RTL_IF_SET (op) == pc_rtx)
> +  unsigned num = decl_stack_index (op);
> +  if (num != INVALID_STACK_INDEX
> +      && bitmap_set_bit (active, num))
>      {
> -      unsigned *v = decl_to_stack_part->get (op);
> -      if (v && bitmap_set_bit (active, *v))
> -       {
> -         unsigned num = *v;
> -         bitmap_iterator bi;
> -         unsigned i;
> -         gcc_assert (num < stack_vars_num);
> -         EXECUTE_IF_SET_IN_BITMAP (active, 0, i, bi)
> -           add_stack_var_conflict (num, i);
> -       }
> +      bitmap_iterator bi;
> +      unsigned i;
> +      gcc_assert (num < stack_vars_num);
> +      EXECUTE_IF_SET_IN_BITMAP (active, 0, i, bi)
> +       add_stack_var_conflict (num, i);
>      }
>    return false;
>  }
> @@ -639,15 +652,14 @@ add_scope_conflicts_1 (basic_block bb, bitmap work, 
> bool for_conflict)
>        if (gimple_clobber_p (stmt))
>         {
>           tree lhs = gimple_assign_lhs (stmt);
> -         unsigned *v;
>           /* Handle only plain var clobbers.
>              Nested functions lowering and C++ front-end inserts clobbers
>              which are not just plain variables.  */
>           if (!VAR_P (lhs))
>             continue;
> -         if (DECL_RTL_IF_SET (lhs) == pc_rtx
> -             && (v = decl_to_stack_part->get (lhs)))
> -           bitmap_clear_bit (work, *v);
> +         unsigned indx = decl_stack_index (lhs);
> +         if (indx != INVALID_STACK_INDEX)
> +           bitmap_clear_bit (work, indx);
>         }
>        else if (!is_gimple_debug (stmt))
>         {
> --
> 2.43.0
>

Reply via email to