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

            Bug ID: 125873
           Summary: wrong code at -O{2,3} with
                    "-fno-aggressive-loop-optimizations" on
                    x86_64-linux-gnu
           Product: gcc
           Version: 16.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: tree-optimization
          Assignee: unassigned at gcc dot gnu.org
          Reporter: zhendong.su at inf dot ethz.ch
  Target Milestone: ---

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

Note:
- fails: trunk
- works: 16.1 and earlier

[544] % gcctk -v
Using built-in specs.
COLLECT_GCC=gcctk
COLLECT_LTO_WRAPPER=/local/home/suz/suz-local/software/local/gcc-trunk/bin/../libexec/gcc/x86_64-pc-linux-gnu/17.0.0/lto-wrapper
Target: x86_64-pc-linux-gnu
Configured with: ../gcc-trunk/configure --disable-bootstrap
--enable-checking=yes --prefix=/local/suz-local/software/local/gcc-trunk
--enable-sanitizers --enable-languages=c,c++ --disable-werror --enable-multilib
Thread model: posix
Supported LTO compression algorithms: zlib
gcc version 17.0.0 20260617 (experimental) (GCC) 
[545] % 
[545] % gcctk -O3 small.c; ./a.out
[546] % gcctk -O3 -fno-aggressive-loop-optimizations small.c
[547] % ./a.out
Aborted
[548] % cat small.c
int (*bg)[1], d[256], e, g, m, aa, ad, ae, af, ag, al, ao, *as, bd[1], **bf,
bj, *bk;
double n, o, v, *t, *u;
short p, q, ap , aq, at, *be;
long r, ak, am = 1, au, aw, ax, *ar;
float s, an;
int f(int w, int x) {
  for (int h = 0; h < 256; ++h) {
    unsigned c = h;
    for (int i = 0; i < 8; ++i)
      c = c & 1 ? c >> 1 ^ 3988292384 : c >> 1;
    d[h] = c;
  }
  unsigned j = w;
  int k = x;
  for (int b = 0; b < 4; ++b) {
    char ab = k;
    k >>= 8;
    j = j >> 8 ^ d[(j ^ ab) & 255];
  }
  return j;
}
int l(short, int, short, signed char);
int ac(int w, long x, short y, double z) {
  t = u = &n;
  *t = 33554432 + 0.5 * z;
  g = 1115684881 + 2;
  goto ah;
ai:
  s = 1;
  *t = 33554431 + n;
  q = -16444 + y;
ah:
  e = g - 1107288138;
  g = 1124081691 - e;
  p = y - 24577 + 32767;
  if (-687865928 > (s <= 0 ? 8396780 : e) + 938452413 - 1634715120)
    goto aj;
  r = -424148993;
  goto ai;
aj:
  m = f(0, e);
  m = f(m, n);
  m = f(m, g);
  m = f(m, (long)((unsigned long)q << 48) >> 48);
  m = f(m, p);
  m = f(m, 1);
  m = f(m, 1);
  m = f(m, 1346895871);
  m = f(m, r);
  m = f(m, 1);
  m = f(m, 1);
  m = f(m, 1);
  m = f(m, 1);
  m = f(m, s);
  m = f(m, 0);
  m = f(m, w);
  m = f(m, x);
  m = f(m, y);
  m = f(m, z);
  m = f(m, 0);
  o = *t;
  m = f(m, o);
  v = *u;
  m = f(m, v);
  return m;
}
int av(double w, char x, char y, long z, char bh, double bi) {
  aa = l(277, -339221, -139, -1) - 2106012624;
  ar = &am;
  if (aa > 0)
    aa = 36 + am;
  ad = 2 * aa;
  *ar = 4085 + z;
  as = &af;
ay:
  af = -1757186252 + aa;
  if (-62922765 >= -385094381 + (334762732 | am))
    goto az;
  goto ba;
az:
  ak = 1679818691 - (-1612709885 - 134217777 * am);
  an = aa;
  goto bb;
ba:
  am = -4198400 + *ar - 1;
  ae = x - 2 * aa;
  if (bh <= -x)
    goto bc;
  goto ay;
bc:
  l(0, 0, 0, 0);
bb:
  aa = 1421641676 + z;
  *ar = z + x - 1008053616 * am;
  ag = f(0, ak);
  ag = f(ag, 1);
  ag = f(ag, 1);
  ag = f(ag, 0);
  ag = f(ag, aa);
  ag = f(ag, am);
  ag = f(ag, an);
  ag = f(ag, ad);
  ag = f(ag, 1);
  ag = f(ag, af);
  ag = f(ag, ae);
  ag = f(ag, w);
  ag = f(ag, x);
  ag = f(ag, (long)((unsigned long)y << 56) >> 56);
  ag = f(ag, z);
  ag = f(ag, (long)((unsigned long)bh << 56) >> 56);
  ag = f(ag, bi);
  au = *ar;
  ag = f(ag, au);
  ag = f(ag, *as);
  return ag;
}
int l(short w, int x, short y, signed char z) {
  al = ac(1, -9223372033633550340, 1, -2147483584.0) + 1289304968;
  be = &aq;
  bg = &bd;
  bk = *bg;
  goto bl;
bm:
  *bf = &bj;
  *be = y - -301 + 1246 * aq;
  ax = 1441800 + 535724087 + al;
  goto bb;
bl:
  bj = -2081964028 * al;
  bf = &bk;
  al = 1900540 - 1966061  ;
  bd[0] = 474110709 - 106505 - x;
bb:
  *be = y + aq;
  *bk = 1275010899 + *bk - -129696170;
  ap = -31161 + aq;
  if (509 + (short)bj >= y )
    goto aj;
  goto bm;
aj:
  ao = f(0, bd[0]);
  ao = f(ao, ap);
  ao = f(ao, ax);
  ao = f(ao, aw);
  ao = f(ao, (long)((unsigned long)128 << 56) >> 56);
  ao = f(ao, bj);
  ao = f(ao, w);
  ao = f(ao, z);
  ao = f(ao, 0);
  ao = f(ao, *bk);
  at = *be;
  ao = f(ao, (unsigned long)at << 48 >> 48);
  return ao;
}
int main() {
  int bn = av(-61.999999761581421, 93, -2, 12, -35, -1.9999999925494194);
  if (2032191282 != bn)
    __builtin_abort();
  return 0;
}

Reply via email to