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.