https://gcc.gnu.org/bugzilla/show_bug.cgi?id=121992

            Bug ID: 121992
           Summary: wrong code at -O2 on x86_64-linux-gnu
           Product: gcc
           Version: 16.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c
          Assignee: unassigned at gcc dot gnu.org
          Reporter: iamanonymous.cs at gmail dot com
  Target Milestone: ---

This code returns 0 at -O0/1/s/3 and 1 at -O2:

$cat case.c
```
int a, b, c, d;
int e(int f, int g) {
  if (g & (b | c | a))
    return 0;
  switch (f) {
  case 4:
    return d;
  default:
    return 0;
  }
}
typedef struct {
  unsigned short h : 1;
  unsigned short i : 1;
  unsigned short j : 1;
  unsigned short k : 1;
  unsigned short l : 1;
  unsigned short m : 1;
  unsigned short n : 1;
  unsigned short o : 1;
  unsigned short q : 1;
  unsigned short r : 1;
  unsigned short s : 1;
  unsigned short t : 1;
  unsigned short u : 1;
} v;
v w = {0, 0, 1, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1};
unsigned short *p = (unsigned short *)&w;
int main() {
  w.h = 1;
  return (short)(e(*p, 3) + *p - 4661) + *p == 4661 ? 0 : 1;
}
```

Compiler Explorer: https://godbolt.org/z/o6oPr4bTE

Reply via email to