https://gcc.gnu.org/bugzilla/show_bug.cgi?id=104376
Bug ID: 104376
Summary: Failure to optimize clz equivalent to clz
Product: gcc
Version: 12.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: tree-optimization
Assignee: unassigned at gcc dot gnu.org
Reporter: gabravier at gmail dot com
Target Milestone: ---
#include <stdint.h>
uint32_t countLeadingZeros32(uint32_t x)
{
if (x == 0)
return 32;
return (31 - __builtin_clz(x)) ^ 31;
}
On x86, with `-mlzcnt`, GCC outputs this:
countLeadingZeros32(unsigned int):
mov eax, 32
test edi, edi
je .L1
mov eax, 31
lzcnt edi, edi
sub eax, edi
xor eax, 31
.L1:
ret
LLVM instead outputs this:
countLeadingZeros32(unsigned int):
lzcnt eax, edi
ret