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