[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