https://gcc.gnu.org/bugzilla/show_bug.cgi?id=127357
Bug ID: 127357
Summary: signed_integer_sat_add single-AND recognizer
over-fires and cause miscompile
Product: gcc
Version: 17.0
Status: UNCONFIRMED
Keywords: wrong-code
Severity: normal
Priority: P3
Component: tree-optimization
Assignee: unassigned at gcc dot gnu.org
Reporter: kyuwoncho18 at gmail dot com
Target Milestone: ---
Reproduction:
```
#include <stdio.h>
#define C1 1
#define C3 2
static signed char idiom(signed char x){
signed char sum = (signed char)((unsigned char)x + (unsigned char)C1);
signed char t1 = (signed char)(x ^ sum);
signed char t2 = (signed char)(x ^ C3);
signed char c = (signed char)(t1 & t2);
signed char satval = (signed char)((signed char)(-(signed char)(x < 0)) ^
(signed char)127);
return (c < 0) ? satval : sum;
}
#define N 256
static signed char in[N];
static signed char out[N];
__attribute__((noipa))
static void loop(signed char *r, const signed char *a, int n){
for(int i=0;i<n;i++) r[i]=idiom(a[i]);
}
int main(void){
for(int i=0;i<N;i++) in[i]=(signed char)(i-128); /* covers -128..127 */
loop(out, in, N);
printf("out[X=127]=%d\n", out[255]);
return 0;
}
```
STDOUT:
O0/1/2: out[X=127]=-128
O3: out[X=127]=127
Godbolt: https://gcc.godbolt.org/z/GKzMYMe14
Reproduced between 15.1 to trunk