https://gcc.gnu.org/bugzilla/show_bug.cgi?id=112608

            Bug ID: 112608
           Summary: Missed-optimization: Multiple Division Constants
           Product: gcc
           Version: 13.2.1
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: tree-optimization
          Assignee: unassigned at gcc dot gnu.org
          Reporter: goon.pri.low at gmail dot com
  Target Milestone: ---

The following C code on all optimization levels uses a division instruction:

int inst_division(int a, int b) {
    if (b < 10)
        b = 7;
    else
        b = 13;

    return a / b;
}

inst_division:
        cmp     esi, 9
        mov     edx, 7
        mov     ecx, 13
        mov     eax, edi
        cmovle  ecx, edx
        cdq
        idiv    ecx
        ret

This could be avoided since we know all the possible divisors and instead could
do multiplications as shown in the following code:

int constant_division(int a, int b) {
    if (b < 10)
        return a / 7;
    else
        return a / 13;
}

constant_division:
        movsx   rax, edi
        cmp     esi, 9
        jg      .L6
        imul    rax, rax, -1840700269
        shr     rax, 32
        add     eax, edi
        sar     edi, 31
        sar     eax, 2
        sub     eax, edi
        ret
.L6:
        imul    rax, rax, 1321528399
        sar     edi, 31
        sar     rax, 34
        sub     eax, edi
        ret
  • [Bug tree-optimization/112608] ... goon.pri.low at gmail dot com via Gcc-bugs

Reply via email to