https://gcc.gnu.org/bugzilla/show_bug.cgi?id=115021
Bug ID: 115021 Summary: [14/15 regression] unnecessary spill for vpternlog Product: gcc Version: 14.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: rtl-optimization Assignee: unassigned at gcc dot gnu.org Reporter: liuhongt at gcc dot gnu.org Target Milestone: --- typedef signed char v16qi __attribute__ ((__vector_size__ (16))); v16qi foo (v16qi x) { return x >> 5; } with -march=x86-64-v4 -O2, GCC 13.2 generates foo(signed char __vector(16)): mov eax, 4 vpsraw xmm2, xmm0, 5 vpbroadcastb xmm1, eax mov eax, 7 vpbroadcastb xmm3, eax vmovdqa xmm0, xmm1 vpternlogd xmm0, xmm2, xmm3, 120 vpsubb xmm0, xmm0, xmm1 ret GCC 14.1 generates foo(signed char __vector(16)): mov eax, 67372036 vpsraw xmm2, xmm0, 5 vpbroadcastd xmm1, eax mov eax, 117901063 vpbroadcastd xmm3, eax vmovdqa xmm0, xmm1 vmovdqa XMMWORD PTR [rsp-24], xmm3 vpternlogd xmm0, xmm2, XMMWORD PTR [rsp-24], 120 vpsubb xmm0, xmm0, xmm1 ret There's extra spill.