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

    <tr>
        <th>Summary</th>
        <td>
            Optimize std::max(X, 1u) and save one instruction
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            backend:X86,
            missed-optimization
      </td>
    </tr>

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

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

<pre>
    It looks like `std::max(X, 1u)` can be optimized a little bit.

Compile the following with `clang++ -O2` on x86:

```
#include <algorithm>

unsigned foo();

unsigned UnsignedMaxOneA() {
 unsigned X = foo();
  return std::max(X, 1u);
}

unsigned UnsignedMaxOneB() {
  unsigned X = foo();
  return X + (X == 0);
}
```

I get:

```
        testl   %eax, %eax
 movl    $1, %ecx
        cmovel  %ecx, %eax
```

```
 cmpl    $1, %eax
        adcl    $0, %eax
```

I'm using `foo()` so that we can use `%eax` as the starting point (as opposed to `%edi` for a parameter).

Both sequences have dependency tree height of 2. They are encoded with 10 bytes and 6 bytes, respectively.

</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJyUVE2PozgQ_TXmUurImADJgUMn2Uh9WPVlV-qrsSvgjbFZu0h35tevTMh89PSseqLIGNWreq8eLssYTecQG1buWHnI5ES9D81ZfplInmVvgiSZtV5fmycC6_05gjVnBFbxSJoVj6x4HOQbE5sXJvaQT0xsWcVBSQctgh_JDOYLapBgDZFFaA2tGD8w_nhb934YjUWgHuHkrfWvxnXwaqhPJMpK1zGxY2IHD88ilfYO3jZVov6uCqv48r-9isI4ZSeNwIq9tJ0PhvqBFX98nzS5uXsNJ--Z2CTpxe5DwN_L5k_59uzw8QYGVi9o-Ap8AVYcPqgHEJCm4ODXrn2lrg-f0LD7ScNviHiB5GeiT8gE5h8reOfqvD5Bh_T_9sPyI4xkAYCJElO7-_vuhhr8JUWBiXV-D6q3H0uowV_Qwj32rsSHAt-LUcP4E418RyO1umP4p0iemKgHmGI6rKzi38yuOEQP1EuCV5znYIrzvCwlKw4yzqc9kgyU8kdvHKXPISP4cfQRNZC_52iTck4-gIRRBjkgYWBi-8MU7Tz1EPHfCZ3CCL28IGgc0Wl06goUEKFH0_UE_gRiBX_1eAUZENApr1HfJi7n0F4JI0inobrtkx0B44iKzAXtdeHNdFPobbGVGTZ5VZd8XdTlJusbsVaYl3ktxalSmFdayrJdn4TSVb1tuchMI7goeF5wnpdluVnVVXmS7Wm9RayKPM_ZmuMgjV1ZexlWPnSZiXHCpuJFvc6sbNHG-cYSopXqjC6N1MumYkIwsWdCDCZG1A_L7SPJeJdi5SELTar50E5dZGtuTaT4jYUMWWyelzvr16M6uxOTxd4hGBcpTCqRZFOwTU80xpQojkwcO0P91K6UH5g4Jqbl8TAG_w8qYuI4NxeZOM79_RcAAP__uVeXiA">