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
