https://gcc.gnu.org/g:207a506ee50d6510ff4c53db39a52ba1082842e4

commit r16-3459-g207a506ee50d6510ff4c53db39a52ba1082842e4
Author: H.J. Lu <hjl.to...@gmail.com>
Date:   Thu Aug 28 20:30:35 2025 -0700

    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.
    
    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 <hjl.to...@gmail.com>

Diff:
---
 gcc/config/i386/i386-expand.cc                     | 13 +++++--------
 gcc/testsuite/gcc.target/i386/memset-strategy-16.c |  9 +++++++++
 2 files changed, 14 insertions(+), 8 deletions(-)

diff --git a/gcc/config/i386/i386-expand.cc b/gcc/config/i386/i386-expand.cc
index ef6c12cd5697..6734d9f1464e 100644
--- a/gcc/config/i386/i386-expand.cc
+++ b/gcc/config/i386/i386-expand.cc
@@ -8405,8 +8405,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,
@@ -8435,10 +8435,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);
@@ -8460,16 +8456,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 000000000000..a8d60e434196
--- /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);
+}

Reply via email to