https://gcc.gnu.org/bugzilla/show_bug.cgi?id=90087
Bug ID: 90087
Summary: Suboptimal codegen for x < 0 ? x - INT_MIN : x
Product: gcc
Version: 9.0
Status: UNCONFIRMED
Keywords: missed-optimization
Severity: normal
Priority: P3
Component: tree-optimization
Assignee: unassigned at gcc dot gnu.org
Reporter: nok.raven at gmail dot com
Target Milestone: ---
Target: x86_64,AArch64
int foo(int x)
{
return x < 0 ? x - INT_MIN : x;
}
| GCC | Clang
-------+--------------------------------+-------------------------
x86-64 | movl %edi, %eax | movl %edi, %eax
| leal -2147483648(%rdi), %edx | andl $2147483647, %eax
| testl %edi, %edi |
| cmovs %edx, %eax |
-------+--------------------------------+-------------------------
ARM64 | cmp w0, 0 | and w0, w0, #0x7fffffff
| mov w1, -2147483648 |
| add w1, w0, w1 |
| csel w0, w1, w0, lt |
https://godbolt.org/z/VX0Ou2