https://gcc.gnu.org/bugzilla/show_bug.cgi?id=104992
Bug ID: 104992
Summary: [missed optimization] x / y * y == x not optimized to
x % y == 0
Product: gcc
Version: 11.2.1
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: tree-optimization
Assignee: unassigned at gcc dot gnu.org
Reporter: tilkax at gmail dot com
Target Milestone: ---
This is especially helpful for constant y because checking
division-by-a-constant remainders against zero allows further optimization.
Repro case:
unsigned foo(unsigned x, unsigned y)
{
return x / y * y == x;
}
GCC -O3:
mov eax, edi
xor edx, edx
div esi
mov eax, edi
sub eax, edx
cmp eax, edi
sete al
movzx eax, al
ret
Clang -O3:
mov eax, edi
xor edx, edx
div esi
xor eax, eax
test edx, edx
sete al
ret