<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">