]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Clean up by_pieces_ninsns
authorHaochen Gui <guihaoc@gcc.gnu.org>
Fri, 24 Nov 2023 09:14:46 +0000 (17:14 +0800)
committerHaochen Gui <guihaoc@gcc.gnu.org>
Fri, 24 Nov 2023 09:16:18 +0000 (17:16 +0800)
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 assertion.

gcc/expr.cc

index d932067420323e49d4b96d99fd24f529ac44324e..c432170403bda3d9ca46e507e3657ab4a632c85a 100644 (file)
@@ -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;