<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/234131>234131</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[X86] Poor v8f16 fadd handling on non-vlx avx512fp16 targets
</td>
</tr>
<tr>
<th>Labels</th>
<td>
backend:X86,
missed-optimization
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
RKSimon
</td>
</tr>
</table>
<pre>
Similar for fsub/fmul/fdiv and v16f16 types as well.
```ll
define <8 x half> @add_v8f16(<8 x half> %a, <8 x half> %b) {
%res = fadd <8 x half> %a, %b
ret <8 x half> %res
}
```
llc -mattr=+avx512fp16,+avx512vl
```s
vaddph %xmm1, %xmm0, %xmm0
```
Legal
llc -mattr=+f16c
```s
vcvtph2ps %xmm1, %ymm1
vcvtph2ps %xmm0, %ymm0
vaddps %ymm1, %ymm0, %ymm0
vcvtps2ph $4, %ymm0, %xmm0
vzeroupper
```
Promotion
llc -mattr=+avx512fp16
```s
vpsrldq $14, %xmm1, %xmm2 # xmm2 = xmm1[14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
vpsrldq $14, %xmm0, %xmm3 # xmm3 = xmm0[14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
vaddsh %xmm2, %xmm3, %xmm2
vpshufd $255, %xmm1, %xmm3 # xmm3 = xmm1[3,3,3,3]
vpshufd $255, %xmm0, %xmm4 # xmm4 = xmm0[3,3,3,3]
vaddsh %xmm3, %xmm4, %xmm3
vpunpcklwd %xmm2, %xmm3, %xmm2 # xmm2 = xmm3[0],xmm2[0],xmm3[1],xmm2[1],xmm3[2],xmm2[2],xmm3[3],xmm2[3]
vpsrldq $10, %xmm1, %xmm3 # xmm3 = xmm1[10,11,12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
vpsrldq $10, %xmm0, %xmm4 # xmm4 = xmm0[10,11,12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
vaddsh %xmm3, %xmm4, %xmm3
vshufpd $1, %xmm1, %xmm1, %xmm4 # xmm4 = xmm1[1,0]
vshufpd $1, %xmm0, %xmm0, %xmm5 # xmm5 = xmm0[1,0]
vaddsh %xmm4, %xmm5, %xmm4
vpunpcklwd %xmm3, %xmm4, %xmm3 # xmm3 = xmm4[0],xmm3[0],xmm4[1],xmm3[1],xmm4[2],xmm3[2],xmm4[3],xmm3[3]
vpunpckldq %xmm2, %xmm3, %xmm2 # xmm2 = xmm3[0],xmm2[0],xmm3[1],xmm2[1]
vpsrlq $48, %xmm1, %xmm3
vpsrlq $48, %xmm0, %xmm4
vaddsh %xmm3, %xmm4, %xmm3
vmovshdup %xmm1, %xmm4 # xmm4 = xmm1[1,1,3,3]
vmovshdup %xmm0, %xmm5 # xmm5 = xmm0[1,1,3,3]
vaddsh %xmm4, %xmm5, %xmm4
vpunpcklwd %xmm3, %xmm4, %xmm3 # xmm3 = xmm4[0],xmm3[0],xmm4[1],xmm3[1],xmm4[2],xmm3[2],xmm4[3],xmm3[3]
vaddsh %xmm1, %xmm0, %xmm4
vpsrld $16, %xmm1, %xmm1
vpsrld $16, %xmm0, %xmm0
vaddsh %xmm1, %xmm0, %xmm0
vpunpcklwd %xmm0, %xmm4, %xmm0 # xmm0 = xmm4[0],xmm0[0],xmm4[1],xmm0[1],xmm4[2],xmm0[2],xmm4[3],xmm0[3]
vpunpckldq %xmm3, %xmm0, %xmm0 # xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1]
vpunpcklqdq %xmm2, %xmm0, %xmm0 # xmm0 = xmm0[0],xmm2[0]
```
Probably should widen to vaddph %zmm1, %zmm0, %zmm0
llc -mattr=+avx512fp16,+f16c
```s
vpsrldq $14, %xmm1, %xmm2 # xmm2 = xmm1[14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
vpsrldq $14, %xmm0, %xmm3 # xmm3 = xmm0[14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
vaddsh %xmm2, %xmm3, %xmm2
vpshufd $255, %xmm1, %xmm3 # xmm3 = xmm1[3,3,3,3]
vpshufd $255, %xmm0, %xmm4 # xmm4 = xmm0[3,3,3,3]
vaddsh %xmm3, %xmm4, %xmm3
vpunpcklwd %xmm2, %xmm3, %xmm2 # xmm2 = xmm3[0],xmm2[0],xmm3[1],xmm2[1],xmm3[2],xmm2[2],xmm3[3],xmm2[3]
vpsrldq $10, %xmm1, %xmm3 # xmm3 = xmm1[10,11,12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
vpsrldq $10, %xmm0, %xmm4 # xmm4 = xmm0[10,11,12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
vaddsh %xmm3, %xmm4, %xmm3
vshufpd $1, %xmm1, %xmm1, %xmm4 # xmm4 = xmm1[1,0]
vshufpd $1, %xmm0, %xmm0, %xmm5 # xmm5 = xmm0[1,0]
vaddsh %xmm4, %xmm5, %xmm4
vpunpcklwd %xmm3, %xmm4, %xmm3 # xmm3 = xmm4[0],xmm3[0],xmm4[1],xmm3[1],xmm4[2],xmm3[2],xmm4[3],xmm3[3]
vpunpckldq %xmm2, %xmm3, %xmm2 # xmm2 = xmm3[0],xmm2[0],xmm3[1],xmm2[1]
vpsrlq $48, %xmm1, %xmm3
vpsrlq $48, %xmm0, %xmm4
vaddsh %xmm3, %xmm4, %xmm3
vmovshdup %xmm1, %xmm4 # xmm4 = xmm1[1,1,3,3]
vmovshdup %xmm0, %xmm5 # xmm5 = xmm0[1,1,3,3]
vaddsh %xmm4, %xmm5, %xmm4
vpunpcklwd %xmm3, %xmm4, %xmm3 # xmm3 = xmm4[0],xmm3[0],xmm4[1],xmm3[1],xmm4[2],xmm3[2],xmm4[3],xmm3[3]
vaddsh %xmm1, %xmm0, %xmm4
vpsrld $16, %xmm1, %xmm1
vpsrld $16, %xmm0, %xmm0
vaddsh %xmm1, %xmm0, %xmm0
vpunpcklwd %xmm0, %xmm4, %xmm0 # xmm0 = xmm4[0],xmm0[0],xmm4[1],xmm0[1],xmm4[2],xmm0[2],xmm4[3],xmm0[3]
vpunpckldq %xmm3, %xmm0, %xmm0 # xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1]
vpunpcklqdq %xmm2, %xmm0, %xmm0 # xmm0 = xmm0[0],xmm2[0]
```
The +avx512fp16,+f16c target should be able to fallback to promotion
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJzsWUuvozYU_jVmYyXykxsWLPJoNu1i1Omiu8pgE-iYx2Dg5ubXVyYvE0jmXmmmVUeREgE6x-ec7_Pn6BMRxmS7QqkQ8BXgG0-0TVrW4e-_fs7ysvCiUr6Fn7M806KGSVnDxLQRINskb7W9yKyDopCww36Cfdi8VcpAYeCr0noO0NJ-fHT8aA3QUqokKxQEdL2Ae5gKnQD6CwQMCSn_6hYJ9gFZ3EYJF4CsR4sIjwAJIHhZAbSE9rlWBgK6gYmQciL9WMUuQ0tYq2YipVbGzvyycSc_AtE6hrNcNE0N6AaQlej2HJOksiOvL8-ddlfaYrATUlaprb7Pc3yaYZ_nyL0dtvtN7YSebptgPx61gF3cNVVKKnPT5s3eTiWgawI6JtgpzWWNEx0m9oUM6QExNs7bXwoeVF22VaXqG3Cf6jIvm6wsvsnrGGZlai2_2taYXRs6pBIICIXHG7qBfZCv-mTMAd8AsrZz_ciLJWl6Tocjep6TnudE_8WcQkpzliZxpnMIPROftom0gAjnk8yPEVnmbaXrl28eVnP4YedqzOVnupoLwpmcuXiObduiir_oV_kY8UhCFPAVOm5Kv8p9sjE8iOFBjAxiZBCjg5hLz0U96ANc98nYpmGLDFtM311RN-pGH9i9f22-dwvCyrDqdYgnecaPIPWUA7JGl32bLDfNED-X4wOGBuVcGM7s3EU0qes7mEeiYSMlX5_YSMl4ECN3VM4GuqZDXR_n7KXzg8_f5Rz1MmWL6WP0IA2NWH6nqrq87Ewq2-ojGsKjH7WbKu-SzrjKTychF9D0IWPOb2h_FP07R_t-2q2XeUdXNE0jmqQRnWlE0zSiBzSiBzSiBzSihyeRToMazYkebDea3m6339epo_-BhpejP3KUkYj0GzRp2WoJXzOpCtiUjvU-XDfucG15OFnvb7v7O7b76UeffvTpR59-9OlH_49m4ulHn3706UeffvR7-9E_UgXveEjYiHqnmrNTjRQUkVbWqyZC60jEX-x95bwi9WRIZUAD4akQvwSEB4gz5KUhCjgjScyDAFPOlFpQFJOYMxUQP4n9yMtCgoiPEcEoYJSjuZJJJKj_4keLII7QAjCkcpHpudZdPi_rnZcZ06qQUIYp9rSIlDb9XwOE2NFUIQFd_rnwASE9JJJnxig5K6smy7OD6Ecmdsu9OrRFZ1G7M4AhnZnGXNs0WaP7_xxsLb6Bn8qyhv3r_-O7-1QUUmfFDpYFLMpi1uk9vLJ54tB4ba3DtGkqA-gSkC0g213WpG00j8sckK1td7rMqrr8W8UNINseogFke0LZheSfAAAA___ovubs">