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 assertion.
This commit is contained in:
parent
9a96a9e45b
commit
e377a340b3
1 changed files with 8 additions and 11 deletions
19
gcc/expr.cc
19
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;
|
||||
|
|
Loading…
Add table
Reference in a new issue