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