https://gcc.gnu.org/g:ab10e6697f941d4c6a70242dcf1db1db84484113

commit r17-428-gab10e6697f941d4c6a70242dcf1db1db84484113
Author: H.J. Lu <[email protected]>
Date:   Sat May 9 20:58:11 2026 +0800

    x86_cse: Convert vector load to constant integer load
    
    Convert vector load:
    
    (insn 14 465 412 3 (set (reg:SI 507 [ j_lsm.26 ])
            (const_int 2 [0x2])) "foo.c":10:12 discrim 2 100 {*movsi_internal}
         (nil))
    ...
    (insn 518 507 434 16 (set (reg:V2SI 493)
            (reg:V2SI 517)) 2066 {*movv2si_internal}
         (nil))
    
    to constant integer load:
    
    (insn 566 55 56 6 (set (subreg:DI (reg:V2SI 517) 0)
            (const_int 8589934594 [0x200000002])) -1
         (nil))
    ...
    (insn 518 507 434 16 (set (reg:V2SI 493)
            (reg:V2SI 517)) 2066 {*movv2si_internal}
         (nil))
    
    Tested on Linux/x86-64.
    
    gcc/
    
            PR target/125238
            * config/i386/i386-features.cc (ix86_broadcast_inner): Set kind
            to X86_CSE_CONST_VECTOR if the vector load can be converted to
            constant integer load.
    
    gcc/testsuite/
    
            PR target/125238
            * gcc.target/i386/pr125238.c: New test.
    
    Signed-off-by: H.J. Lu <[email protected]>

Diff:
---
 gcc/config/i386/i386-features.cc         | 21 +++++++++++++++++++++
 gcc/testsuite/gcc.target/i386/pr125238.c | 26 ++++++++++++++++++++++++++
 2 files changed, 47 insertions(+)

diff --git a/gcc/config/i386/i386-features.cc b/gcc/config/i386/i386-features.cc
index fe1baed3e9a2..b8d4f672da0a 100644
--- a/gcc/config/i386/i386-features.cc
+++ b/gcc/config/i386/i386-features.cc
@@ -3988,6 +3988,27 @@ ix86_broadcast_inner (rtx op, machine_mode mode,
          *insn_p = nullptr;
          return constm1_rtx;
        }
+
+      /* Check if we can convert:
+
+        (insn 14 465 412 3 (set (reg:SI 507 [ j_lsm.26 ])
+               (const_int 2 [0x2])) "foo.c":10:12 discrim 2 100 
{*movsi_internal} (nil))
+        ...
+        (insn 518 507 434 16 (set (reg:V2SI 493)
+               (vec_duplicate:V2SI (reg:SI 507 [ j_lsm.26 ]))) 2395 
{*vec_dupv2si} (nil))
+
+        to constant integer load:
+
+        (insn 566 55 56 6 (set (subreg:DI (reg:V2SI 517) 0)
+               (const_int 8589934594 [0x200000002])) -1 (nil))
+        ...
+        (insn 518 507 434 16 (set (reg:V2SI 493)
+               (reg:V2SI 517)) 2066 {*movv2si_internal} (nil))
+
+       */
+      if (GET_MODE_SIZE (orig_mode) <= UNITS_PER_WORD)
+       *kind_p = X86_CSE_CONST_VECTOR;
+
       *insn_p = nullptr;
     }
   else
diff --git a/gcc/testsuite/gcc.target/i386/pr125238.c 
b/gcc/testsuite/gcc.target/i386/pr125238.c
new file mode 100644
index 000000000000..4c8dafc5cdab
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/pr125238.c
@@ -0,0 +1,26 @@
+/* { dg-do compile } */
+/* { dg-options "-O3 -march=x86-64" } */
+
+extern void bar (const char *, int); 
+extern char a, b, d, e, k;
+extern int c, f, g, h, i, j;
+void
+foo (void)
+{
+  while (a) {
+    int *n = &h, *o = &g;
+    bar ("%d", f);
+    for (; c; c++) {
+      int *p = &j;
+      for (b = 0; b < 8; b++) {
+        e = a > 0 ? a : a << 1;
+        k = -e;
+        *n &= (k != *p);
+      }
+      for (; d; d++)
+        i || (*o = *p = 2);
+    }
+  }
+}
+
+/* { dg-final { scan-assembler "movabsq\[ \\t\]+\\\$8589934594, %r\[a-z0-9\]+" 
{ target { ! ia32 } } } } */

Reply via email to