aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorH.J. Lu <hjl.tools@gmail.com>2025-08-28 20:30:35 -0700
committerH.J. Lu <hjl.tools@gmail.com>2025-08-29 05:14:08 -0700
commit207a506ee50d6510ff4c53db39a52ba1082842e4 (patch)
treeda3234cb56ee7743104506a62d4e7bfadb3c5923
parent62843b3453ee30f77ceb7e09769e0cea9920a2cd (diff)
downloadgcc-207a506ee50d6510ff4c53db39a52ba1082842e4.zip
gcc-207a506ee50d6510ff4c53db39a52ba1082842e4.tar.gz
gcc-207a506ee50d6510ff4c53db39a52ba1082842e4.tar.bz2
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.tools@gmail.com>
-rw-r--r--gcc/config/i386/i386-expand.cc13
-rw-r--r--gcc/testsuite/gcc.target/i386/memset-strategy-16.c9
2 files changed, 14 insertions, 8 deletions
diff --git a/gcc/config/i386/i386-expand.cc b/gcc/config/i386/i386-expand.cc
index ef6c12c..6734d9f 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 0000000..a8d60e4
--- /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);
+}