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

    <tr>
        <th>Summary</th>
        <td>
            Missed optimization in InstCombine: replace usub with or
        </td>
    </tr>

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

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

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

<pre>
    When you have usub instructions chained by overflow (borrow) flag (e.g. for big integer "less than") you can replace all except one usubs with or.

```llvm
define i1 @src(i64 %0, i64 %1, i1 %2) {
  %4 = zext i1 %2 to i64
  %5 = call { i64, i1 } @llvm.usub.with.overflow.i64(i64 %0, i64 %4)
  %6 = extractvalue { i64, i1 } %5, 1
  %7 = zext i1 %6 to i64
  %8 = call { i64, i1 } @llvm.usub.with.overflow.i64(i64 %1, i64 %7)
  %9 = extractvalue { i64, i1 } %8, 1
  ret i1 %9
}

define i1 @tgt(i64 %0, i64 %1, i1 %2) {
  %4 = or i64 %1, %0
  %5 = zext i1 %2 to i64
  %6 = call { i64, i1 } @llvm.usub.with.overflow.i64(i64 %4, i64 %5)
  %7 = extractvalue { i64, i1 } %6, 1
  ret i1 %7
}

declare { i64, i1 } @llvm.usub.with.overflow.i64(i64, i64)
```
https://alive2.llvm.org/ce/z/yhrBrK
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJytlEtvozAQgH8NXKwizDM-cGgbVVqt9rxnYwbwysGRbZImv37HDk1Jt62qVSVC7Hl-njHT6u7U_B5hIic9k5EfgMx2bomcrDOzcFJPloiRywk60p6IPoDplT6SKNu02hh9jDJGesUHL4FkSEivDWnlgCEcDGBQnimwlriRT7j29j6X4BMxsFdcAOFKEXgWsHdETxcCS47SjUSbJEq3UXq_vKv08ih12F1EHfQIRyQlUZFaIxBDVgVmLdMoeyTLmoY19ctAENUPF3fiRWiSb8kZnt2LDXHau65symAjPCo6B-USst761J4o8eSJB09eCpUEw_eQUMxW8asQHxEMF-7A1Qzv5UEOv6Urx_otfPUv_OY74OkKvr6FZ1-E39zAG3hBXmKh1brbN611g_v_1uKVXFuHCG9b-3n7q--oYLHCLm8rWH-xgtUHFaw_qKBQ3Lwb6gvIC-0V9Pr1Xbajc3sb5fdR9oQPV_IAWRKCajOgRAC-zvg7jebB_IyhoVXJKjx6SuOuyTuWMx476RQ0v6S1OGH03smdPHM_d3CAkB84hh71rsVrgImu8yKMqGU-xLNRzS3KgBo8ldA73IRJcfm72xv9BwTeoydMN4PFRVmxrIrHRvCizyhuup5RoKwtuqJiLUBX5CAoxIq3oGwTlQ9-oPmg-f0a14bZ9khetX6GigX-qtuFg96tPb2y3MayydIsSzdpQcu0KDcJcCoEY2nN8yJjPcOWwY5Lda1xbJpwrHYerO-ntM6-Krm1cpgAAjLG57MbtWnE2HPr4lCAJpz-L4AesLc">