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

            Bug ID: 94643
           Summary: [x86_64] gratuitous sign extension of nonnegative
                    value from 32 to 64 bits
           Product: gcc
           Version: unknown
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: target
          Assignee: unassigned at gcc dot gnu.org
          Reporter: bugdal at aerifal dot cx
  Target Milestone: ---

Test case:

#include <stdint.h>
uint16_t a[];
uint64_t f(int i)
{
        return a[i]*16;
}

Produces:

        movslq  %edi, %rdi
        movzwl  a(%rdi,%rdi), %eax
        sall    $4, %eax
        cltq
        ret

The value is necessarily in the range [0,1M) (in particular, nonnegative) and
operation on eax has already cleared the upper bits of rax, so cltq is
completely gratuitous. I've observed the same in nontrivial examples where
movslq gets used.

Reply via email to