[Bug target/94643] New: [x86_64] gratuitous sign extension of nonnegative value from 32 to 64 bits

bugdal at aerifal dot cx gcc-bugzilla@gcc.gnu.org
Sat Apr 18 00:50:08 GMT 2020


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.


More information about the Gcc-bugs mailing list