https://gcc.gnu.org/bugzilla/show_bug.cgi?id=97711
Bug ID: 97711
Summary: Failure to optimise "x & 1 ? x - 1 : x" to "x & -2"
Product: gcc
Version: 11.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: tree-optimization
Assignee: unassigned at gcc dot gnu.org
Reporter: rsandifo at gcc dot gnu.org
Target Milestone: ---
GCC doesn't optimise the expression:
int f (int x) { return x & 1 ? x - 1 : x; }
to x & -2 (but clang does). The original motivation was actually:
char *g (char *x) { return (__UINTPTR_TYPE__) x & 1 ? x - 1 : x; }
which I guess might require a different pattern.
(And the reason for writing g that way was to do all pointer
arithmetic on pointers rather than converting to a uintptr_t,
doing arithmetic, and converting back.)