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