diff mbox series

[PATCHv2] Clean up by_pieces_ninsns

Message ID 447b3443-49b7-4c39-a4f5-0eb07da378dd@linux.ibm.com
State New
Headers show
Series [PATCHv2] Clean up by_pieces_ninsns | expand

Commit Message

HAO CHEN GUI Nov. 23, 2023, 1:22 a.m. UTC
Hi,
  This patch cleans up by_pieces_ninsns and does following things.
1. Do the length and alignment adjustment for by pieces compare when
overlap operation is enabled.
2. Replace unnecessary mov_optab checks with gcc assertions.

  Compared to last version, the main change is to replace unnecessary
mov_optab checks with gcc assertions and fix the indentation.

  Bootstrapped and tested on x86 and powerpc64-linux BE and LE with
no regressions. Is this OK for trunk?

Thanks
Gui Haochen

ChangeLog
Clean up by_pieces_ninsns

The by pieces compare can be implemented by overlapped operations. So
it should be taken into consideration when doing the adjustment for
overlap operations.  The mode returned from
widest_fixed_size_mode_for_size is already checked with mov_optab in
by_pieces_mode_supported_p called by widest_fixed_size_mode_for_size.
So it is no need to check mov_optab again in by_pieces_ninsns.  The
patch fixes these issues.

gcc/
	* expr.cc (by_pieces_ninsns): Include by pieces compare when
	do the adjustment for overlap operations.  Replace mov_optab
	checks with gcc assertions.

patch.diff

Comments

Richard Sandiford Nov. 23, 2023, 6:07 p.m. UTC | #1
HAO CHEN GUI <guihaoc@linux.ibm.com> writes:
> Hi,
>   This patch cleans up by_pieces_ninsns and does following things.
> 1. Do the length and alignment adjustment for by pieces compare when
> overlap operation is enabled.
> 2. Replace unnecessary mov_optab checks with gcc assertions.
>
>   Compared to last version, the main change is to replace unnecessary
> mov_optab checks with gcc assertions and fix the indentation.
>
>   Bootstrapped and tested on x86 and powerpc64-linux BE and LE with
> no regressions. Is this OK for trunk?

OK, thanks.

Richard

> Thanks
> Gui Haochen
>
> ChangeLog
> Clean up by_pieces_ninsns
>
> The by pieces compare can be implemented by overlapped operations. So
> it should be taken into consideration when doing the adjustment for
> overlap operations.  The mode returned from
> widest_fixed_size_mode_for_size is already checked with mov_optab in
> by_pieces_mode_supported_p called by widest_fixed_size_mode_for_size.
> So it is no need to check mov_optab again in by_pieces_ninsns.  The
> patch fixes these issues.
>
> gcc/
> 	* expr.cc (by_pieces_ninsns): Include by pieces compare when
> 	do the adjustment for overlap operations.  Replace mov_optab
> 	checks with gcc assertions.
>
> patch.diff
> diff --git a/gcc/expr.cc b/gcc/expr.cc
> index 556bcf7ef59..ffd18fe43cc 100644
> --- a/gcc/expr.cc
> +++ b/gcc/expr.cc
> @@ -1090,18 +1090,16 @@ by_pieces_ninsns (unsigned HOST_WIDE_INT l, unsigned int align,
>    unsigned HOST_WIDE_INT n_insns = 0;
>    fixed_size_mode mode;
>
> -  if (targetm.overlap_op_by_pieces_p () && op != COMPARE_BY_PIECES)
> +  if (targetm.overlap_op_by_pieces_p ())
>      {
>        /* NB: Round up L and ALIGN to the widest integer mode for
>  	 MAX_SIZE.  */
>        mode = widest_fixed_size_mode_for_size (max_size, op);
> -      if (optab_handler (mov_optab, mode) != CODE_FOR_nothing)
> -	{
> -	  unsigned HOST_WIDE_INT up = ROUND_UP (l, GET_MODE_SIZE (mode));
> -	  if (up > l)
> -	    l = up;
> -	  align = GET_MODE_ALIGNMENT (mode);
> -	}
> +      gcc_assert (optab_handler (mov_optab, mode) != CODE_FOR_nothing);
> +      unsigned HOST_WIDE_INT up = ROUND_UP (l, GET_MODE_SIZE (mode));
> +      if (up > l)
> +	l = up;
> +      align = GET_MODE_ALIGNMENT (mode);
>      }
>
>    align = alignment_for_piecewise_move (MOVE_MAX_PIECES, align);
> @@ -1109,12 +1107,11 @@ by_pieces_ninsns (unsigned HOST_WIDE_INT l, unsigned int align,
>    while (max_size > 1 && l > 0)
>      {
>        mode = widest_fixed_size_mode_for_size (max_size, op);
> -      enum insn_code icode;
> +      gcc_assert (optab_handler (mov_optab, mode) != CODE_FOR_nothing);
>
>        unsigned int modesize = GET_MODE_SIZE (mode);
>
> -      icode = optab_handler (mov_optab, mode);
> -      if (icode != CODE_FOR_nothing && align >= GET_MODE_ALIGNMENT (mode))
> +      if (align >= GET_MODE_ALIGNMENT (mode))
>  	{
>  	  unsigned HOST_WIDE_INT n_pieces = l / modesize;
>  	  l %= modesize;
diff mbox series

Patch

diff --git a/gcc/expr.cc b/gcc/expr.cc
index 556bcf7ef59..ffd18fe43cc 100644
--- a/gcc/expr.cc
+++ b/gcc/expr.cc
@@ -1090,18 +1090,16 @@  by_pieces_ninsns (unsigned HOST_WIDE_INT l, unsigned int align,
   unsigned HOST_WIDE_INT n_insns = 0;
   fixed_size_mode mode;

-  if (targetm.overlap_op_by_pieces_p () && op != COMPARE_BY_PIECES)
+  if (targetm.overlap_op_by_pieces_p ())
     {
       /* NB: Round up L and ALIGN to the widest integer mode for
 	 MAX_SIZE.  */
       mode = widest_fixed_size_mode_for_size (max_size, op);
-      if (optab_handler (mov_optab, mode) != CODE_FOR_nothing)
-	{
-	  unsigned HOST_WIDE_INT up = ROUND_UP (l, GET_MODE_SIZE (mode));
-	  if (up > l)
-	    l = up;
-	  align = GET_MODE_ALIGNMENT (mode);
-	}
+      gcc_assert (optab_handler (mov_optab, mode) != CODE_FOR_nothing);
+      unsigned HOST_WIDE_INT up = ROUND_UP (l, GET_MODE_SIZE (mode));
+      if (up > l)
+	l = up;
+      align = GET_MODE_ALIGNMENT (mode);
     }

   align = alignment_for_piecewise_move (MOVE_MAX_PIECES, align);
@@ -1109,12 +1107,11 @@  by_pieces_ninsns (unsigned HOST_WIDE_INT l, unsigned int align,
   while (max_size > 1 && l > 0)
     {
       mode = widest_fixed_size_mode_for_size (max_size, op);
-      enum insn_code icode;
+      gcc_assert (optab_handler (mov_optab, mode) != CODE_FOR_nothing);

       unsigned int modesize = GET_MODE_SIZE (mode);

-      icode = optab_handler (mov_optab, mode);
-      if (icode != CODE_FOR_nothing && align >= GET_MODE_ALIGNMENT (mode))
+      if (align >= GET_MODE_ALIGNMENT (mode))
 	{
 	  unsigned HOST_WIDE_INT n_pieces = l / modesize;
 	  l %= modesize;