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

            Bug ID: 118637
           Summary: gcc fails to optimize unsigned division by 2 to shift
                    right by 1
           Product: gcc
           Version: 15.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: other
          Assignee: unassigned at gcc dot gnu.org
          Reporter: davidfromonline at gmail dot com
  Target Milestone: ---

The following code:

```c++
unsigned log2_divide(unsigned x) {
        unsigned result = 0;
        while (x /= 2) {
                ++result;
        }
        return result;
}

unsigned log2_shift(unsigned x) {
        unsigned result = 0;
        while (x >>= 1) {
                ++result;
        }
        return result;
}
```

when compiled with `-O3` generates

```asm
log2_divide(unsigned int):
        cmp     edi, 1
        jbe     .L4
        shr     edi
        xor     eax, eax
.L3:
        mov     edx, edi
        add     eax, 1
        shr     edi
        cmp     edx, 1
        jne     .L3
        ret
.L4:
        xor     eax, eax
        ret
log2_shift(unsigned int):
        mov     eax, edi
        shr     eax
        je      .L7
        bsr     eax, eax
        add     eax, 1
.L7:
        ret
```

I would expect `log2_divide` to generate the same code as `log2_shift`.

See it live: https://godbolt.org/z/fahr3Moe3

Reply via email to