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

            Bug ID: 68282
           Summary: Optimization fails to remove unnecessary sign
                    extension instruction
           Product: gcc
           Version: 6.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: other
          Assignee: unassigned at gcc dot gnu.org
          Reporter: stanshebs at earthlink dot net
  Target Milestone: ---

For the code

int table[256];

int func(unsigned char c)
{
  return table[(c >> 2) + 1];
}

x86-64 gcc -m64 -O2 generates

        movzbl  %dil, %eax
        sarl    $2, %eax
        addl    $1, %eax
        cltq
        movl    table(,%rax,4), %eax
        ret

where the cltq is not really needed.

Current Clang produces

        shrl    $2, %edi
        incl    %edi
        movl    table(,%rdi,4), %eax
        retq

which is more like what we would want.

Reply via email to