<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/126406>126406</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
`assume`ing the result isn't setting the `nsw` flag on `add`
</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>
Original Rust example: <https://rust.godbolt.org/z/xze3vEx8E>
```rust
pub unsafe fn extend_packed_unchecked(a: Layout, b: Layout) -> usize {
a.extend_packed(b).unwrap_unchecked().size()
}
```
Actual output (-) and what I'd like to get instead (+):
```diff
define noundef i64 @extend_packed_unchecked(i64 noundef range(i64 1, -9223372036854775807) %0, i64 noundef %1, i64 noundef range(i64 1, -9223372036854775807) %b.0, i64 noundef %b.1) unnamed_addr {
start:
- %new_size = add nuw i64 %b.1, %1
+ %new_size = add nuw nsw i64 %b.1, %1
%_11 = sub nuw i64 -9223372036854775808, %0
%_10 = icmp ule i64 %new_size, %_11
tail call void @llvm.assume(i1 %_10)
ret i64 %new_size
}
```
Note that `%_11 sgt -1`, thanks to the range attribute on the `%0` parameter.
Alive proof that this is allowed: <https://alive2.llvm.org/ce/z/Dn2P8R>
Repro that more `opt` on trunk doesn't do it: <https://llvm.godbolt.org/z/Kr8n37s41>
---
Oh, turns out the simpler case of just
```llvm
define noundef i64 @demo_b(i64 noundef %1, i64 noundef %b.1) unnamed_addr {
start:
%new_size = add nuw i64 %b.1, %1
%_10 = icmp ule i64 %new_size, 9223372036854775807
tail call void @llvm.assume(i1 %_10)
ret i64 %new_size
}
```
doesn't add the `nsw` either.
And that'd be allowed too: <https://alive2.llvm.org/ce/z/PeC7No>
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJyUVdtu2zgQ_Rr6ZWCBoqyLH_SgXAwsdtEW_QGDEkcyG4oUeInTfv2Cktw4qbPYAAFCk5wzwzPnjLhzctCINcnvSP6w4cGfjK1dZ7wfu3HTGvGz_mrlIDVX8D04D_jCx0khyRog2f3J-8mRrCHsQNjBBueTwYjWKJ8YOxB2-EXY4eUXZs-PL9UjyR4JbUhBl794ndBmCi0E7XiP0GvAF49aHCfePaE4Bt2dMK4Iq3jM-Q__aYIn7B7a65972JLsEYKTvxBIeUdoAzx5g0VY1RK2T4I-Wz69QY7bMXJZxhLLh-tC45o2TecDV2CCn4IHwqptzMu1gPOJe_iLsFKAkk8I3sCAHqR2HrmAGfYuImfNNayQfR8LFdhLjaBN0AJ7kMUOyI5-TES8cLlsuR5w3UsjLds9Y1lWMpoVVb4ry7yiZayTsJzG8-tgwvL0_d5nANvkFmSbpPE8aM1HFEcuhL20xHlu_cLCFuJdjefj0rPsAbgQoMN5IWDFuV-KpA1hdx8GaPdBEMxJjmk6X3eh_Y1_41XVGkivAukcKLtxgqDwkuRSxBpwTNdcnksFHVcKno0UsYlKPY8Jdy6MM6fpirqoDABslMk7UNrATf19MR7BR6nFreVZbvCwTeff9_FMP7moPn_CpZHAvbeyDR7B6Hl7iY2oMHHLR_Rok1XgSj4jTNaYfsnjT9KBdMCVMmcUNz3PYxBL5oculu9w9f2DZt-q74vpv-NkzYI6GjuXYSYfq4h12aCfQBh0mrDSgzAg_c1sc5o_J8zfttJZ6XbpOmFos91ul8XX00xNsNpF684cOBlHmIWOOwTTw4842K4Jj2kIbW4bU-Boju07H96y0n964coKn3TC_1XmLd_GZJ9W6W2R_qnR1wbG-lexaXeOXUbpT69C02KWwjwxW7zoC7wxn9XYN7wvv5il7RtRZ2Kf7fkG67TM9rTcpznbnOq2LKqy7PdpWnZVtutYV9EyL9KqxJQXu24ja0ZZThnd0zxjGUt2NO9YQfsuzXd7vivjPB65VL9r2EjnAtYpK3a02CjeonLzV5QxjWeYTwlj8aNq6xi0bcPgItfSefcK46VXWJOCrvQXVOph8S-6oDzIlVKH3l-OXmntFR-igyKAEKSgm2BV_Za9QfpTaJPOjKuB1n_byZof2HnCDnO5jrDD-p7nmv0bAAD__xDEYVw">