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

    <tr>
        <th>Summary</th>
        <td>
            [InstCombine] Missed optimization with cmp+switch
        </td>
    </tr>

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

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

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

<pre>
    Alive2: https://alive2.llvm.org/ce/z/x8aCLE
```
define i8 @src(i32 %a, i32 %b) {
  %res = call i8 @llvm.ucmp.i8.i32(i32 %a, i32 %b)
  switch i8 %res, label %bb1 [
    i8 -1, label %bb2
    i8 0, label %bb2
 ]

bb1:
  ret i8 1

bb2:
  ret i8 2
}

define i8 @tgt(i32 %a, i32 %b) {
  %cmp = icmp ugt i32 %a, %b
  br i1 %cmp, label %bb1, label %bb2

bb1:
  ret i8 1

bb2:
  ret i8 2
}
```

This pattern exists in some rust applications.

cc @Poseydon42 @nikic 

</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJysU8uOnDAQ_JrmYg0ybWDgwGF2CFKkRMohP2AbL3TCS9js6-sje0iybLJSDpGQsd1VZbpwSWupm4ypILuDrI7k5vp5rVqnn16eHyM1t8_VZaAHgyAurHdusSAugA1gI8N-PAwPYzyvHWCjDWDzAtg8FfL66QPwGvgFcr4_Ydmae5oMo4JByu2qAQsSyAAzCXhl-1wBlgzOdzcO81ursQxEzbQchp0ejt70uMRUxCTwfa2fOvaRnO4DPSh62CCVGQJQJcz7sGOZh52SNxA8lPk7VcjqvfswKpV423bmapznJkcE_onY1eB8EDs46Dr3zw7qcQkOkp9snWOvaYGyY9XKKNkZbx36e8P_t83jjbmNX3uybJHOmXVi5omss4wmZufRsHWzjsllGUhLR_Nk49dMrb1RX2Zrntt5StGvJvpOmt3qUVuJthSljEyVnDEVSS7yMuqrUutcannPkWMpklLwVLdZUSolWuRnHlGFHFNeIPIizXkZG54aqdokwbxMubiHlJtR0vArJBFZu5kq4VkuMAo-2pA9RA8BcaHJOj2PiiYDiIBXQBzJWtOe5sXRSC-hRV_L6mitPO2kts76PHhXfp_lyA0h2R8n6667Zlazz0GOvZZjj-R6Fn733S0j0bYO1THwHbl-U7GeR8AmfO7tdVrW-ZvRDrAJ7VnAZu_wocIfAQAA__9jYDkE">