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 } } } } */
