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

            Bug ID: 64130
           Summary: vrp: handle non zero constant divided by range cannot
                    be zero.
           Product: gcc
           Version: 5.0
            Status: UNCONFIRMED
          Severity: enhancement
          Priority: P3
         Component: tree-optimization
          Assignee: unassigned at gcc dot gnu.org
          Reporter: andi-gcc at firstfloor dot org

The following two functions should always be optimized to return 0
because x > 0, x / a cannot be 0. But VRP misses this case for unknown 
reasons, even though it has some code for it in ranges_from_anti_range()

int fsigned(int a)
{
        return 100 / a == 0;
}

int funsigned(unsigned a)
{
        return 100 / a == 0;
}

gcc50 -fno-non-call-exceptions -O2 -S tvrpdiv.c

gcc version 5.0.0 20141111 (experimental) (GCC) 

        movl    $100, %eax
        cltd
        idivl   %edi
        testl   %eax, %eax
        sete    %al
        movzbl  %al, %eax
        ret

        xorl    %edx, %edx
        movl    $100, %eax
        divl    %edi
        testl   %eax, %eax
        sete    %al
        movzbl  %al, %eax

Reply via email to