https://gcc.gnu.org/g:9e30860f8c77309c9f74742fe8866d2ca0d0fe7a

commit r16-3170-g9e30860f8c77309c9f74742fe8866d2ca0d0fe7a
Author: H.J. Lu <hjl.to...@gmail.com>
Date:   Tue Aug 12 05:19:24 2025 -0700

    x86: Convert integer constant to mode of move
    
    For
    
    (set (reg/v:DI 106 [ k ])
         (const_int 3000000000 [0xb2d05e00]))
    ...
    (set (reg:V4SI 115 [ _13 ])
         (vec_duplicate:V4SI (subreg:SI (reg/v:DI 106 [ k ]) 0)))
    ...
    (set (reg:V2SI 118 [ _9 ])
         (vec_duplicate:V2SI (subreg:SI (reg/v:DI 106 [ k ]) 0)))
    
    we should generate
    
    (set (reg:SI 125)
         (const_int -1294967296 [0xffffffffb2d05e00]))
    (set (reg:V4SI 124)
         (vec_duplicate:V4SI (reg:VSI 125))
    ...
    (set (reg:V4SI 115 [ _13 ])
         (reg:V4SI 124)
    ...
    (set (reg:V2SI 118 [ _9 ])
         (subreg:V2SI (reg:V4SI 124))
    
    by converting integer constant to mode of move.
    
    gcc/
    
            PR target/121497
            * config/i386/i386-features.cc (ix86_broadcast_inner): Convert
            integer constant to mode of move
    
    gcc/testsuite/
    
            PR target/121497
            * gcc.target/i386/pr121497.c: New test.
    
    Co-authored-by: Liu, Hongtao <hongtao....@intel.com>
    Signed-off-by: H.J. Lu <hjl.to...@gmail.com>

Diff:
---
 gcc/config/i386/i386-features.cc         |  2 ++
 gcc/testsuite/gcc.target/i386/pr121497.c | 18 ++++++++++++++++++
 2 files changed, 20 insertions(+)

diff --git a/gcc/config/i386/i386-features.cc b/gcc/config/i386/i386-features.cc
index 9941e61361c7..b4aa5fa1de7d 100644
--- a/gcc/config/i386/i386-features.cc
+++ b/gcc/config/i386/i386-features.cc
@@ -3639,6 +3639,8 @@ ix86_broadcast_inner (rtx op, machine_mode mode,
         Set *INSN_P to nullptr and return SET_SRC if SET_SRC is an
         integer constant.  */
       op = src;
+      if (mode != GET_MODE (reg))
+       op = gen_int_mode (INTVAL (src), mode);
       *insn_p = nullptr;
     }
   else
diff --git a/gcc/testsuite/gcc.target/i386/pr121497.c 
b/gcc/testsuite/gcc.target/i386/pr121497.c
new file mode 100644
index 000000000000..ce55f9558f04
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/pr121497.c
@@ -0,0 +1,18 @@
+/* { dg-do compile } */
+/* { dg-options "-O3 -msse2 -w" } */
+
+extern void a(int *);
+int q;
+void b(int c, int d, int e, int f, int g, int h) {
+  int t[] = {c, d, e, f, g, h};
+  a(t);
+}
+int main() {
+  int k[2], i = 0, *p();
+  if (q) {
+    for (; (int)p + i < 2; i++)
+      k[i] = -1294967296;
+    b(k[0] + 7, k[0] + 9, k[0] + 6, k[0] + 9, k[0] + 9, k[0] + 6);
+  }
+  return 0;
+}

Reply via email to