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

Reply via email to