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

Reply via email to