<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">