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.