]> git.ipfire.org Git - thirdparty/gcc.git/commit
x86_cse: Add X86_CSE_CONST_VECTOR
authorH.J. Lu <hjl.tools@gmail.com>
Thu, 30 Apr 2026 01:21:27 +0000 (09:21 +0800)
committerH.J. Lu <hjl.tools@gmail.com>
Fri, 8 May 2026 03:41:33 +0000 (11:41 +0800)
commit12e4a2acda8da558010c9962f96b3167aee21072
treecec558fc925452472987393cfbc456386f3d22ca
parentd2558e55a6eb3baf204b6f67bd19b74bac967ec4
x86_cse: Add X86_CSE_CONST_VECTOR

Add X86_CSE_CONST_VECTOR for native CONST_VECTOR:

(insn 25 23 234 4 (set (reg:V16QI 135)
        (const_vector:V16QI [
                (const_int -1 [0xffffffffffffffff]) repeated x16
            ])) "bar-2.c":10:16 discrim 67584 2453 {movv16qi_internal}
     (nil))

and constant integer load:

(insn 280 8 279 2 (set (subreg:HI (reg:V2QI 172) 0)
        (const_int -1 [0xffffffffffffffff])) -1
     (nil))
...
(insn 110 39 194 9 (set (reg:V2QI 147)
        (reg:V2QI 172)) 2089 {*movv2qi_internal}
     (expr_list:REG_EQUAL (const_vector:V2QI [
                (const_int -1 [0xffffffffffffffff]) repeated x2
            ])
        (nil)))

converted from

(insn 111 87 121 18 (set (reg:V2QI 147)
        (mem/u/c:V2QI (symbol_ref/u:DI ("*.LC0") [flags 0x2]) [0  S2 A16])) 2089 {*movv2qi_internal}
     (expr_list:REG_EQUAL (const_vector:V2QI [
                (const_int -1 [0xffffffffffffffff]) repeated x2])
        (nil)))

1. Use CONST_VECTOR in REG_EQUAL note to avoid DF chain.
2. Keep constant integer load when crossing a function call since it is
faster than save and restore an integer register.
3. Convert CONST_VECTOR load no larger than integer register to constant
integer load even if there is no redundant CONST_VECTOR load.

Tested on Linux/x86-64.

gcc/

PR target/125100
* config/i386/i386-features.cc (x86_cse_kind): Add
X86_CSE_CONST_VECTOR.
(redundant_pattern): Add dest_mode.
(ix86_place_single_vector_set): Handle X86_CSE_CONST_VECTOR.
Generate SUBREG for constant integer source.
(ix86_broadcast_inner): Add an INSN argument.  Use CONST_VECTOR
in REG_EQUAL note.  Set load kind to X86_CSE_CONST_VECTOR for
native and converted CONST_VECTORs.  Return CONST_VECTOR if it
can be converted to constant integer load.
(pass_x86_cse::candidate_vector_p): Add an INSN argument and
pass the insn to ix86_broadcast_inner.
(pass_x86_cse::x86_cse): Add a basic block bitmap for calls.
Pass the insn to candidate_vector_p.  Handle X86_CSE_CONST_VECTOR.
Set dest_mode.  Keep constant integer load when crossing a
function call.  Convert CONST_VECTOR load no larger than integer
register to constant integer load even if there are no redundant
CONST_VECTOR loads.

gcc/testsuite/

PR target/125100
* gcc.target/i386/pr125100-1.c: New test.
* gcc.target/i386/pr125100-2.c: Likewise.
* gcc.target/i386/pr125100-3.c: Likewise.
* gcc.target/i386/pr125100-4.c: Likewise.

Signed-off-by: H.J. Lu <hjl.tools@gmail.com>
gcc/config/i386/i386-features.cc
gcc/testsuite/gcc.target/i386/pr125100-1.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/pr125100-2.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/pr125100-3.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/pr125100-4.c [new file with mode: 0644]