HAO CHEN GUI <[email protected]> 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;