https://gcc.gnu.org/bugzilla/show_bug.cgi?id=82889
Bug ID: 82889 Summary: Unnecessary sign extension of int32 to int64 Product: gcc Version: unknown Status: UNCONFIRMED Severity: normal Priority: P3 Component: rtl-optimization Assignee: unassigned at gcc dot gnu.org Reporter: hiraditya at msn dot com Target Milestone: --- $ cat t.cpp #include <stdint.h> int lol(int32_t* table, int32_t* ht, uint32_t hash, uint32_t mask) { for (uint64_t probe = (uint32_t)hash & mask, i = 1;; ++i) { int32_t pos = ht[probe]; if (pos >= 0) { if (table[pos] == 42) { return true; } } else if (pos & 1) { return false; } probe += i; probe &= mask; } // notreached } compile with: gcc -std=c++11 -O3 -s -o - lol(int*, int*, unsigned int, unsigned int): andl %ecx, %edx movl $1, %r8d movl %ecx, %ecx jmp .L5 .L10: cmpl $42, (%rdi,%rax,4) je .L9 .L4: addq %r8, %rdx addq $1, %r8 andq %rcx, %rdx .L5: movslq (%rsi,%rdx,4), %rax #<------------sign extended testl %eax, %eax jns .L10 testb $1, %al je .L4 xorl %eax, %eax ret .L9: movl $1, %eax ret Is it possible to get rid of this?