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

            Bug ID: 127981
           Summary: wrong code at -O3 with "-fno-tree-pre
                    -fno-move-loop-stores -fno-tree-forwprop
                    -fno-tree-dominator-opts" on x86_64-linux-gnu
           Product: gcc
           Version: 17.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/xqeoPWh9P

Note:
- fails: 15.1 till trunk
- works: 14.4 and earlier

[511] % 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++,lto --disable-werror
--disable-multilib
Thread model: posix
Supported LTO compression algorithms: zlib
gcc version 17.0.0 20261018 (experimental) [master r17-1628-gd1c12591336] (GCC) 
[512] % 
[512] % gcctk -O3 small.c; ./a.out
[513] % 
[513] % gcctk -O3 -fno-tree-pre -fno-move-loop-stores -fno-tree-forwprop
-fno-tree-dominator-opts small.c
[514] % ./a.out
Floating point exception
[515] % 
[515] % cat small.c
short t, o, aa, ab, ac, ad, ae, af, ag, ah, ai = -28404, aj, w, ak = -189, al,
                                            am, *ca, *cb, *cc, **ch;
int u, m, p = -360738, an, ao, ap, aq, ar, as, at = -196, au = -1, av, aw, ax,
          v, y, ay, az, ba, bb, *cp, cq[3], **cr, (*cs)[];
long d, e, f, l, q = -98, r = -7182853913501426594, bc = -209, bd, be, bf, bg,
                 bh, bi = -4847902687898551683, bj, bk, bl, bm,
                 bn = -358475941255374663, bo, x, *bz, **cd;
char s = -16, bp = -84, bq, br, bs, bt, bu, bv, bw, bx, by, *co;
float ce, cf, *cg;
double ci, cj, ck, cl, cm, cn;
int ct(int cu, int cv) {
  int g[256];
  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;
    g[h] = c;
  }
  unsigned j = cu;
  int k = cv;
  for (int b = 0; b < 4; ++b) {
    char a = k;
    k >>= 8;
    j = j >> 8 ^ g[(j ^ a) & 255];
  }
  return j;
}
int cw(char cu, long cv, int de, int df, short dg, long dh) {
  ca = &aa;
  cd = &bz;
  *ca = 15005 + dg;
  bq = 127 - -13 * cu;
  *cd = &r;
  o = aa + 299 * aa;
  aa = 10254;
  an = ct(0, (long)((unsigned long)o << 48) >> 48);
  an = ct(an, q);
  an = ct(an, 165);
  an = ct(an, r);
  an = ct(an, (long)((unsigned long)p << 44) >> 44);
  an = ct(an, 223);
  an = ct(an, (long)((unsigned long)bp << 56) >> 56);
  an = ct(an, (long)((unsigned long)s << 56) >> 56);
  an = ct(an, -1799859710);
  an = ct(an, 64);
  an = ct(an, 0);
  an = ct(an, bc);
  an = ct(an, 50008);
  an = ct(an, 1);
  an = ct(an, bq);
  an = ct(an, 31);
  an = ct(an, aa);
  an = ct(an, (long)((unsigned long)cu << 56) >> 56);
  an = ct(an, cv);
  an = ct(an, de);
  an = ct(an, df);
  an = ct(an, (long)((unsigned long)dg << 48) >> 48);
  an = ct(an, dh);
  an = ct(an, 0);
  bd = *bz;
  an = ct(an, bd);
  ab = *ca;
  an = ct(an, ab);
  return an;
}
void cx(int);
int cy(long, short, long, float, char);
void cz(int cu, short cv) {
  ar = -1644167425 ^ cu;
  if (510 - ar - 2048 % cv != cv + 1535)
    bk = 8 % bj;
}
int da(short, int, long, long, char, char);
int db(short cu, long cv, float de, char df, char dg, long dh) {
  ck = cm = cn = -1.0;
  bw = -34;
  bx = -127;
  by = -121;
  cc = &aj;
  aj = 16247 - 160;
  cl = cu ? -3.75 : 0.625;
  ax = (long)((unsigned long)dg << 56) >> 56;
  bv = df - dg;
  *cc = -3493 + aj;
  cj = ax - 15903378;
  bo = cv - ~bm;
  v = ct(0, 203);
  v = ct(v, (long)((unsigned long)ai << 48) >> 48);
  v = ct(v, bn);
  v = ct(v, ax);
  v = ct(v, 2.5);
  v = ct(v, cj);
  v = ct(v, 0);
  v = ct(v, 8.0);
  v = ct(v, ck);
  v = ct(v, cl);
  v = ct(v, cm);
  v = ct(v, cn);
  v = ct(v, bo);
  v = ct(v, 1.5f);
  v = ct(v, 0);
  v = ct(v, (long)((unsigned long)bv << 56) >> 56);
  v = ct(v, (long)((unsigned long)bw << 56) >> 56);
  v = ct(v, 111);
  v = ct(v, (long)((unsigned long)bx << 56) >> 56);
  v = ct(v, (long)((unsigned long)by << 56) >> 56);
  v = ct(v, aj);
  v = ct(v, ax);
  v = ct(v, (long)((unsigned long)cu << 48) >> 48);
  v = ct(v, 0);
  v = ct(v, cv);
  v = ct(v, de);
  v = ct(v, (long)((unsigned long)df << 56) >> 56);
  v = ct(v, (long)((unsigned long)dg << 56) >> 56);
  v = ct(v, dh);
  w = *cc;
  v = ct(v, w);
  v = ct(v, 1.5f);
  return v;
}
int dc(int cu, char cv, char de, char df, int dg) {
  short di = 3, dj;
  short *dk;
  int *dl;
  short **dm;
  cr = &dl;
  dm = &dk;
  while (1) {
    dj = 5 * di + (f ? di : 1);
    dl = &bb;
    *dm = &dj;
    *dl = 369;
    *dk = 32767 - (dj > 0 ? 28672 : 9) - 6143;
    ay = -1876541446 - ((long)((unsigned long)dj << 48) >> 48);
    cs = &cq;
    di = dj - 15 * dj;
    al = di - 24462 - ~dj;
    if ((7 | x) > 0)
      break;
  }
  az = 3630832 * bb;
  y = 268820321 | bb;
  if (di + (-4 ^ di) == 0) {
    dm = &dk + 9;
    cr = &dl + 2;
    dk = *dm;
  }
  *dl = 1339777037 - az;
  dj = 0;
  *cr = *cs + 2;
  *dl = 268435456;
  ba = ct(0, bb);
  ba = ct(ba, y);
  ba = ct(ba, 122);
  ba = ct(ba, di);
  ba = ct(ba, ay);
  ba = ct(ba, al);
  ba = ct(ba, (long)((unsigned long)ak << 48) >> 48);
  ba = ct(ba, az);
  ba = ct(ba, 0);
  ba = ct(ba, 88);
  ba = ct(ba, 0);
  ba = ct(ba, cq[2]);
  ba = ct(ba, (long)((unsigned long)cu << 44) >> 44);
  ba = ct(ba, (long)((unsigned long)cv << 56) >> 56);
  ba = ct(ba, (long)((unsigned long)de << 56) >> 56);
  ba = ct(ba, (long)((unsigned long)df << 56) >> 56);
  ba = ct(ba, dg);
  ba = ct(ba, 0);
  am = *dk;
  ba = ct(ba, am);
  ba = ct(ba, *dl);
  return ba;
}
void dd() {
  int n = cy(-9223372030209757036, 1, 52586086183, 4198366.0f, 63) +
1850441282;
  t = -32559 - 209;
  d = (long)((unsigned long)((long)((unsigned long)n << 32) >> 32) << 16) >>
16;
  e = d % 11863279 + 11863279;
  l = 6235259 * e % 11863279;
  f = l + 8366462;
  m = cw(-2, 557308908, 279462, 1040712246, t + 17680,
         f - 9153552 + 4291797271) -
      1660983448;
  u = m + 292610057 - -48242688;
  cx(u - 1438659904);
}
void cx(int cu) {
  be = (long)((unsigned long)cu << 32) >> 32;
  bf = 182471382;
  bg = 729295598 * be % 3037000493;
  bf = bf + bg;
  cy(bf - 716491929 - 2030209757036, 0, 0, 0, 0);
}
int cy(long cu, short cv, long de, float df, char dg) {
  cg = &ce;
  ag = (unsigned long)cu << 52 >> 52;
  ah = 148 ^ ag;
  cz(1644167424, -1536 ^ ah);
  ch = &cb;
  ac = 9118 - 6;
  ao = -260088 - (-287223 - 130893);
  ce = cv;
  *ch = &ae;
  ad = 10096 + 32768 - cu;
  ae = ac + ad;
  bh = 529025200 - 156183573 * de;
  aq = da(-2015, -294912, 1074036764, -9223372033633550307, -69, dg - 53) +
       1946427497;
  ap = aq;
  ap = ct(ap, ac);
  ap = ct(ap, cv);
  ap = ct(ap, 59);
  ap = ct(ap, 0);
  ap = ct(ap, bh);
  ap = ct(ap, bi);
  ap = ct(ap, (long)((unsigned long)ad << 48) >> 48);
  ap = ct(ap, (long)((unsigned long)ae << 48) >> 48);
  ap = ct(ap, ao);
  ap = ct(ap, cv);
  ap = ct(ap, cu);
  ap = ct(ap, cv);
  ap = ct(ap, de);
  ap = ct(ap, 0);
  ap = ct(ap, df);
  ap = ct(ap, dg);
  ap = ct(ap, 0);
  af = *cb;
  ap = ct(ap, (long)((unsigned long)af << 48) >> 48);
  cf = *cg;
  ap = ct(ap, cf);
  return ap;
}
int da(short cu, int cv, long de, long df, char dg, char dh) {
  co = &br;
  cp = &as;
  br = -58 - -5 * dh;
  bl = -1073706853 - df;
  bs = dh + 14 % br;
  bu = *co;
  as = dc(-523904, 128, bu - 120, 128, -1) + 954115498;
  br = bs - -40;
  ci = cv + 262144;
  aw = db(32768, ci + 9223372032626429952, -28.971189498901367f, dg + 61, -2,
          -32756) +
       366892435;
  av = ct(0, ci);
  av = ct(av, 56);
  av = ct(av, as);
  av = ct(av, (long)((unsigned long)bs << 56) >> 56);
  av = ct(av, bl);
  av = ct(av, au);
  av = ct(av, (long)((unsigned long)at << 40) >> 40);
  av = ct(av, 246);
  av = ct(av, (long)((unsigned long)cu << 52) >> 52);
  av = ct(av, aw);
  av = ct(av, de);
  av = ct(av, df);
  av = ct(av, (long)((unsigned long)dg << 56) >> 56);
  av = ct(av, 0);
  av = ct(av, (long)((unsigned long)dh << 56) >> 56);
  bt = *co;
  av = ct(av, bt);
  av = ct(av, *cp);
  return av;
}
int main() { dd(); }

Reply via email to