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

            Bug ID: 99087
           Summary: suboptimal codegen for division by constant 3
           Product: gcc
           Version: unknown
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: middle-end
          Assignee: unassigned at gcc dot gnu.org
          Reporter: vanyacpp at gmail dot com
  Target Milestone: ---

These two are functionally the same, but generate different code with g++ -O2:

unsigned long long foo(unsigned long long a)
{
    return a / 3;
}

unsigned long long bar(unsigned long long a)
{
    return (unsigned __int128)a * 0xAAAA'AAAA'AAAA'AAAB >> 65;
}

foo(unsigned long long):
        movabs  rdx, -6148914691236517205
        mov     rax, rdi
        mul     rdx
        mov     rax, rdx
        shr     rax
        ret
bar(unsigned long long):
        movabs  rax, -6148914691236517205
        mul     rdi
        mov     rax, rdx
        shr     rax
        ret

For some reason for division GCC chooses different argument order which causes
generation of one extra mov.

Reply via email to