<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=http://email.email.llvm.org/c/eJy1VduO4zYM_RrnRYjhSzyJH_yQmewu-lAUKAZo92kh23KshWwZuuQyX99DOZnJTHaLFkUDxzZFkTwiD-lat-dKT4413hgxOnVmrRZ2jLK1Y3KYjD4I5nppGR_PrPPG9cJE2RPElkmY6WGSSljmrRz3jLPoIRm8wp1F-VPv3GSjfBtln3EpdRjivW5rrVyszR5LL_iX7ZcvQvyx1lH-KUp2UbKF9XyRxbzUik6OgsmHFYtWSad1lG1IGLUfoWNRVpyirGTR-nE2YLSUAsSOOS4Va7hSpCUXhF9Ct96RswDLA3R8lK6PcWDTKX2Mw8YQZHb-FKIvU4S5CZGFEOLkDG_cgSsvfhQFUEhMbgzzf2OY3hiugqEVSjQu7IOvW3TzG0G7GhnhrmurS4bXuw-pvojh_owaCzDAIr1sFKJlTjOg9MjhmRk_ghHcMaTMyUnJhjupxyh_xLJAMIt1BsZ899YRH-hYy5DAEyCkhD6h0xFJOqOHYAbhvgZYjG-BPRI7iWcUnxxqoiOSKK2jZRBZDvIl4LHsqL1qWa8n0XkCjr0jsyC1kl2QwOexob2MyEELR04Rjjig_l-oKJthYlfjC6uSOzZZsOJS2ZRST5y4L2X2T0q5XC5vxd-pJEagrdGV9x1qoP5Bh37Szy_PX_Ov5X2HzuLka9aNbM7FiVxjHLwIysISNrN0mxDGTrHlzhtOdftGEyPbzDbAkm9_3f752mZvBwx3ceKo4GUfRcy3b17pN-hDeBoe0mta-RN9E_TL9IPaq1f1O0UDQ33j96MepfmbQvxWH6T2NtBQXrlZC2bR_-NeYJC2gmp9NNIJ1kqD7lZnClR7FyYtH1nPpwkc5p0D6-Wo5EisPxKvaRD70ARR8YjYv2ALd9rMeaLMfuvl6AhVsUOy3xe-1U1MxV8qgLlU3roWd6DBvP8MlNLFV6dx7wZULB-E63Ubv3nPShsv2ipvy7zkC-6hNpVttHNDMyy8UdX7uHt0u69jgL98Hy6PJRj6HRkgANZ6YfFSrJIiX_TVapOINC-LvKsfsjQr1-t1WXRr3q2yNi3azULxWihbUR6ybBRHFlzgHSdf_HcEssqSjK5VssnyPI3zYpOkm6ZpHsqiSVYCU0EM-ObE4cuCZC5MFVzWfm_pg4NpZd-U3Fq5x5QNgIHQSacg_GQesvpMsxKsxbvtA41eZxqn-UVz7P1oXoQTVAH-XwMxV5g>54053</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            `umul.with.overflow` by `-1` should simplify away the multiplication
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            new issue
      </td>
    </tr>

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

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

<pre>
    opt currently doesn't improve this any further, and it compiles using a `mul` <https://llvm.godbolt.org/z/9dGGeeW7o>
```llvm
define i64 @foo(i64 noundef %x) {
  %1 = tail call { i64, i1 } @llvm.umul.with.overflow.i64(i64 %x, i64 -1)
  %2 = extractvalue { i64, i1 } %1, 0
  %3 = extractvalue { i64, i1 } %1, 1
  %4 = select i1 %3, i64 -1, i64 %2
  ret i64 %4
}
```

There's no need to actually run that multiplication; the result is just `{ -x, x != 0 }` from the `umul.with.overflow`.

By doing that, other existing optimizations would hopefully then simplify the function all the way down to
```llvm
define i64 @foo(i64 noundef %x) {
  %1 = icmp ne i64 %x, 0
  %2 = sext i1 %1 to i64
  ret i64 %2
}
```

---

Rust repro: <https://rust.godbolt.org/z/EoTzTY3Y9>
```
pub fn foo(x: usize) -> usize {
    x.saturating_mul(usize::MAX)
}

example::foo:
        mov     rax, rdi
        mov     rcx, -1
        mul     rcx
        cmovo   rax, rcx
        ret
```

Obviously this would be strange code to write directly, but it can happen after inlining when computing [`Iterator::size_hint`](https://doc.rust-lang.org/std/iter/trait.Iterator.html#method.size_hint)s.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJy1VUuP2zgM_jXOhYjhRxInBx8yk7bYw2KBYoC2p0K25FiFLBl65DG_vqSczGQmbbF72MCxLVEkP338KDeGn2szemiDtUJ7dQZuhNNJUXmQw2jNQYDvpQOmz9AF63thk-IRhxwkuplhlEo4CE7qPTBIVtkQFN4hKR9770eXlNuk-IiXUoch3RveGOVTY_c49Yz_Df_0SYgvlUnKD0m2S7Itek8XeUxTXHRSC5CrBSSLrDMmKdY00CZotEFSLE9JsYGkepgcgKZyBLEDz6SClilFVgpB-CXaqh0Fi7ACgk6P0vcpbth2yhzTuDAmmYI_xuzzHNPcpChiCnHylrX-wFQQv8qCUGiY3TiW_8Uxv3FcREcnlGh9XIexbtFNbwTt6mSFv84tLgxXu3dUX4bx_oQ1FqgAh_SCFoKDN4AoA3J4Bhs0KoJ5QMq8HJVsmZdGJ-UDTgtM5nAeUDE_gvOkB9rWPBJ4Qgg5oc9odySSzpohuuHgvgY4md4CeyB1ks4oPwU0JEckUTpP0yhkOcjniMfB0QTFoTej6AIBx7UaHIpayS6OUM-6pbVA4qCJI6MMR9yg-V-kKNthhKvzRVXZnZocquJS2ZyoJ03cl7L4N6Wcz-e3w89UEiuwrbEr7zvUovkXHfrBPD0_fSu_be47dBqOoYFOw8TFiULjcfAsiIU5-kyjW0IATqljPlhGdftOJ0axnnwQS7n9e_v1pc1eNxjv4sSwgpd1lLHcvkal32AO8WlZpNdy-Rt7G-3z_J05qBfzG0OLjuYm7ns7luYPhfinOUgTXJShvGqzEeCw__Ve4EHKBdX6aKUXwKXF7lZnStQEH09apqFn44gaZp1H1UutpCbVH0nXdBCH2ATJ8gFz_4VLmDd24omY_d5L7QnVcodkvy08N21KxZ8rBHOpvPMc74gGz_uPiFL69Bo07f2AFSsH4XvD09foxcalM16XfFNu2MxLr0T9u86G5kxdj_zju-sjIS_dyagTqSPfHjKzYFX9Fvoew4Ymxf1fPjGXxxxF_gNJpD04F4TDl-UiW5azvq4yUZVVUbTtelU2m0XFsoZ1BV-JnGes4jPFGqFcTVQWhRZHiCHwHcmbybrICroW2booyzwtl-ssX7dtu9os22wh8FgQA3500vhpQTZnto6QmrB39MXB48q9Gplzco_HbEyH8VlAVm3tWuP90A6zmLuO2H8CtCZC_Q">