https://gcc.gnu.org/bugzilla/show_bug.cgi?id=95784
Bug ID: 95784
Summary: Failure to optimize usage of __builtin_add_overflow
with return statement properly
Product: gcc
Version: 11.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: tree-optimization
Assignee: unassigned at gcc dot gnu.org
Reporter: gabravier at gmail dot com
Target Milestone: ---
int f(uint8_t operand, int8_t *result)
{
if (__builtin_add_overflow(operand, 0, result))
{
*result = 0;
return 10213;
}
return 0;
}
With -O3, LLVM outputs this :
f(unsigned char, signed char*): # @f(unsigned char, signed char*)
movsx eax, dil
xor ecx, ecx
cmp edi, eax
cmovne edi, ecx
mov byte ptr [rsi], dil
mov eax, 10213
cmove eax, ecx
ret
GCC outputs this :
f(unsigned char, signed char*):
movzx eax, dil
movsx di, dil
cmp ax, di
setne dl
mov r8d, edx
sal r8d, 31
sar r8d, 31
and r8d, 10213
test dl, dl
mov edx, 0
cmovne eax, edx
mov BYTE PTR [rsi], al
mov eax, r8d
ret