<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/122388>122388</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[InstCombine] Missed fold: `umax(x *nuw 2, x + 1)` => `x == 0 ? 1 : x *nuw 2`
</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>
https://godbolt.org/z/TEzxx8vbj
```rust
#[inline(never)]
pub unsafe fn src(x: usize) -> usize {
std::cmp::max(x.unchecked_mul(2), x + 1)
}
#[inline(never)]
pub unsafe fn tgt(x: usize) -> usize {
match x {
0 => 1,
_ => x.unchecked_mul(2),
}
}
```
https://alive2.llvm.org/ce/z/ijq6ZJ
```llvm
define noundef i64 @src(i64 noundef %x) {
%x2 = shl nuw i64 %x, 1
%x1 = add i64 %x, 1
%max = tail call noundef i64 @llvm.umax.i64(i64 %x2, i64 %x1)
ret i64 %max
}
define noundef range(i64 1, 0) i64 @tgt(i64 noundef %x) {
%eq = icmp eq i64 %x, 0
%x2 = shl nuw i64 %x, 1
%max = select i1 %eq, i64 1, i64 %x2
ret i64 %max
}
```
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJyUVE2z6jYM_TXKRgPjyCQkiywCPGbaTndddfPGiQ34Xsfhxg5N-fUd54Ny6bS9j8mQyJalc3QsCef02SpVQLKD5BCJ3l_arvilUeJd26hq5Z_FxfurA14CHYGO51ZWrfHrtjsDHe9Ax9--3Ychu1VvwMrwpGx6ut75YBOHZKet0VYBZVbdVAeUQ3IAVl77CnvrxEnhyaLraqBsAF5i7_RdAeW4Av5tshC2O2AlIqLzMgDiZd1cp49GDOHourf1RdXvSn5vegOUUUhFexwQaIdxsFgJ28OM9evY_Nl_DVsjfH0J-R4r4ccQ-CG4x0D7p_Xvy_q_Qg_OM-Dpf6nvROGzOsLom6K1MbdmVqhWs0z67SP9_efnAMELWCnVSVuFtu2tVCfU6QZhwyYtgrFsACVDYL0QCzYF-OguBm3_x3R09Npj_PCJRx8h5T_3gZJGDOO-F9pgLYx5BTJy6RsxrHW6mSGNqUOUxZiFReyUXxbDlXjS-oVmJ-xZzeGCJsgCtznnJPb_kFcfI3BdN1dUH5_IsR8p0FIBp4yqPep4Cr7Qi5950n-SXISNZMFlznMRqSLe8nSTJgnLokshtrJWijht-UZWRIJSmfI438q8TpKUIl0Qo4TFLCfO4022lkmaV5yfKpnHFatq2DDVCG0eVyzSzvWqiIl4lkVGVMq4cZoQjfeLl9o6X7dNNfZYUA2IGu2ckqv26nWj78Lr1oa95BB1RTi2qvqzC-Jr593fubz2ZpxVP1nn93PM5IC_juHw1JowFxBS1s8DAYHKUHl6GQLpoyEhZcP0fRi79Ijhwpb4dDRlUd-Z10Go_aWv1nXbAB1HqtNrde3aN1X70HKhNA7oOFfnVtBfAQAA__-4rITT">