<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/84605>84605</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
Missed optimization: redundant conversion to bool when the value is already in valid bool range
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
YanWQ-monad
</td>
</tr>
</table>
<pre>
For the IR
``` llvm
define i1 @src(ptr %x) {
%1 = load i8, ptr %x, align 1
%2 = icmp ult i8 %1, 2
br i1 %2, label %bb1, label %bb2
bb2:
%3 = tail call i1 @dynamic()
br label %bb3
bb1:
%4 = icmp eq i8 %1, 1
br label %bb3
bb3:
%5 = phi i1 [ %4, %bb1 ], [ %3, %bb2 ]
ret i1 %5
}
declare i1 @dynamic()
```
which generates the following instructions in x86 (https://godbolt.org/z/hY5EjobTv):
``` asm
src: # @src
movzx eax, byte ptr [rdi]
cmp al, 2
jae dynamic@PLT # TAILCALL
cmp al, 1
sete al
ret
```
The conversion of `eax` to `bool` is redundant after `jae`, we can directly `ret` (`eax`) as `eax` is already in valid bool range [0, 1].
---
This issue is extracted from rust-lang/rust#121673.
I tried to implement this optimization in IR by folding `icmp eq %x, 1` to `trunc %x to i1` in #83829, but it doesn't work well, since InstCombine would canonicalize `trunc` to `(X & 1) != 0`, which results in one more `and` instruction in backend.
So, I am going to implement this optimization in backend. Please let me know if there is a better way to address this issue.
If possible, please assign this issue to me, thanks.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJyMVV-P4jYQ_zTmZQRynD-QBx52lyIhbaXrdaX2Hp14IN51bGo7sOynr8aBBU7t3VkowZ7Jb_79ZixD0DuLuGTlIytXEznEzvnlN2n_-mPaOyvVpHHqtFw7D7FD2HxlfMX4A6v4-ANjDv14pnCrLYLOgBU8-JaJxT56YKJ8Z6IGNn8c9YCOMmD5CoyTCvSCiSe4qj6BNHpnIbtRF0ldt_0eBhNBLxIG6YqLVuOTaVEKOjayQUO7psm-25-_GJ-0zR9uLOXJUpTaQCuNOYejTlb2mkJior6xeAOb38Nm97DFNQD859b_7JfQ8nu0MqHtO53cKx-TBUIbAwZWrtJulOSfEpEkZxyP8Zyx8mxsvrq1qrA10uP_Z-CTBOP22Om2gx1a9DJiSHzZOmPcUdsdaBuiH9qonQ2gLbwvKmBi0cW4DxScWDOx3jnVOBNnzu-YWH8wse6-lb-9uublQFYvObiyT4Yz-Yhv-QP8wmIivxD0nIhx9e7w8Q4AKBMHm1PEkZTlo1f6Jm_jokrSkuaOheN6lZjel6QV_MvzS7L88rB5fnp4fv4RWHYvDBjxLBzPPcb_LMD4fOkQWmcP6IN2FtwWWMUpqIpDdLRpnDO00wE8qsEqaSPIbURP0leJhCie4IjQSgtKe2yjOZGQTFecCvcJSr0tw40RHUAaj1KdqM4HabQCMgle2h1SPvkYZbma3To-nU7v49ABdAgDEiK-Ry_biAq23vXghxCnRlqiCf1nIs9EVs3zO8QNRK9RUdi63xvs0UaIhOv2Uff6QxIdycvNV2hOxFZFXGUVv3TqZSRl1_RFP9g2CRJwkmhL1V3kC1En8gwRdATlMFgm5hGOzr_BEU2qb9C2RdjYEJ9c39DMPLrBKEq2s7qVRn_gp6GrXSYWfwMTFWRpnIqMZgC_1Co1n8cwmJj6y1mE3vkEJK0anfxsQdJoZPuGVt1l7E9HYBuQPewcpeLnqbvAwBeDMiAYjNAjvFl3BL2lKeBTBSU0GIljR3kiWKmUxxBG0FTnsyebLexdCLoxmC6GEXa8qW60CaNPGrGT9i3MJmqZqzqv5QSX2ZzXdZVXRTHplm3FebNY1HM-r5t5jeW24arMeFUJJbOsnuil4KLgOa95WRa8mHEp1HxeFEUl2229lazg2EttZnTb0XSaJBeWi6Li5SSN7ZCuUCEsHkf_mBB0o_olfTNthl1gBTc6xHBFiToaXP6uQ0B1l1iaZdfevGnn6MZeOnZo04Q9SDN2yA96bjJ4s_xu0urYDc2sdT0T63SHj6_p3rtXbCMT6xRFYGKdovw3AAD__6naXLA">