[Bug target/126098] ICE in extract_insn, at recog.cc:2888 mavx512vnni, autovectorized
cvs-commit at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Mon Jul 6 02:28:25 GMT 2026
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=126098
--- Comment #2 from GCC Commits <cvs-commit at gcc dot gnu.org> ---
The master branch has been updated by hongtao Liu <liuhongt@gcc.gnu.org>:
https://gcc.gnu.org/g:5be7b70e769e6e992dbf631cd37e24bd9da9e05e
commit r17-2161-g5be7b70e769e6e992dbf631cd37e24bd9da9e05e
Author: liuhongt <hongtao.liu@intel.com>
Date: Fri Jul 3 06:46:32 2026 -0700
i386: Enable 512-bit byte dot-product only under AVX512BW [PR126098]
The byte sdot_prod/udot_prod expanders used the VI1_AVX512VNNIBW
iterator, which enabled V64QI under AVX512BW || AVX512VNNI. But VNNI
has no same-sign byte instruction (VPDPBUSD is mixed-sign, i.e. usdot),
so the same-sign byte case always emulates via vec_unpacks/vec_unpacku,
and for V64QI that widening is vpmov[sz]xbw, which needs AVX512BW. With
-mavx512vnni alone the optab was offered but couldn't be emulated:
(set (reg:V32HI) (sign_extend:V32HI (reg:V32QI)))
fails to match, ICEing in extract_insn during vregs.
Use the VI1_AVX512 iterator instead (V64QI under AVX512BW), matching the
sibling usdot_prod, and drop VI1_AVX512VNNIBW. The word sdot_prod uses a
separate iterator (VI2_AVX512VNNIBW) and is left unchanged: its V32HI VNNI
path is vpdpwssd on the 16-bit inputs directly, so no widening is needed.
gcc/ChangeLog:
PR target/126098
* config/i386/sse.md (VI1_AVX512VNNIBW): Remove.
(sdot_prod<ssedvecmodelower><mode>): Use VI1_AVX512 instead of
VI1_AVX512VNNIBW so V64QI is enabled only under AVX512BW.
(udot_prod<ssedvecmodelower><mode>): Likewise.
gcc/testsuite/ChangeLog:
PR target/126098
* gcc.target/i386/pr126098.c: New test.
More information about the Gcc-bugs
mailing list