<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/83772>83772</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
Missed optimization: fold `is_power_of_2(A)` to `ctpop(A) == 1`
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
XChy
</td>
</tr>
</table>
<pre>
Alive2 proof: https://alive2.llvm.org/ce/z/pEwoSR
Missed example: https://godbolt.org/z/Ex3e6P8c8
### Motivating example
For simple C code from QEMU:
```c
bool is_power_of_2(uint64_t value)
{
if (!value) {
return false;
}
return !(value & (value - 1));
}
```
`clang -O3` produces suboptimal IR (also codegen):
```llvm
define i1 @is_power_of_2(i64 %value) {
entry:
%tobool.not = icmp eq i64 %value, 0
br i1 %tobool.not, label %return, label %if.end
if.end:
%0 = call i64 @llvm.ctpop.i64(i64 %value)
%tobool1.not = icmp ult i64 %0, 2
br label %return
return:
%retval.0 = phi i1 [ %tobool1.not, %if.end ], [ false, %entry ]
ret i1 %retval.0
}
```
However, it's can be simpler:
```llvm
define i1 @tgt(i64 %value) {
entry:
%0 = call i64 @llvm.ctpop.i64(i64 %value)
%retval.0 = icmp eq i64 %0, 1
ret i1 %retval.0
}
```
### For reference
### Real-world motivation
This snippet of IR is derived from [qemu/include/qemu/host-utils.h@is_power_of_2](https://github.com/qemu/qemu/blob/e1007b6bab5cf97705bf4f2aaec1f607787355b8/include/qemu/host-utils.h#L705) (after O3 pipeline).
**Let me know if you can confirm that it's an optimization opportunity, thanks.**
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJykVUuP2zYQ_jX0ZWCBop4--LCbjdECCdJuW6C3BUmNLDaUqJCUnc2vL0jJXj-KtEEXwsqaGX4z882D3Dm1HxC3pHgkxdOKT74zdvvnu-51JUzzun3Q6oAMRmtMS7IH6LwfHckeCNsRtuNRm2h96BNj94TtJBK2-0bYbnx_NL89E_pE6MNH5Rw2gF95P2q8h9mbRhjtF4hw-v3XDMtfalnPAMt_ls0PfDReHbhXw_4ECpeGO2PBqSh-B9I0CK01Pfz6_uMfwedsWdL5kfO3MEaDci-jOaJ9Me0LI6ye1ODL_MXDgesJCdssZ6vH-QcAgGqBsJqw9GQDV-rwZ9FPdoCWa4cku1CS6uky7pMhYSlhdcQDwko4f6whDUGwzRnlDeGUz_lTaj7sYf0pIyUNBWwmiQ7cJMzoVc81_PwckLl2JpK0xyEi3xIUqjuLGmzVgKBSIDm95UqVORBW3LOAg7evZ1gIRt4EupPBeCDZEyjZj4Bf4BriHdDTEWGj08uDQa-5QB3EM29XItUmODSX7C6Sq0Bo9C-51rPzPGabSD-aMVFlfp_XXRbpdRqT9qc8aAiIXeRwG-9FcIvkKjiL_sB1Msc4dipyUDzeuA5OzvkCKZ6ioHhc2m3WxhpE5QJv0S-Unrx8v59-Mkc8oA1wyhNWOZB8AIHLnNn_3DZ-73-wWf5Xja44vOmzWJ_0bfR-iJDblRR2jsUWLQ4S_9nkGbleH43VDfTLAjNXTfB7pxy4QY0jejBtGFDloEGrDtjMO4wUj1-wnwjbqUHqqQnrdhF0xvn15JV2SXc3n6Et6putq3w3iUSa_g1jeQltBGE7TCmtRCm4KGS7qSpaiDZvGeco07akVVVXWVGI-l-jYdmHihax0KzmrUcLnzIY1YhaDaFiyTVj4fmAHnqEz4M5hh37aqbYctIMrbI9-I77UyvyAeJOU98ipWDG0Vg_Dcq_hhL7jg-fXTLDrppt1myyDV_hNq3opsiyumSrbsuk5CholWcsbXhTMdoILoUQhWxyWuYrtWWU5TSjOS0zWtQJijSTkgssipZXVUFyij1X-nwfrpRzE27rrKrYKg6_ixctYwMeISoJC7VZ2W04sxbT3oX-Vs67NxSvvMbtcoleJhpu0tboBkh5t44fwhyUFLwJ2jgsizSMQpiGlJR0NVm9_U5bxCGeX-vRmr9Q-lDsELkjbBcz-zsAAP__WJZkPw">