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

    <tr>
        <th>Summary</th>
        <td>
            [SDAG] Bad codegen for swapping two bits
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            missed-optimization,
            llvm:SelectionDAG
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          dtcxzyw
      </td>
    </tr>
</table>

<pre>
    Reproducer: https://godbolt.org/z/TfYGMoM9Y https://alive2.llvm.org/ce/z/SkfNm_
```
define i16 @src(i16 %v3) {
entry:
  %conv = zext i16 %v3 to i32
  %shl = shl i32 %conv, 15
  %shr = ashr i32 %conv, 15
  %or = or i32 %shl, %shr
  %conv2 = trunc i32 %or to i16
  ret i16 %conv2
}

define i16 @tgt(i16 %v3) {
entry:
  %0 = and i16 %v3, -32767
  %or = tail call i16 @llvm.bitreverse.i16(i16 %0)
  ret i16 %or
}
```
`recognizeBSwapOrBitReverseIdiom` converts `src` to `tgt`. But `llvm.bitreverse.i16` is expensive.
```
src: # @src
        movzx   eax, di
        shl     edi, 15
 shr     eax, 15
        or      eax, edi
        ret
tgt: # @tgt
        and     edi, 32769
 rol     di, 8
        mov     eax, edi
        and     eax, 3855
 shl     eax, 4
        shr     edi, 4
        and     edi, 3855
 or      edi, eax
        mov     eax, edi
        and     eax, 13107
        shr     edi, 2
        and     edi, 13107
        lea eax, [rdi + 4*rax]
        mov     ecx, eax
        and     ecx, 21845
        shr     eax
        and     eax, 21845
        lea eax, [rax + 2*rcx]
        ret
```

</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJykVV2P6jYQ_TWTF2uRM84HPOQBFnHVh9tKd_uyT5UTD-DWxMg2LMuvr5xA-FgWqaqFlJg5Z-ac8YCl93rVElWQzyCfJ3IX1tZVKjSH4-dHUlv1Wf2irbNq15ADMWXrELYexBRwAbhYWVVbE0bWrQAXR8DFn8v3Hz_tz8n7HVIavSccGbPfnNANnShv_yx_3_wFfA58CgU_fbqtoqVuiem0YJBx7xrAcbfBfC8AJwzKWY-kNrjPWK3bsYhobLtnIObsSIfABhoLlmmBV0C_Nh0uPrXAMxfwlaX5Dc51OBlfngFtj7MDyq9NBPU57iRihw1u1zZnuHWdyLQ4Qx0NBjrKqVnl_PTyoFlhFf5Ls3jvrFXsivLKXgSWRfnVWpDasEYacy7XHWytg6M9OU-jKH4ozwEnD6xYd-_j9vSh4I4au2r1kWZvH3L7h5vp8Kuv8JvSdgMFZ7Eh5IJnUHQTUvDYPCi6DhR8xGa7ELePFBacac_osKXW6z2NHsqIScWUAYrzEJ6s9Gtj98cDY4zkIXZM6dtwHKq4SOmbOYkzxC60y_z0y_bRc5ju0zoK_RfR5UVd3N3g4olelY_HeT4KZ3tlfWT8xdXT-kPePi7G-cWYuY5k9-1w13qy52ovWYd-9JGY_P_oTUXKy6fK8KmyB3xD8pwd8plTmgHOWAY4dfIA-fwbvc3hoZ-hXh_HdJzl3-j9liq_o95JlYdOKkapzVepw6jd_S4SVQk1EROZUJWWWOZlUQqRrKsc6zHPaq54neepSPNJWkhV5ss0bcbNUia6Qo4Zn-CEI-ZCjETKRSooG_OmLmSqIOO0kdoM90Wivd9RlaY845gYWZPx3aWFuNHek3qx26A3-iiDti0gAr4CYqSDmL6RoSYG5tMfMZbPE1fF2Eu9W_n476V98JdiQQfT3YlvkZDP2Uwq1lhFK2rZ0jrmP-R2q9sVCx-W1Tr4ZOdMdXc36rDe1aPGbgAXnZD-8bJ19m9qAuCiM-UBFydf-wr_DQAA__8wWAJT">