https://gcc.gnu.org/bugzilla/show_bug.cgi?id=113894
Bug ID: 113894 Summary: `(x ^ (-CMP)) + CMP` -> `CMP ? -x : x` Product: gcc Version: 14.0 Status: UNCONFIRMED Keywords: missed-optimization Severity: enhancement Priority: P3 Component: tree-optimization Assignee: unassigned at gcc dot gnu.org Reporter: pinskia at gcc dot gnu.org Target Milestone: --- Take: ``` int f(int *x, int *y) { for(int i = 0 ; i < 1024; i++) { int c = (y[i] == 123); x[i] = (x[i] ^ -c) + c; // a ^ [0,-1] + [0,1] } } int fa(int *x, int *y) { for(int i = 0 ; i < 1024; i++) { int c = -(y[i] == 123); x[i] = (x[i] ^ c) - c; // a ^ [0, -1] - [0,-1] } } int f1(int *x, int *y) { for(int i = 0 ; i < 1024; i++) { int c = y[i] == 123; x[i] = c ? -x[i] : x[i]; } } ``` These all should be optimized to f1. When the CMP is `(x[i] <0)`, this should be optimized into ABS.