> -----Original Message-----
> From: H.J. Lu <[email protected]>
> Sent: Friday, August 29, 2025 11:31 AM
> To: [email protected]
> Cc: [email protected]; Liu, Hongtao <[email protected]>
> Subject: [PATCH] x86: Handle constant in any modes in
> setmem_epilogue_gen_val
> 
> Since the constant passed to setmem_epilogue_gen_val may not be in
> word_mode, update setmem_epilogue_gen_val to handle any integer modes.

Ok. 
> 
> gcc/
> 
>       PR target/121108
>       * config/i386/i386-expand.cc (setmem_epilogue_gen_val): Don't
>       assert op_mode == word_mode and handle any integer modes.
> 
> gcc/testsuite/
> 
>       PR target/121108
>       * gcc.target/i386/memset-strategy-16.c: New test.
> 
> Signed-off-by: H.J. Lu <[email protected]>
> ---
>  gcc/config/i386/i386-expand.cc                     | 13 +++++--------
>  gcc/testsuite/gcc.target/i386/memset-strategy-16.c |  9 +++++++++
>  2 files changed, 14 insertions(+), 8 deletions(-)  create mode 100644
> gcc/testsuite/gcc.target/i386/memset-strategy-16.c
> 
> diff --git a/gcc/config/i386/i386-expand.cc b/gcc/config/i386/i386-expand.cc
> index ec211d11a94..1c788ae098a 100644
> --- a/gcc/config/i386/i386-expand.cc
> +++ b/gcc/config/i386/i386-expand.cc
> @@ -8407,8 +8407,8 @@ expand_setmem_epilogue_via_loop (rtx destmem,
> rtx destptr, rtx value,
> 
>  /* Callback routine for store_by_pieces.  Return the RTL of a register
>     containing GET_MODE_SIZE (MODE) bytes in the RTL register op_p which
> -   is a word or a word vector register.  If PREV_P isn't nullptr, it
> -   has the RTL info from the previous iteration.  */
> +   is an integer or a word vector register.  If PREV_P isn't nullptr,
> +   it has the RTL info from the previous iteration.  */
> 
>  static rtx
>  setmem_epilogue_gen_val (void *op_p, void *prev_p, HOST_WIDE_INT, @@
> -8437,10 +8437,6 @@ setmem_epilogue_gen_val (void *op_p, void *prev_p,
> HOST_WIDE_INT,
>    rtx op = (rtx) op_p;
>    machine_mode op_mode = GET_MODE (op);
> 
> -  gcc_assert (op_mode == word_mode
> -           || (VECTOR_MODE_P (op_mode)
> -               && GET_MODE_INNER (op_mode) == word_mode));
> -
>    if (VECTOR_MODE_P (mode))
>      {
>        gcc_assert (GET_MODE_INNER (mode) == QImode); @@ -8462,16
> +8458,17 @@ setmem_epilogue_gen_val (void *op_p, void *prev_p,
> HOST_WIDE_INT,
>        return tmp;
>      }
> 
> -  target = gen_reg_rtx (word_mode);
>    if (VECTOR_MODE_P (op_mode))
>      {
> +      gcc_assert (GET_MODE_INNER (op_mode) == word_mode);
> +      target = gen_reg_rtx (word_mode);
>        op = gen_rtx_SUBREG (word_mode, op, 0);
>        emit_move_insn (target, op);
>      }
>    else
>      target = op;
> 
> -  if (mode == word_mode)
> +  if (mode == GET_MODE (target))
>      return target;
> 
>    rtx tmp = gen_reg_rtx (mode);
> diff --git a/gcc/testsuite/gcc.target/i386/memset-strategy-16.c
> b/gcc/testsuite/gcc.target/i386/memset-strategy-16.c
> new file mode 100644
> index 00000000000..a8d60e43419
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/i386/memset-strategy-16.c
> @@ -0,0 +1,9 @@
> +/* { dg-do compile } */
> +/* { dg-options "-O2 -mstringop-strategy=rep_4byte" } */
> +
> +extern unsigned x[];
> +void
> +foo (void)
> +{
> +  __builtin_memset(x, 0, 847);
> +}
> --
> 2.51.0

Reply via email to