<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/107086>107086</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            [X86] Useless SIMD<->GPR transfers for f16 arithmetic
        </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>
    https://simd.godbolt.org/z/MfT8oe61d
```ll
define half @test_half_add(half %a0, half %a1) {
  %res = fadd half %a0, %a1
 ret half %res
}

define void @test_half_add_store(half %a0, half %a1, ptr %p0) {
  %res = fadd half %a0, %a1
  store half %res, ptr %p0, align 2
  ret void
}
```
Not only do we perform unnecessary transfers from/to the xmm registers, when we fail to fold the store into a vpextrw
```asm
test_half_add:                          # @test_half_add
        vpextrw $0, %xmm1, %eax
        vmovd   %eax, %xmm1
        vpextrw $0, %xmm0, %eax
        vcvtph2ps       %xmm1, %xmm0
        vmovd   %eax, %xmm1
        vcvtph2ps       %xmm1, %xmm1
        vaddss  %xmm0, %xmm1, %xmm0
        vcvtps2ph       $4, %xmm0, %xmm0
        vmovd   %xmm0, %eax
        vpinsrw $0, %eax, %xmm0, %xmm0
        retq
test_half_add_store:                    # @test_half_add_store
        vpextrw $0, %xmm0, %eax
        vpextrw $0, %xmm1, %ecx
        vmovd   %ecx, %xmm0
        vmovd   %eax, %xmm1
        vcvtph2ps       %xmm0, %xmm0
        vcvtph2ps %xmm1, %xmm1
        vaddss  %xmm0, %xmm1, %xmm0
        vcvtps2ph $4, %xmm0, %xmm0
        vmovd   %xmm0, %eax
        movw    %ax, (%rdi)
        retq
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJy0Vdtu4zYQ_RrqZRCDGl0sPegha9dFUWxR7LZA3wJKHFlsSVElacfZry90iRs7iVtsu4IBi5c5c87waCi8V_ueqGLZB5ZtI3EInXXVpx8_K2P7qLbyqepCGDxL7hnuGO68MnK1t7K2Oqys2zPcfWG4-9j-UljKY8n4lvF7lvP5p_U8IalVPUEndAss5YF8eBgHD0JKhsU8j5ngDDdwHsUMS2DrDzMGjHOOPLBkC62QEi7D5oh5q6NwXnXkF1br7fLyktPRKvmK04MP1tFNZhsYghsHA_9qmjCluWB6ibsBodW-B3wOGIWNjK8VPRd8Hv5kA9heP4G08EgwkGutM3Doe2rIe-GeIDjR-5ach9ZZw3AXLISO4GQMONorH8hNbB476keQVigNwUJrtZx2ztxVHywIOA50Cu7xio3wZp65PPDkHt59GCavHbKIn58lFTBMnwt6MiZeXkmcrrYbe5QT8LT2IuBfoPJ3UZtjGDoc_Jn2SxJT5Fex-CfY6_1CSu_hiu1tJmMKj0N3TpGmrwXfVHCzMIPq_WUdLwS_n8BR-PMNtyyf4tueecstS8B_Ot3bFmtuWKw5fRsP3DiY8_5v6pb_2SfGHh8Xdc-1KMYWKBXD8j1jnBtLJKtElkkpIqriNWZJjvE6jrqKeIkZz4uywEJg2iR1WSZxXeQ8LuoiE5GqkGPKS57EcZzH8apFmSHmkkRcJ1TWLOVkhNIrrY9mvOIi5f2BqpiveZFHWtSk_XRhItai-YP6saH9VuQMkeGGIRrlPck7OwRl1BcRlO3HtWwbuWoEvasPe89SrpUP_u80QQU93cQjVraFXz1p8h4-__Bxy5LNHUu--_7nTy8bt3XQxjkIp0JnKKgmOjh9dWHvVegO9aqZevyYa_m7G5z9nZrAcDfp8wx3i8RjhX8FAAD___EOO9o">