[Bug tree-optimization/91029] New: missed optimization regarding value of modulo operation

bruno at clisp dot org gcc-bugzilla@gcc.gnu.org
Fri Jun 28 12:57:00 GMT 2019


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

            Bug ID: 91029
           Summary: missed optimization regarding value of modulo
                    operation
           Product: gcc
           Version: 9.1.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: tree-optimization
          Assignee: unassigned at gcc dot gnu.org
          Reporter: bruno at clisp dot org
  Target Milestone: ---

GCC's optimizers apparently don't know that, for b an integer >= 0, a % b > 0
implies that a >= 0 and a % b < 0 implies that a <= 0.

Test case:
============= foo.c =============
int xx;

void f (int i)
{
  if ((i % 7) == 3)
    xx = (i < 0);
}
=================================
$ gcc -O2 -m32 -S foo.c && fgrep -v .cfi foo.s
        .file   "foo.c"
        .text
        .p2align 4
        .globl  f
        .type   f, @function
f:
.LFB0:
        movl    4(%esp), %ecx
        movl    $-1840700269, %edx
        movl    %ecx, %eax
        imull   %edx
        movl    %ecx, %eax
        sarl    $31, %eax
        addl    %ecx, %edx
        sarl    $2, %edx
        subl    %eax, %edx
        leal    0(,%edx,8), %eax
        subl    %edx, %eax
        movl    %ecx, %edx
        subl    %eax, %edx
        cmpl    $3, %edx
        je      .L4
        ret
        .p2align 4,,10
        .p2align 3
.L4:
        shrl    $31, %ecx
        movl    %ecx, xx
        ret
.LFE0:
        .size   f, .-f
        .comm   xx,4,4
        .ident  "GCC: (GNU) 9.1.0"
        .section        .note.GNU-stack,"",@progbits

The two instructions after .L4 could be optimized to
        movl    $0, xx
by observing that for i < 0, i % 7 is <= 0 and therefore never == 3.


More information about the Gcc-bugs mailing list