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.

-- 
H.J.
From ae6f62258caabc3ded79fd68b9d57d4707064ec1 Mon Sep 17 00:00:00 2001
From: "H.J. Lu" <[email protected]>
Date: Sat, 9 May 2026 20:58:11 +0800
Subject: [PATCH] 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]>
---
 gcc/config/i386/i386-features.cc         | 21 +++++++++++++++++++
 gcc/testsuite/gcc.target/i386/pr125238.c | 26 ++++++++++++++++++++++++
 2 files changed, 47 insertions(+)
 create mode 100644 gcc/testsuite/gcc.target/i386/pr125238.c

diff --git a/gcc/config/i386/i386-features.cc b/gcc/config/i386/i386-features.cc
index 021460e1ff1..443498b6d74 100644
--- a/gcc/config/i386/i386-features.cc
+++ b/gcc/config/i386/i386-features.cc
@@ -3989,6 +3989,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 00000000000..4c8dafc5cda
--- /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 } } } } */
-- 
2.54.0

Reply via email to