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

            Bug ID: 127034
           Summary: wrong code at -O1 and above on x86_64-linux-gnu
                    (generated code hangs)
           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/b16TPPzbe

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

[546] % 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 20260823 (experimental) [master r17-1628-gd1c12591336] (GCC) 
[547] % 
[547] % gcctk -O0 small.c; ./a.out
[548] % 
[548] % gcctk -O1 small.c
[549] % timeout -s 9 5 ./a.out
Killed
[550] % cat small.c
struct {
  long d;
} aa, *ab;
struct {
  int d;
} ac, *ad;
int f[256];
int p, x, y, g, h = -247, t, ae, af = -200, ag, ah, ai, aj, ak, al, am, an, ao,
                ap = -25, aq, ar, as, at, au, av = -791414350, aw = -225308568,
                ax, ay, az, ba = -63, bb, bc;
short d = -100, w, bd, be, bf, bg, bh, bi, bj, bk, bl, bm, bn = -50, bo, bp,
bq,
      br, bs = -119;
double e, k = -1.125, z = -3.75;
long n, bt, bu = -50, bv, bw, bx, by, bz, ca, cb = -287750997381;
int *q, *r, *cc, *cd;
int **s, **ce, **cf;
char cg, ch, ci, cj, ck, cl, cm = -119, cn, co = -80, cp = -97, cq, cr, cs;
float ct, cu, cv;
long *cw, *cx;
char *cy;
char *cz;
char **da;
int db(int dc, int dd) {
  for (int i = 0; i < 256; ++i) {
    unsigned c = i;
    for (int j = 0; j < 8; ++j)
      c = c & 1 ? c >> 1 ^ 3988292384 : c >> 1;
    f[i] = c;
  }
  unsigned l = dc;
  int m = dd;
  for (int b = 0; b < 4; ++b) {
    char a = m;
    m >>= 8;
    l = l >> 8 ^ f[(l ^ a) & 255];
  }
  return l;
}
char de(char dc, char dd) {
  char o = dc % dd + dd;
  return o;
}
void df(int dc) {
  int u = -369594442 + dc;
v:
  p = 83985218 * dc + ~u - ~dc;
  if ((unsigned long)p << 44)
    goto v;
}
int dg(char, short, int, short, short, float);
int dj(char dc, long dd, long dk, long dl, int dm, long dn) {
  int u = -178, v = -61;
  g = -181;
  q = &u;
  s = &r;
  *q = -8888384 * u;
  *q = (-2129816861 | u) + 403497516 - 2377690 * v;
  *s = &u;
  x = ~u;
  e = -2147483391 + k;
  v = -1073856466 - -12;
  n = 1073856729 - ~dd - ~dk;
  y = 1 - 2147483128;
  t = db(0, h);
  t = db(t, 2147483647);
  t = db(t, g);
  t = db(t, x);
  t = db(t, y);
  t = db(t, (long)((unsigned long)d << 48) >> 48);
  t = db(t, e);
  t = db(t, u);
  t = db(t, h);
  t = db(t, 2147483647);
  t = db(t, g);
  t = db(t, 0);
  t = db(t, v);
  t = db(t, k);
  t = db(t, n);
  t = db(t, (long)((unsigned long)dc << 56) >> 56);
  t = db(t, dd);
  t = db(t, dk);
  t = db(t, dl);
  t = db(t, dm);
  t = db(t, 0);
  t = db(t, dn);
  t = db(t, *q);
  t = db(t, *r);
  return t;
}
int fn6(int dc, long dd) {
  br = -238;
  bq = -23380;
  bp = -215;
  cz = &cq;
  bm = bo = ~bl;
  cv = 134217726;
  ca = (long)1728053634 - -1739533229;
  *cz = 2 + 128;
  da = &cy;
  *da = cz;
  bb = 27 - -9938901 - 30;
  bc = db(0, ca);
  bc = db(bc, bm);
  bc = db(bc, 636);
  bc = db(bc, 23);
  bc = db(bc, (long)((unsigned long)bn << 48) >> 48);
  bc = db(bc, z);
  bc = db(bc, 6683);
  bc = db(bc, 1);
  bc = db(bc, (long)((unsigned long)bs << 48) >> 48);
  bc = db(bc, bo);
  bc = db(bc, 52);
  bc = db(bc, (long)((unsigned long)br << 48) >> 48);
  bc = db(bc, (long)((unsigned long)bq << 48) >> 48);
  bc = db(bc, (long)((unsigned long)bp << 48) >> 48);
  bc = db(bc, cb);
  bc = db(bc, 54);
  bc = db(bc, 524287);
  bc = db(bc, cv);
  bc = db(bc, 0);
  bc = db(bc, (long)((unsigned long)cq << 56) >> 56);
  bc = db(bc, 13);
  bc = db(bc, ba);
  bc = db(bc, 670905315);
  bc = db(bc, bb);
  bc = db(bc, dc);
  bc = db(bc, 0);
  bc = db(bc, dd);
  bc = db(bc, 0);
  bc = db(bc, 0);
  bc = db(bc, 0);
  bc = db(bc, 0);
  cr = *cy;
  bc = db(bc, (long)((unsigned long)cr << 56) >> 56);
  cs = *cz;
  bc = db(bc, (long)((unsigned long)cs << 56) >> 56);
  return bc;
}
void fn7(int dc, int dd) {
  bt = 87 - bu;
  am = (long)((unsigned long)dc << 40) >> 40;
  an = dd ^ am ^ bt;
  ao = -1103093602 ^ an;
  df(-5 ^ ao);
}
int fn8(short dc, int dd, short dk, long dl, float dm, char dn) {
  cl = -104;
  ck = -72;
  cj = -98;
  ci = -9;
  cx = &bv;
  ab = &aa;
  be = 13824 - dc;
  bd = (dk + 26967) ^ 2428;
  bi = bd & 2428;
  bh = ~bi;
  bj = ~bd;
  bf = ~2428;
  bk = bj & bf;
  bg = ~bk;
  bd = bg & bh;
  *cx = -1290752172;
  ch = dn - 122;
  cw = &ab->d;
  cn = dn + de(dn - -24 * dn, dn - -67 + (-53 & dn));
  aq = -2 * dd - 299384 * dd;
  *cw = -619679627 + ~bv;
  cg = -47 + cn;
  ct = (0 == 0 ? dm : d) - 8189;
  as = dg(18, -26033, 8385536, -20992, 2048, -536870912.0f) - 678182947;
  ar = db(0, dl);
  ar = db(ar, (long)((unsigned long)cm << 56) >> 56);
  ar = db(ar, (long)((unsigned long)cl << 56) >> 56);
  ar = db(ar, (long)((unsigned long)ck << 56) >> 56);
  ar = db(ar, (long)((unsigned long)cg << 56) >> 56);
  ar = db(ar, (long)((unsigned long)cj << 56) >> 56);
  ar = db(ar, 127);
  ar = db(ar, (long)((unsigned long)ci << 56) >> 56);
  ar = db(ar, (long)((unsigned long)ch << 56) >> 56);
  ar = db(ar, dd);
  ar = db(ar, bd);
  ar = db(ar, cn);
  ar = db(ar, ct);
  ar = db(ar, aa.d);
  ar = db(ar, ap);
  ar = db(ar, (long)((unsigned long)co << 56) >> 56);
  ar = db(ar, 17);
  ar = db(ar, bv);
  ar = db(ar, be);
  ar = db(ar, aq);
  ar = db(ar, dc);
  ar = db(ar, as);
  ar = db(ar, (long)((unsigned long)dk << 48) >> 48);
  ar = db(ar, dl);
  ar = db(ar, dm);
  ar = db(ar, 0);
  ar = db(ar, (long)((unsigned long)dn << 56) >> 56);
  bw = *cw;
  ar = db(ar, bw);
  bx = *cx;
  ar = db(ar, bx);
  return ar;
}
int dg(char dc, short dd, int dk, short dl, short dm, float dn) {
  au = -9;
  at = -145;
  int t60, t61 = -1;
  long t62, t63, t64;
  ce = &cc;
  cf = &cd;
  ad = &ac;
  *ce = *cf = &ad->d;
  cu = 8.0f * dn;
  t60 = -1276660795 + 15 * t61;
dh:
  az = fn6(1612300524 - 1612300493, 4294966752) - 1029364274;
  t61 = az - by;
  by = -1073741822 + ((long)((unsigned long)cp << 56) >> 56);
  cp = 0;
  t62 = cu;
  t63 = t60 ^ t62;
  bz = -1276660810 ^ t63;
  t64 = 3018306486 ^ t63;
  bz = bz & t64;
  ay = dj(-64, -548682072064 ^ bz, -547608330270, 403726925359, 430,
          4611686016279904320) -
       13960317;
  *cc = ay - t61;
  if (-2143289344 + ~by <= 1077936121 + 2 * by)
    goto di;
  goto dh;
di:
  cp = -19 + dc;
  *cc = 3714416 * t61 + *cc;
  ax = db(0, by);
  ax = db(ax, ac.d);
  ax = db(ax, 0);
  ax = db(ax, 773789);
  ax = db(ax, 1612300524);
  ax = db(ax, 2056307494);
  ax = db(ax, 47);
  ax = db(ax, 143);
  ax = db(ax, av);
  ax = db(ax, au);
  ax = db(ax, 190);
  ax = db(ax, at);
  ax = db(ax, t60);
  ax = db(ax, aw);
  ax = db(ax, t61);
  ax = db(ax, 0);
  ax = db(ax, 2.0f);
  ax = db(ax, 0);
  ax = db(ax, 0);
  ax = db(ax, cp);
  ax = db(ax, t61);
  ax = db(ax, dc);
  ax = db(ax, (long)((unsigned long)dd << 48) >> 48);
  ax = db(ax, dk);
  ax = db(ax, (long)((unsigned long)dl << 48) >> 48);
  ax = db(ax, (long)((unsigned long)dm << 52) >> 52);
  ax = db(ax, dn);
  ax = db(ax, *cc);
  ax = db(ax, *cd);
  return ax;
}
int main() {
  w = al = fn8(2192, -5058, -14627, 32, 32797.0f, 79 - 83) + 1422840203;
  ag = w - al;
  ae = af - 524018;
  ah = (long)((unsigned long)ae << 44) >> 44;
  ai = ah % 46337 + 46337;
  aj = ag;
  ak = 20842 * ai % 46337;
  aj = aj + ak;
  fn7(-8380400, aj - 3337 + 1103101959);
}

Reply via email to