https://gcc.gnu.org/bugzilla/show_bug.cgi?id=90094
Bug ID: 90094 Summary: better handling of x == LONG_MIN on x86-64 Product: gcc Version: 9.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: target Assignee: unassigned at gcc dot gnu.org Reporter: drepper.fsp+rhbz at gmail dot com Target Milestone: --- Compile the following on x86-64: unsigned f(long a) { return a == LONG_MIN; } The result for -O3 is: f: movabs $0x8000000000000000,%rax cmp %rax,%rdi sete %al movzbl %al,%eax retq With -Os it looks like this: f: mov $0x1,%eax shl $0x3f,%rax cmp %rax,%rdi sete %al movzbl %al,%eax retq I think for both optimization directions the code should be compiled as if for this: unsigned f(long a) { long r; return __builtin_sub_overflow(a, 1, &r); } This compiled to f: xor %eax,%eax add $0xffffffffffffffff,%rdi seto %al retq This should be faster and is definitely shorter than even the -Os version. For 32-bit x86 the problem doesn't exist is this form, I think. But it might apply to some RISC targets as well.