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

            Bug ID: 120516
           Summary: [15/16 Regression] wrong code at O3 with
                    "-fno-tree-slsr -fno-ipa-cp -fno-inline" from 15.1 and
                    above on x86_64
           Product: gcc
           Version: 15.1.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c
          Assignee: unassigned at gcc dot gnu.org
          Reporter: congli at smail dot nju.edu.cn
  Target Milestone: ---

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

It fails at 15.* and above, and should be a regression from 14.*.

Not sure if it is a dup of https://gcc.gnu.org/bugzilla/show_bug.cgi?id=119872.
There are some similarities and differences between this one and 119872:

They both fail at -O{1,2,s} (even with "-fno-tree-slsr -fno-ipa-cp
-fno-inline"). This one also fails at -O3 (even with the same flags). 119872
doesn't fail at -O3 at all.


```
$ cat a.c
unsigned b[256], *c = b;
int d, e, f, g, h, l, ab, m, ae, n, af, ag, ah, ai, aj, o = -1, p, q = -1;
unsigned aa(unsigned t, char u) { return t >> 8 ^ b[(t ^ u) & 255]; }
unsigned k(unsigned t, unsigned u) {
  p = t >> 8 ^ b[(t ^ u) & 255];
  t = p;
  t = aa(t, u >> 8);
  t = aa(t, u >> 16);
  t = aa(t, u >> 4);
  return t;
}
int ac(int t) {
  d = -t - 1;
  f = (-1 - 1) * d - 1;
  int a[] = {g, d, e, t, f};
  unsigned ad = -1;
  for (int i = 0; i < 5; ++i)
    ad = k(ad, a[i]);
  ad = (ad ^ -1) % 2147483647;
  return ad;
}
int r(int t, int u, int v, int w, int x, int y, int z, int ak) {
  l = (ac(-2) - 58245758) * u;
  m = 1 - l - 1;
  ab = (ac(-1) - 1270062073) * w - 1;
  w = -z - w - 1;
  int a[] = {t, u, v, w, h, x, y, m, z, l, ab, ak};
  unsigned ad = -1;
  for (int i = 0; i < 12; ++i)
    ad = k(ad, a[i]);
  ad = (ad ^ -1) % 2147483647;
  return ad;
}
int am(int t, int u) {
  int s = -999 * t - 2147483647;
  if (t)
  al:
    t = r(-1, -1, -1, -1, -1, -1, -1, -1) - 92697922 - 999 * t - 2147483647;
  if ((ac(-1) - 1270062073) * t - 999 * u - 6205925 >= 0)
    goto an;
ao:
  if (n)
    s = 2147483647;
  goto al;
ap:
  t = -999 * u + t + 2144058291;
  if (-999 * t + 4 >= 0) {
    s = -999 * s - 998 * t - 2147483647;
    n = -999 - 999 * s - 1868323085;
    goto ao;
  }
an:
  ae = -999 * n - t - 2147483647;
  if ((r(-1, 1, -1, 1, 0, 1, 1, 1) - 131488391) * ae - 6443399 >= 0)
    goto ap;
  for (int i = 0; i < 5; ++i)
    o = k(o, s);
  o = o ^ 4294967295;
  return o;
}
int aq(int t, int u) {
  af = -1;
  int a[] = {f, t, af, u, ag};
  for (int i = 0; i < 5; ++i)
    q = k(q, a[i]);
  q = q ^ 4294967295;
  return q;
}
int main() {
  for (unsigned i = 0; i < 256; i++) {
    unsigned ar = i;
    for (int j = 8; j; j--)
      if (ar & 1)
        ar = ar >> 1 ^ 3988292384;
      else
        ar >>= 1;
    c[i] = ar;
  }
  ai = aq(-1, 1) - 1410405933;
  if ((am(-2149633, 1) - 836646560) * ai >= 0)
    aj = -2002;
  ah = (r(-1, -1, -1, -1, -1, -1, -1, -1) - 92696925) * aj;
  if ((ac(-1) - 1270062074) * ah >= 0)
    __builtin_abort();
}
$ gcc -O3 -fno-tree-slsr -fno-ipa-cp -fno-inline a.c
$ ./a.out
Aborted
```

Reply via email to