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

    <tr>
        <th>Summary</th>
        <td>
            [InstCombine] Missed min -> max optimization
        </td>
    </tr>

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

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

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

<pre>
    This branchless max code turns up occaisionally (e.g. https://github.com/dendibakh/perf-ninja/blob/main/labs/core_bound/vectorization_1/solution.hpp)
```
template <typename T>
inline T max(T a, T b) {
        return a - ((a-b) & (a-b)>>31);
}
```
https://godbolt.org/z/snrax36PG

which we only optimize to:

```
define i32 @foo(i32 %x, i32 %y) {
entry:
  %sub.i = sub nsw i32 %x, %y
  %0 = tail call i32 @llvm.smin.i32(i32 %sub.i, i32 0)
  %sub2.i = sub i32 %x, %0
  ret i32 %sub2.i
}
declare i32 @llvm.smin.i32(i32, i32)
```
So we're missing a final stage:
```
----------------------------------------
define i8 @src(i8 %x, i8 %y) {
%0:
  %diff = sub nsw i8 %x, %y
  %smin = smin i8 %diff, 0
  %sub = sub i8 %x, %smin
  ret i8 %sub
}
=>
define i8 @tgt(i8 %x, i8 %y) {
%0:
  %r = smax i8 %x, %y
  ret i8 %r
}
Transformation seems to be correct!
```

I think we're missing the inverse and unsigned variants as well.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJydVd9v2yAQ_mucl1MsguvEfvBD16xTNU2atr5P2BCbDYMFuG361-8gTlKnPzTNsgwHx_F998G5Nnxf3XfSQW2ZbjolnIOePUFjuAA_Wu1gHMA0DZNOGs2U2kNCC5G2KXTeDy7JrhN6i28rfTfWaWN6NLjQXNbsT4f9QdjdUkv9m6FRK1Nj0zOpsVGsdtg0xopftRk1R-NBNN5Y-cw87vdrhSPOqDEYaTcMCS0Tsk3IdbIm0xtNL_pBMS8gyW78fhCa9QLuk-zzYVpqJTUOBG4I_x4Qyw2aiKWEZPNpiklKKwJpYLAMNPFly4MPXcPJCmGzz9kqdo9rN9s3gV0kyfDaKJ8a26L1HMhpy56y9fcvRwjh-9jJpoNHAUZjvs3gZS-fUQ8TAr3wu9iLi11gKTMKyRXZGYOIo0Hzp8B36u9npIX2dn-KC8HBoY4SM7kF7IF2j_AySoxwdibR0TOpoMHjcdxdqYc-db3UKQ6cccTQRyzkpOZxW_pi34s9ydETJYJzNFxxIQAXjWJWfABk2v-9s_TTYOoTusEYvXRO6hbPA2aWKXCeteIswnzd8h-fuVhFAOlsE6AVZ6mK10rFJMyE4nK3m-tUvCdTyMDBNXQOfmF5cCVzEc4KzKKFhTMNisn_8gJk29O9m5H0rf8fknaCjVXpHXpnNPYCyz1WNbczto_VBJwQvcNrBLXACmctlpqErt4U8_C9A99J_efVefAdktIPwjoBTHMYtZOtFhwemJVMewfM4SKl0gWvMl5mJVt46ZWokvzTnXb-xvQ1ZibJt_ANY-LKIMsSExfL73TlI-rFaFX1Qa0NB3xqloM1vyOpWww6ilBc8_xqQxZd1eSFyGu-ZhnZrRin66IkhK02tSiKDSubBRZjoVwAmFAag2bX4TfQCizV9JDz47hECs1E4TTXRyLLl9jDZL5dyIoSSkm-ykl5VZA8zXK6zrjI1yUiWhccT4fAf4JK423F6riwVSRUj60Ll1g6786TzMV0x2yG-Gz0nbHVj68_ZY8Ji9yrSPwvomLwzQ">