<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/98598>98598</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[PowerPC] Failure to optimize (x == 0) ? 0xFF : 0 to addic+subfe instead of cntlzw+srwi+neg
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
GabrielRavier
</td>
</tr>
</table>
<pre>
```cpp
#include <stdint.h>
uint8_t f(uint8_t x)
{
return (x == 0) ? -1 : 0;
}
```
With `-O3`, GCC outputs the following:
```x86asm
f(unsigned char):
addic 3,3,-1
subfe 3,3,3
rlwinm 3,3,0,0xff
blr
```
whereas LLVM outputs this:
```x86asm
f(unsigned char): # @f(unsigned char)
cntlzw 3, 3
srwi 3, 3, 5
neg 3, 3
clrlwi 3, 3, 24
blr
```
...with GCC's sequence being 30-50% faster according to `llvm-mca`.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJykU02vqzYQ_TXDZhRkxnwuWNyQcjev6lMX7bIyMIArB1LbXNL36ytIuI2qp7eplMDonBn7HGZGOaeHibmE5AzJJVCLH2dbvqvGaja_qg_NNmjm7u8SUvH4tbcbiAuINyCpp9YsHSPIyvlOTz4cQf70pPfnoief_-GxB8qP-A5UPHOy8yNARLTsFzshUH5HkBeQFxRABYKs8RQhyDcUIM9H5eUZHLpeb_1d-xEhFadf5MZQhe9VhfPib4t36EfGfjZmXvU0gHx7rfw87p6nyl0f4C5-2r9Uh-2o7GbgqEPVdbpFCVRt_1N0OHJL0_MnLg_YmlVP1098Uyfuff-kG2N_4Gsd2bJy-OXLbz-_2NHuf7hAIIkQi-_ST83t5M23ddeMn0acXfUBUYXJgU88_CezNZvpl1yKD-rHfsMwXLdWvlcVUObQ8V8LTy1jw3oaUIpTIoAS7JXzbFG17Wy7jfHz1n5jPq6na6sgFWHQlbIrZKECLqOMRJYWRSKDsYzauChyiiIZ53lKpAoR912iuMmbqFddoEsSFIssIpHJIpJhlrStSpVKs54b5ghiwVelTbjdF852CLRzC5dFnhR5YFTDxu0LRjTxijsJRNu-2XLX2CyDg1gY7bz79xSvvdk38-u8sv1aQXLBWmmzWN4Mzjevr_obf39jxL2uHzuz5e4zCnR-zKSenGfV4dw_O7sxdtVA54mHYLGmHL2_7VNFNVA9aD8uTdjOV6B60_d8nW52_pNbD1TvrhxQ_XD9UdI_AQAA__9ZwzjN">