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.