<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/135557>135557</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[ConstraintElim] Failure to eliminate cmp of usub.sat
</td>
</tr>
<tr>
<th>Labels</th>
<td>
llvm:optimizations,
missed-optimization
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
nikic
</td>
</tr>
</table>
<pre>
https://alive2.llvm.org/ce/z/4ZG-nD
```llvm
define i1 @src(i64 %index, i64 %limit) {
%precond = icmp ult i64 %index, %limit
call void @llvm.assume(i1 %precond)
%sub.sat = call i64 @llvm.usub.sat.i64(i64 %index, i64 1)
%cmp = icmp ult i64 %sub.sat, %limit
ret i1 %cmp
}
define i1 @tgt(i64 %index, i64 %limit) {
ret i1 true
}
```
I think we should be able to handle this by adding a fact that the usub.sat result is ule its first argument, similar to what we do for min/max/abs.
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJyUU02PqzgQ_DXNpZUIGgjkwCFvsqz2L-zN4Cb0PmNHtsm8mV-_Msl8KNo9PCkKH01XVZerVQhyscwd1D-gPmdqjbPznZWfMmaD02_dHOM1QHkC6oF6ZeTGtDfmtuydvwD1IwP170B99fefO3uG_ASH_P5LX0F-0jyJZZQCocqDH4FaOVQIVIvV_AvoBR_PRhaJQEeE5gfkJ0zvrp5HZzVCeUYZlyuuJuJz_2dvfsJRGYM3JzrRbUJVCOvCibb4hgh0_OAI67APKm4cW_uG_-heH9W9HKr_kV58w0oS_0vrA-VZLXqOeNc1LtfkXrN5-GRbvMTfsO2BGf3KX4gfp3JH_wvjLPYnvjKG2a1G48CoBsMYHc7K6nQ3S8DhDZXWYi-ocFJjxDir9Mf4YQx6DtugAVfDKDHgJD5EVP6yLmy3mYMsYpRP6K8J4JVRO5ycx0UsUL-oXyleQ9hnuiv1sTyqjLuiqaq6oaJqs7krJ0U0MA1TPpZaF7qp2obbZjgcDlQeOJOOcqrzqiiLIxG1-yNNdTsOVLStOtJEUOW8KDGf-c0khJW7oqzrusmMGtiEbRWItvCWJ3eNssi7iuJsACKgFyBaJATWu-_FVKvPme9S425YLyEFSEIMX2xRotlW7cXZEL0SG_8wskB9xl6JWf3mPqfztCoypgi56dPobPXmaR8vEud12I9uAeo3yffL7urdPzxGoH4bMQD1jylvHf0bAAD__-b3OC8">