https://gcc.gnu.org/bugzilla/show_bug.cgi?id=127114
Bug ID: 127114
Summary: i386: Bad convert-storm on roundf16 vectorization
Product: gcc
Version: 17.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: target
Assignee: unassigned at gcc dot gnu.org
Reporter: hongyuw at gcc dot gnu.org
Target Milestone: ---
For
void
round_hf_narrow (_Float16 *__restrict a, _Float16 *__restrict b, int n)
{
for (int i = 0; i < n; i++)
a[i] = (_Float16) __builtin_round (b[i]);
}
Compiled with -march=sapphirerapids -fno-trapping-math -fno-rounding-math -O2
Will get forced converting sequence to double, and truncate back like
.L4:
vmovdqu ymm0, YMMWORD PTR [rsi+rdx]
vmovapd ymm5, ymm3
vcvtph2psx ymm1, xmm0
vcvtps2pd ymm2, xmm1
vpternlogq ymm5, ymm2, ymm4, 234
vextractf32x4 xmm1, ymm1, 0x1
vextracti32x4 xmm0, ymm0, 0x1
vaddpd ymm2, ymm2, ymm5
vmovapd ymm5, ymm3
vcvtps2pd ymm1, xmm1
vcvtph2psx ymm0, xmm0
vpternlogq ymm5, ymm1, ymm4, 234
vaddpd ymm1, ymm1, ymm5
vmovapd ymm5, ymm3
vrndscalepd ymm2, ymm2, 3
vrndscalepd ymm1, ymm1, 3
vcvtpd2ps xmm2, ymm2
vcvtpd2ps xmm1, ymm1
vinsertf32x4 ymm2, ymm2, xmm1, 0x1
vcvtps2pd ymm1, xmm0
vpternlogq ymm5, ymm1, ymm4, 234
vextractf32x4 xmm0, ymm0, 0x1
vaddpd ymm1, ymm1, ymm5
vmovapd ymm5, ymm3
vcvtps2pd ymm0, xmm0
vpternlogq ymm5, ymm0, ymm4, 234
vaddpd ymm0, ymm0, ymm5
vrndscalepd ymm1, ymm1, 3
vrndscalepd ymm0, ymm0, 3
vcvtpd2ps xmm1, ymm1
vcvtpd2ps xmm0, ymm0
vinsertf32x4 ymm1, ymm1, xmm0, 0x1
vcvtps2phx xmm0, ymm2
vcvtps2phx xmm1, ymm1
vinserti32x4 ymm0, ymm0, xmm1, 0x1
vmovdqu YMMWORD PTR [rdi+rdx], ymm0
add rdx, 32
cmp rdx, r8
jne .L4
sal eax, 4
cmp ecx, eax
je .L9
See https://compiler-explorer.com/z/YGvYjnhG4