https://gcc.gnu.org/bugzilla/show_bug.cgi?id=78103

            Bug ID: 78103
           Summary: Failure to optimize with __builtin_clzl
           Product: gcc
           Version: unknown
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: tree-optimization
          Assignee: unassigned at gcc dot gnu.org
          Reporter: ben.maurer at gmail dot com
  Target Milestone: ---

constexpr
unsigned long findLastSet(unsigned long x) {
  return x ? 8 * sizeof(unsigned long) - __builtin_clzl(x) : 0;
}
constexpr
unsigned long findLastSet2(unsigned long x) {
  return x ? ((8 * sizeof(unsigned long) - 1) ^ __builtin_clzl(x)) + 1 : 0;
}

These two functions are the same, but GCC does a better job at compiling the
second vs the more idiomatic first

https://godbolt.org/g/B2x5iG

findLastSet(unsigned long):
        xor     eax, eax
        test    rdi, rdi
        je      .L1
        bsr     rdi, rdi
        mov     eax, 64
        xor     rdi, 63
        movsx   rdi, edi
        sub     rax, rdi
.L1:
        rep ret
findLastSet2(unsigned long):
        xor     eax, eax
        test    rdi, rdi
        je      .L6
        bsr     rdi, rdi
        movsx   rax, edi
        add     rax, 1

Reply via email to