I am working a patch to enable SSE, AVX and AVX512 for memcpy/memset optimization. x86 backend defines MAX_BITSIZE_MODE_ANY_INT to 128 to keep the OI and XI modes from confusing the compiler into thinking that these modes could actually be used for computation. But the OI and XI modes can be used for data movement with vector instructions.
alignment_for_piecewise_move is called only with MOVE_MAX_PIECES or STORE_MAX_PIECES, which are the number of bytes at a time that we can move or store efficiently. We should call mode_for_size without limit to MAX_FIXED_MODE_SIZE, which is an integer expression for the size in bits of the largest integer machine mode that should actually be used, may be smaller than MOVE_MAX_PIECES or STORE_MAX_PIECES, which may use vector. Tested on Linux/x86-64. OK for trunk. H.J. --- * expr.c (alignment_for_piecewise_move): Call mode_for_size without limit to MAX_FIXED_MODE_SIZE. --- gcc/expr.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gcc/expr.c b/gcc/expr.c index 248d3d7..36070f0 100644 --- a/gcc/expr.c +++ b/gcc/expr.c @@ -733,7 +733,7 @@ alignment_for_piecewise_move (unsigned int max_pieces, unsigned int align) { machine_mode tmode; - tmode = mode_for_size (max_pieces * BITS_PER_UNIT, MODE_INT, 1); + tmode = mode_for_size (max_pieces * BITS_PER_UNIT, MODE_INT, 0); if (align >= GET_MODE_ALIGNMENT (tmode)) align = GET_MODE_ALIGNMENT (tmode); else -- 2.5.5