On Fri, May 8, 2026 at 6:14 AM H.J. Lu <[email protected]> wrote:
>
> Here is the v3 patch to reject CONST_VECTOR in REG_EQUAL note
> when the CONST_VECTOR mode isn't the same as the dest mode:
>
> (gdb) call debug (insn)
> (insn 7 5 12 2 (set (subreg:V8SI (reg:V4DI 100) 0)
>         (vec_duplicate:V8SI (reg:SI 102)))
> "/export/gnu/import/git/gitlab/x86-gcc-test/gcc/testsuite/gcc.target/i386/pr40957.c":16:10
> discrim 2 9361 {vec_dupv8si}
>      (expr_list:REG_DEAD (reg:SI 102)
>         (expr_list:REG_EQUAL (const_vector:V4DI [
>                     (const_int -1 [0xffffffffffffffff]) repeated x4
>                 ])
>             (nil))))
> (gdb)
>
> It happens since V4DI CONST_VECTOR is supported in AVX2, not AVX.
>
> Tested on Linux/x86-64.
Ok.
>
> --
> H.J.
> ---
> 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.
>
> 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.



-- 
BR,
Hongtao

Reply via email to