https://gcc.gnu.org/g:40da83e4a770f0a05ef6ace4cdd75397609e5bde

commit r16-3015-g40da83e4a770f0a05ef6ace4cdd75397609e5bde
Author: H.J. Lu <hjl.to...@gmail.com>
Date:   Tue Aug 5 06:27:15 2025 -0700

    x86: Get the widest vector mode from STORE_MAX_PIECES for memset
    
    commit 050b1708ea532ea4840e97d85fad4ca63d4cd631
    Author: H.J. Lu <hjl.to...@gmail.com>
    Date:   Thu Jun 19 05:03:48 2025 +0800
    
        x86: Get the widest vector mode from MOVE_MAX
    
    gets the widest vector mode from MOVE_MAX.  But for memset, it should
    use STORE_MAX_PIECES.
    
    gcc/
    
            PR target/121410
            * config/i386/i386-expand.cc (ix86_expand_set_or_cpymem): Use
            STORE_MAX_PIECES to get the widest vector mode in vector loop
            for memset.
    
    gcc/testsuite/
    
            PR target/121410
            * gcc.target/i386/pr121410.c: New test.
    
    Signed-off-by: H.J. Lu <hjl.to...@gmail.com>

Diff:
---
 gcc/config/i386/i386-expand.cc           |  5 +++--
 gcc/testsuite/gcc.target/i386/pr121410.c | 11 +++++++++++
 2 files changed, 14 insertions(+), 2 deletions(-)

diff --git a/gcc/config/i386/i386-expand.cc b/gcc/config/i386/i386-expand.cc
index 09aa9b1461cc..12cec611c7b5 100644
--- a/gcc/config/i386/i386-expand.cc
+++ b/gcc/config/i386/i386-expand.cc
@@ -9574,8 +9574,9 @@ ix86_expand_set_or_cpymem (rtx dst, rtx src, rtx 
count_exp, rtx val_exp,
     case vector_loop:
       need_zero_guard = true;
       unroll_factor = 4;
-      /* Get the vector mode to move MOVE_MAX bytes.  */
-      nunits = MOVE_MAX / GET_MODE_SIZE (word_mode);
+      /* Get the vector mode to move STORE_MAX_PIECES/MOVE_MAX bytes.  */
+      nunits = issetmem ? STORE_MAX_PIECES : MOVE_MAX;
+      nunits /= GET_MODE_SIZE (word_mode);
       if (nunits > 1)
        {
          move_mode = mode_for_vector (word_mode, nunits).require ();
diff --git a/gcc/testsuite/gcc.target/i386/pr121410.c 
b/gcc/testsuite/gcc.target/i386/pr121410.c
new file mode 100644
index 000000000000..04bab91e1b81
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/pr121410.c
@@ -0,0 +1,11 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -march=x86-64 -mavx512f -mstore-max=128" } */
+
+extern unsigned _BitInt(3719) a;
+extern _BitInt(465) g;
+void
+foo(void)
+{
+  _BitInt(465) b = a >> 1860;
+  g = b + b;
+}

Reply via email to