<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/75360>75360</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
Missed optimization: unsigned ckd_add(&unused, a, 1) can be folded to (a == UINT_MAX)
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
sadlerap
</td>
</tr>
</table>
<pre>
Consider the following function, using C23's checked operations feature:
```c
#include <stdbool.h>
#include <stdckdint.h>
bool foo(unsigned int num) {
unsigned int res;
return ckd_add(&res, num, 1);
}
```
Clang generates the following IR[^1]:
```llvm
define dso_local zeroext i1 @foo(i32 noundef %num) local_unnamed_addr {
entry:
tail call void @llvm.dbg.value(metadata i32 %num, metadata !17, metadata !DIExpression())
%0 = zext i32 %num to i33
%1 = tail call { i33, i1 } @llvm.sadd.with.overflow.i33(i33 %0, i33 1)
%2 = extractvalue { i33, i1 } %1, 1
%3 = extractvalue { i33, i1 } %1, 0
%4 = icmp slt i33 %3, 0
%5 = or i1 %2, %4
tail call void @llvm.dbg.value(metadata i33 %3, metadata !18, metadata !DIExpression(DW_OP_LLVM_convert, 33, DW_ATE_unsigned, DW_OP_LLVM_convert, 32, DW_ATE_unsigned, DW_OP_stack_value))
ret i1 %5
}
declare { i33, i1 } @llvm.sadd.with.overflow.i33(i33, i33) #1
declare void @llvm.dbg.value(metadata, metadata, metadata) #2
```
However, this IR is equivalent[^2]:
```llvm
define dso_local zeroext i1 @foo(i32 noundef %num) local_unnamed_addr {
entry:
tail call void @llvm.dbg.value(metadata i32 %num, metadata !17, metadata !DIExpression())
%cmp = icmp eq i32 %num, -1
ret i1 %cmp
}
declare void @llvm.dbg.value(metadata, metadata, metadata) #1
```
Credit for finding this also goes to @redacted-moose.
[^1]: https://godbolt.org/z/cMWY6jPrW
[^2]: https://alive2.llvm.org/ce/z/en2z2C
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzsVt9vIjcQ_mvMyygIj1kWHni4g6BGurSn07Vpn5CxZ8EXY3O2l-Ty11f2EiA0l-uP10poAfv7ZvzNjGdWxmjWjmjKqvesmvdkmzY-TKPUloLc9VZef5vOvItGU4C0IWi8tf7BuDU0rVPJeMdwBm3MKzMUDOsIakPqnjT4HQWZIREakqkNxMQ7NpizwfNzNOg-6vAfhXHKtpqAiVlMeuW97W-YuP7OvrrXxqVzRHlmGjTeMxy3rijUYFwC124ZToDV7zscAMALQKDIxNlmoNQGB-peL6XWDMcMRxmDs87WDDjDyZHC6vmFsPNTzax0a1iTy1GheBHOm08lB9ecVfPvhcna_bZb0tQYR6CjX1qvpIUnCp4eExgObDjotBuB4HzrNDXAsDqoL_hl65zcUpEVTgEhl8K3o3eAJI0FJa2FvTc6W85H6OvVur-XtiWG4y0lqWWSkL09e5nBcZkh5_Xlyvzm-nEXKMZSP-McQ5w8O2VYDYCJOTwVQUezkDwYIc5gvMBOh2T1-4LAWYlDPT-eOEqt-w8mbfp-T6Gx_qFfgGMjRHFYOEJ0-Tx5wOKBHlOQKhXJrznBine1cCKKf0IcnBGHhWjUdgfRJjicT1zCqgLzoZjCCvN-Zv-7zJ18vMjb-Ad5m98tf_m4_PDht9ul8m5PIWVCJ3F-t3z3-Xr5fL0OS6_B8U14TFLdLw9nPi-TQOkgvrq8fYcroqwMr4b9bxTFoR5Ku0DBXzP8w8CeR-_l72IU3-gVP_kH2lPIrLQxEW4-gYlAX1uzl5Zc6noF_t8rsMo35Xhl6OuF7Sv-13pR292bFfNfE8vfGgKBtEnQ-ACNcTp3_pJgaaOHtc9jwWffgbRUifTV1vtI_RcpPp8TsElpF3MacMFwsfZ65W3q-7BmuHhiuFC3d3-MvnwMd-dkfJUsrdkT9ovszoCigxVy-ISznp4KPRET2aMprwc4HNcjznubKYpaohgN6hqrVU182IzHWtNkwqlpSMuemeIABUcueM2F4H3Bh5yv-JCroZwMccKGA9pKY4_eeybGlqZ1JUaDnpUrsrG8pSA6eoCyyTDr6IVp5lyt2nXMSTMxxZOVZJKl6a2JsbyQJLM1T-WdJMs_zv4XA751bew6kHye8KCkg1UZ15p0SRGOZS67XHm_3vz8eXn77neGk14b7PQiJSZt2lVf-S3DRbmV3dfVLvgvpBLDRVETGS6K2j8DAAD__xCczLA">