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

    <tr>
        <th>Summary</th>
        <td>
            [InstCombine] Failure to factorize `add`/`sub` and `max`/`min` using distributivity
        </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>
    [alive proof](https://alive2.llvm.org/ce/z/2t4UfC)

```rust
use std::cmp::max;
use std::cmp::min;

// * `(a umin c) umax (b umin c) => (a umax b) umin c`
#[no_mangle]
pub fn src1(a: u32, b: u32, c: u32) -> u32 {
    max(min(a, c), min(b, c))
}
#[no_mangle]
pub fn tgt1(a: u32, b: u32, c: u32) -> u32 {
    min(max(a, b), c)
}

// * `(a umax c) umin (b umax c) => (a umin b) umax c`
#[no_mangle]
pub fn src2(a: u32, b: u32, c: u32) -> u32 {
    min(max(a, c), max(b, c))
}
#[no_mangle]
pub fn tgt2(a: u32, b: u32, c: u32) -> u32 {
 max(min(a, b), c)
}

// * `(a smin c) smax (b smin c) => (a smax b) smin c`
#[no_mangle]
pub fn src3(a: i32, b: i32, c: i32) -> i32 {
    max(min(a, c), min(b, c))
}
#[no_mangle]
pub fn tgt3(a: i32, b: i32, c: i32) -> i32 {
    min(max(a, b), c)
}

// * `(a smax c) smin (b smax c) => (a smin b) smax c`
#[no_mangle]
pub fn src4(a: i32, b: i32, c: i32) -> i32 {
    min(max(a, c), max(b, c))
}
#[no_mangle]
pub fn tgt4(a: i32, b: i32, c: i32) -> i32 {
 max(min(a, b), c)
}

// * `umax(a +usat b, a +usat c) => a +usat (b umax c)`
#[no_mangle]
pub fn src5(a: u32, b: u32, c: u32) -> u32 {
    max(a.saturating_add(b), a.saturating_add(c))
}
#[no_mangle]
pub fn tgt5(a: u32, b: u32, c: u32) -> u32 {
    a.saturating_add(max(b, c))
}

// * `umax(a +nuw b, a +nuw c) => a +nuw (b umax c)`
#[no_mangle]
pub fn src6(a: u32, b: u32, c: u32) -> u32 {
    unsafe { max(a.unchecked_add(b), a.unchecked_add(c)) }
}
#[no_mangle]
pub fn tgt6(a: u32, b: u32, c: u32) -> u32 {
    unsafe { a.unchecked_add(max(b, c)) }
}

// * `umin(a +usat b, a +usat c) => a +usat (b umin c)`
#[no_mangle]
pub fn src7(a: u32, b: u32, c: u32) -> u32 {
    min(a.saturating_add(b), a.saturating_add(c))
}
#[no_mangle]
pub fn tgt7(a: u32, b: u32, c: u32) -> u32 {
    a.saturating_add(min(b, c))
}

// * `umin(a +nuw b, a +nuw c) => a +nuw (b umin c)`
#[no_mangle]
pub fn src8(a: u32, b: u32, c: u32) -> u32 {
    unsafe { min(a.unchecked_add(b), a.unchecked_add(c)) }
}
#[no_mangle]
pub fn tgt8(a: u32, b: u32, c: u32) -> u32 {
    unsafe { a.unchecked_add(min(b, c)) }
}

// * `smax(a +ssat b, a +ssat c) => a +ssat (b smax c)`
#[no_mangle]
pub fn src10(a: i32, b: i32, c: i32) -> i32 {
    max(a.saturating_add(b), a.saturating_add(c))
}
#[no_mangle]
pub fn tgt10(a: i32, b: i32, c: i32) -> i32 {
    a.saturating_add(max(b, c))
}

// * `smax(a +nsw b, a +nsw c) => a +nsw (b smax c)`
#[no_mangle]
pub fn src9(a: i32, b: i32, c: i32) -> i32 {
    unsafe { max(a.unchecked_add(b), a.unchecked_add(c)) }
}
#[no_mangle]
pub fn tgt9(a: i32, b: i32, c: i32) -> i32 {
    unsafe { a.unchecked_add(max(b, c)) }
}

// * `smin(a +ssat b, a +ssat c) => a +ssat (b smin c)`
#[no_mangle]
pub fn src11(a: i32, b: i32, c: i32) -> i32 {
    min(a.saturating_add(b), a.saturating_add(c))
}
#[no_mangle]
pub fn tgt11(a: i32, b: i32, c: i32) -> i32 {
    a.saturating_add(min(b, c))
}

// * `smin(a +nsw b, a +nsw c) => a +nsw (b smin c)`
#[no_mangle]
pub fn src12(a: i32, b: i32, c: i32) -> i32 {
    unsafe { min(a.unchecked_add(b), a.unchecked_add(c)) }
}
#[no_mangle]
pub fn tgt12(a: i32, b: i32, c: i32) -> i32 {
    unsafe { a.unchecked_add(min(b, c)) }
}
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzEWE2PqzYU_TVmY00ENiSwYJF5KVLVdddPxjiJ-8BEXHvevPn1lfkKaWhnCFYqjRJyrzHn3OPjy5gByJMSIkXRK4oOHjP6XDfpH5VgP6Ty8rr4ZVOslG8CX5q6PqLogEh81voCiO4RyRDJ2jTZlOVbtambEyIZF4hkH4hkRId_Hr8hkiD_gPx9_7n1u7_GgO5CBgQGXdgp6Z5Xl-6iYu-Ivv7nCKnGEf1nCwkjssf2ISRm2FRSYY5Igk3F3jEicT6JIXpA9Dfcj2TvOO9GtvmtP8xKUfSq6u8VU6dS2Cq08YvJ8VFhaHhgJ0B0jw0liHzD-eSaj9cJfrEPM5RgtOtxY4yxZUpiy8bO0t5CEvvdhfJraKjk7vAlZPqkVyJrAXT4WHd7h4zPYPl3Bdj7oIBUgwJD7FYBqQYF2vzXFSBueY4KtKFVCqxAdrcwHik_jIsdRgPArAFgNAAsNQAdSMoJSTkhKSck5TMNsBKZCwPAuNhhNADMGgBGA8BSA4RueTo0wApkaw1gekYYkVcDTOOWyPXnVIBr9HaHWqBB5KANsA0wbRqmpTp9Z0XRVb8lPZN6VJN1SGeAfL5OPpFHmZ8TdeyvO3Fs8GFttqsYGwXsKGxslMkofhb8hyjuVPpnpi8Ivtbi60I5g30P616yOYSzsnWGfMhVfeNZoNzOQWt_jqvWIZ1z1af97xN5lrlquTaxM1f1Mj3HVc5gz7jqTrIvugommyHcugpmXQWjq-CB_TDwHbyyPcdWK6G66lZTgRTc-ArmfAU_H1cnWcX4f-tWzmA77FYw2Q4X-2r5jhgEDl7En-SrdVBd9aupQMt89YA6xJmxntqw3OF-tGMNx3ZekdIioQnzRBrsgiiOg4Ak3jmlVPhBQWmxpQnd8SIJ4jBhheC7cCtYkngyJT4J_SjYBjsah8lmd_S5H_o-ZzHPOU1Q6IuKyXI8TPQkgBFpQkJKvZLlooT2sJIQOwLRvVSgeV3lUglEbC0QIZUEEMVLfdGykh9My1rZXHTwmtTe9pKbE6DQLyVouD5KS122R6G_K9Df-jmjA86YLE0jsK7xkXFdN_JD2FVra2f_v8_sCjY52vqYqcJm7E41ZGxttz42INUJFxJ0I3Oj5ZvUvzzTlOntWepJ6rPJN7yuEMlait3Xy6Wp_xJcI5K1FQFEsrYofwcAAP__fCmxKA">