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