On Thu, Aug 11, 2016 at 1:38 PM, H.J. Lu <hongjiu...@intel.com> wrote:
> 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 register.
>
> MAX_BITSIZE_MODE_ANY_INT is only defined for i386 and everyone else uses
> the default.  The widest mode for integer computation is determined by
> MAX_FIXED_MODE_SIZE, not by MAX_BITSIZE_MODE_ANY_INT.  OImode and XImode
> can be used for load and store, including constant integers.  Remove
> MAX_BITSIZE_MODE_ANY_INT from i386 to avoid any potential problems for
> constant integers > TImode.
>
> Tested on i686 and x86-64.  OK for trunk?
>
>
> H.J.
> ---
>         PR middle-end/74113
>         * expr.c (alignment_for_piecewise_move): Call mode_for_size
>         without limit to MAX_FIXED_MODE_SIZE.
>         * config/i386/i386-modes.def (MAX_BITSIZE_MODE_ANY_INT): Removed.
> ---
>  gcc/config/i386/i386-modes.def | 5 -----
>  gcc/expr.c                     | 2 +-
>  2 files changed, 1 insertion(+), 6 deletions(-)
>
> diff --git a/gcc/config/i386/i386-modes.def b/gcc/config/i386/i386-modes.def
> index d524313..61a1f08 100644
> --- a/gcc/config/i386/i386-modes.def
> +++ b/gcc/config/i386/i386-modes.def
> @@ -98,10 +98,5 @@ POINTER_BOUNDS_MODE (BND64, 16);
>  INT_MODE (OI, 32);
>  INT_MODE (XI, 64);
>
> -/* Keep the OI and XI modes from confusing the compiler into thinking
> -   that these modes could actually be used for computation.  They are
> -   only holders for vectors during data movement.  */
> -#define MAX_BITSIZE_MODE_ANY_INT (128)
> -
>  /* The symbol Pmode stands for one of the above machine modes (usually 
> SImode).
>     The tm.h file specifies which one.  It is not a distinct mode.  */
> diff --git a/gcc/expr.c b/gcc/expr.c
> index 46de35f..826fd9b 100644
> --- a/gcc/expr.c
> +++ b/gcc/expr.c
> @@ -692,7 +692,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.7.4
>

PING.


-- 
H.J.

Reply via email to