diff options
author | H.J. Lu <hjl.tools@gmail.com> | 2025-08-28 20:30:35 -0700 |
---|---|---|
committer | H.J. Lu <hjl.tools@gmail.com> | 2025-08-29 05:14:08 -0700 |
commit | 207a506ee50d6510ff4c53db39a52ba1082842e4 (patch) | |
tree | da3234cb56ee7743104506a62d4e7bfadb3c5923 | |
parent | 62843b3453ee30f77ceb7e09769e0cea9920a2cd (diff) | |
download | gcc-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.cc | 13 | ||||
-rw-r--r-- | 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 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); +} |