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

    <tr>
        <th>Summary</th>
        <td>
            [InstCombine] Missed combines for `(icmp (udiv exact x1, y) (udiv exact x2, y))`
        </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>
          Kmeakin
      </td>
    </tr>
</table>

<pre>
    InstCombine is able to optimize the `eq`, `ne`, `uge` and `ult` cases, but misses the `ugt` and `ule` cases (rust example: https://godbolt.org/z/jfPzcMsP3)

https://alive2.llvm.org/ce/z/WA-VaW
```llvm
define i1 @src1(i8 %x1, i8 %x2, i8 %y) {
  %div1 = udiv exact i8 %x1, %y
 %div2 = udiv exact i8 %x2, %y
  %ret = icmp eq i8 %div1, %div2
  ret i1 %ret
}

define i1 @tgt1(i8 %x1, i8 %x2, i8 %y) {
  %ret = icmp eq i8 %x1, %x2
  ret i1 %ret
}

define i1 @src2(i8 %x1, i8 %x2, i8 %y) {
  %div1 = udiv exact i8 %x1, %y
  %div2 = udiv exact i8 %x2, %y
  %ret = icmp ne i8 %div1, %div2
  ret i1 %ret
}

define i1 @tgt2(i8 %x1, i8 %x2, i8 %y) {
  %ret = icmp ne i8 %x1, %x2
  ret i1 %ret
}

define i1 @src3(i8 %x1, i8 %x2, i8 %y) {
  %div1 = udiv exact i8 %x1, %y
  %div2 = udiv i8 %x2, %y
  %ret = icmp ugt i8 %div1, %div2
  ret i1 %ret
}

define i1 @tgt3(i8 %x1, i8 %x2, i8 %y) {
  %ret = icmp ugt i8 %x1, %x2
  ret i1 %ret
}

define i1 @src4(i8 %x1, i8 %x2, i8 %y) {
  %div1 = udiv exact i8 %x1, %y
  %div2 = udiv exact i8 %x2, %y
  %ret = icmp uge i8 %div1, %div2
  ret i1 %ret
}

define i1 @tgt4(i8 %x1, i8 %x2, i8 %y) {
  %ret = icmp uge i8 %x1, %x2
  ret i1 %ret
}

define i1 @src5(i8 %x1, i8 %x2, i8 %y) {
  %div1 = udiv exact i8 %x1, %y
  %div2 = udiv exact i8 %x2, %y
  %ret = icmp ult i8 %div1, %div2
  ret i1 %ret
}

define i1 @tgt5(i8 %x1, i8 %x2, i8 %y) {
  %ret = icmp ult i8 %x1, %x2
  ret i1 %ret
}

define i1 @src6(i8 %x1, i8 %x2, i8 %y) {
  %div1 = udiv exact i8 %x1, %y
  %div2 = udiv i8 %x2, %y
  %ret = icmp ule i8 %div1, %div2
  ret i1 %ret
}

define i1 @tgt6(i8 %x1, i8 %x2, i8 %y) {
  %ret = icmp ule i8 %x1, %x2
  ret i1 %ret
}
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzMVk1vozAQ_TXDxUpkxpiPA4e0EdJqVamn7ZkPh7hrIMUmavvrVzakTapG2mXZVSXUjvGb8bw3OHq51rJuhUiB3wDfevlg9l2ffm9E_lO2XtFVL-m3VpvbrilkK4jUJC-UIKYj3cHIRr4KYvaCQEjFE4QU8NbGrXiPh9ouSN5WbqWMXZW5FtoCisGQRmot9KnOUJsLvHjDE8C4H7Qh4jlvDkoA25C9MQcNbAOYAWZ1VxWdMuuurwGzV8DscXf_Wt7pewaYAN0C3Yx_L_NyJY8C10odmym3FFOBh83qR_4wpYZ0fCxwfFWJndPFJxBQ3Zc-YCxjAsiffctvivE9fgFMCEQ3Yz6xryp59AmwLRkqebTsSkPOi7isET6i8QoaP6Bt3Avj0LJsDkQ8TVB75AS29U54C7ZcXNpEOtqeC3dB2NRmFuHPe3oj-zy3H92X-I8H8LcTsL0uO4FZjD_vaZEJsP8-gd_VfqjN0uLPInulqUXUD7749z_Ui1-AWZSvNLXIDPhXn4Fa_B7MonylqUVmEH7dXyG1-A2YRfZKU3-q_skTeVXKqoQluSdSP8IQGeOMefs0jIKqSOguKngZVhwDP2asoHHix6zYRejJFCkGNPGZz_yYszUXZVhQpJxGwo9ZAgEVTS7Vm0HzpNaDSH0ac554Ki-E0s7CIjprxjay1aYcTSug1QEQnc-sVpNxzY3sWrvHt16f2rRVMdQaAqqkNvr9LCONcgb5zAgD35I7V45Mp2iy63ribG_sFAWMz76iUdVxCpcbeNqwT0i9oVfpB1crzX4o1mXXAGaO3_hvdei7R1EawMzpoQGzSZJjir8CAAD__87eI9o">