<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/63381>63381</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
llvm.uadd.sat.i64 doesn't know that the return value is >= the first operand
</td>
</tr>
<tr>
<th>Labels</th>
<td>
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
saethlin
</td>
</tr>
</table>
<pre>
Rust demo: https://godbolt.org/z/d8MG583Tb
alive2: https://alive2.llvm.org/ce/z/Zj-Rvq
This:
```llvm
define noundef zeroext i1 @src(i64 noundef %x, i64 noundef %y) unnamed_addr #0 {
start:
%0 = tail call i64 @llvm.uadd.sat.i64(i64 %x, i64 %y)
%1 = icmp uge i64 %0, %x
ret i1 %1
}
```
Should be optimized to:
```llvm
define noundef zeroext i1 @tgt(i64 noundef %x, i64 noundef %y) unnamed_addr #0 {
start:
ret i1 true
}
```
But it isn't.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJy0U01vnDAQ_TXmMgoyNrBw4JB0S0-9pDn1Uhk8LE4N3trjbZJfX_GRtNpIPVSqhECM582b9zyjQjCnGbFhxR0rjomKNDrfBIU0WjMnndPPzX0MBBonx-QtjETnwOQtEy0T7cnpzllKnT8x0b4w0erq86eikg8d40fGb5U1FxTvgVs8tfYy7eAe9wpfH2_uLz82-PZ-GM2K3EIl354Fu4U0DmZGmF2cNQ7wgt7hE4HJgOU8-J6JypT52zkTxRMTH-Aq9sxEDXGe1YT6m9LaAxOSAzvcbSyBlKe3NmCBcGDyCKSMhV5Zu1Zk-dpZGpXWaVCUmjLfG_iTeCfcizFRZGst009niCd8zeFL_orbWT1uwkSR7X4cjlfGbL9fRhethg7BnclM5gU1kPtnG-lE_8fGXRD5iH8XdBcJDIEJMxMHShPdSF3LWiXYZGV1yGRZCZ6MTd1xLvpeYK1xKCqFSqmKF30tcl0M5ZCYRnAheZnVPOMHzlOVDVrKvsszoXRZDCznOClj38YzMSFEbEopqyyxqkMbXjfGN0vSTRdPYbl5Eyj8hpEhi827cQDtcFMB32f3E2hUBDTi4kX0M1yUjQgmAJMf1wEbEQbjA4E7o1ezTqK3zdUmGhpjl_ZuYqJd73T73Jy9e8SemGhXEYGJdtXxKwAA__-AiS0S">