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