<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/82690>82690</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
Merge `assume`d `icmp`s despite one being after a `trunc`
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
scottmcm
</td>
</tr>
</table>
<pre>
In [playing around](https://rust.godbolt.org/z/fW9fjjb4M) with some Rust, I ended up with this LLVM IR:
```llvm
define noundef i8 @demo(i64 noundef %x) unnamed_addr #0 {
%0 = tail call i64 @llvm.uadd.sat.i64(i64 %x, i64 48)
%_6 = icmp ult i64 %0, 256
tail call void @llvm.assume(i1 %_6)
%_7 = trunc i64 %0 to i8
%1 = icmp sgt i8 %_7, -1
tail call void @llvm.assume(i1 %1)
ret i8 %_7
}
```
I was surprised to see both `assume`s, since I know that LLVM is perfectly capable <https://llvm.godbolt.org/z/z85rnMhWK> of merging those checks where there aren't `assume`s involved.
Trunk appears not to be able to further simplify this either: <https://llvm.godbolt.org/z/YeWb45186>
It would, however, be equivalent to have only
```llvm
define noundef i8 @src(i64 noundef %x) unnamed_addr #1 {
start:
%0 = tail call i64 @llvm.uadd.sat.i64(i64 %x, i64 48)
%_6 = icmp ult i64 %0, 128
tail call void @llvm.assume(i1 %_6)
%_7 = trunc i64 %0 to i8
ret i8 %_7
}
```
Which Alive confirms <https://alive2.llvm.org/ce/z/EiFHYQ> is sufficient to expose all the UB that was present in the original.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJy8VU9v47YT_TT0ZRCDomxZPuiQxDF-xm9z6KJtsKcFRY4kJhSp8o-93k9fUFIde_eSPbSAIUua0Zs3M--B3HvVGsSKrB_IerfgMXTWVV7YEHrRL2orz9XBAFk_DJqflWmBOxuNJOsdYWUXwuBJfk_YnrC9iz4sWytrq8PSupaw_XfC9s3Ltnl9rVfPhG3hpEIH3vYIn6MPhD3CAdBIlBCHKRg65eHTpz-f4fA5QdMdofekoNNP62M_vZLYKINgEhtsQJVAVlRibwkrVbG6BAhbf0uVozG8R_mVS-mAsJwC2TxMUJCSKJB8B4ErDYJrDQmDrMaCy8ilXHoelqpYzfAT7OOYtioJ215BfS1GLCX6AaIOMOfTlM_WxT-Z77WOVslLMe597DGVySawH8A3E1EXjbggQ7Cgyqus7J2Bb8M4nfRpYnCX_RqB7Kq-wyusaTOb3Q8rmh_H6wFO3IOPbnDKo0w0PSLUNnRACjpXKqhPxLwyAuEAb8aeIHQ8TDJQHgZ0DYqgzyD4wGuNQPLHW_GNzH8W3_dy7cxz9_J_kj-BbaBH1yYVh856BNGhePNw6tAhhPHKHRrCNuGWHihztPqIcnnd3e8umjfgw4DceTA2pP5qhJFhsNBEl0DBq37QqjlP2kaVXpL8_sNNfMGXerXOyoLkTzfTDXCyUcs0vM6e8Igu3dYI-FdUR67RjJQ6fkSwRp9_zUzeiQ96KXv3kg_chYtv_0tnZaz81531cf2_dEp0cK_VEUFY0yjX-58XzlOcLUd2074Fzkt_Uvv_ffktyVYlBzWNEmreJ34bknpTf6FD-ONhckuy2uDQpyxlxpB1qlWG61m2C1nlcptv-QKrbEPLIi82lC66alPmDbJMMCkEEznNOS9EjkVTbGleZMVCVYyyFWWMsSwrs3LJ1s2mZPUWG9GgzEqyothzpS-9LJT3EauSFVu60LxG7cdThjGDJxiDhLF06LgqfXNXx9anTSkf_DtKUEFj9YyuxRtLyvSUdDDaU6IfVEgiR6hxPKaagA54yhoXSgq6iE5Xt_NvVehivRS2n903_90Nzr6iCITtR6aesP3Yyd8BAAD__6t9JiI">