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

            Bug ID: 127633
           Summary: wrong code at -O{2,3} with "-funroll-all-loops
                    -fno-vect-cost-model" 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/xxMf8fnzM

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

[534] % 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 20260927 (experimental) [master r17-1628-gd1c12591336] (GCC) 
[535] % 
[535] % gcctk -O3 small.c; ./a.out
[536] % 
[536] % gcctk -O3 -funroll-all-loops -fno-vect-cost-model small.c
[537] % timeout -s 9 5 ./a.out
Killed
[538] % 
[538] % cat small.c
int d, ab = -104, ac, ad = -170, ae = -51, af = -151, ag = -1966532803, ah, ai,
       aj, ak, al, am, an, *ao, v, ap, aq;
short w, y, z, ar, as, at, au, av, aw, ax = -156, ay, az, ba;
long bb = -38, bc, bd, be, bf;
double bg, bh, *bi;
char bj;
int a(int bk, int bl) {
  int f[256], j;
  unsigned i;
  for (int g = 0; g < 256; ++g) {
    unsigned c = g;
    for (int h = 0; h < 8; ++h)
      c = c & 1 ? c >> 1 ^ 3988292384 : c >> 1;
    f[g] = c;
  }
  i = bk;
  j = bl;
  for (int b = 0; b < 4; ++b) {
    char a = j;
    j >>= 8;
    i = i >> 8 ^ f[(i ^ a) & 255];
  }
  return i;
}
char k(char bk) {
  unsigned char l = bk;
  char m = __builtin_popcount(l);
  return m;
}
void n(short bk, short bl) {
  while (bl + 1419 != bk)
    ;
}
int s(long, short, short, long, int, short, int);
int t(int, int, int);
int u(long, long, short, int);
int aa(int bk, double bl, short bm, short bn, char bo, short bp, int bq,
       long br) {
  double x;
  long q, bs;
  int e, k, u, *t;
  short n = -110, o = -1894, p = -64, r;
  __attribute__((__vector_size__(2 * sizeof 0))) short s;
  t = &k;
  bs = -676560928 + br;
  q = -1501552177 - 5 * br;
  e = ~bq;
  s[0] = -64 + bm;
  x = bq + 14;
  r = p - bn;
  s[1] = r - -5;
  k = (26 << bk) + 95726060 * bq + 2147481471 / bk;
  u = a(0, bn);
  u = a(u, x);
  u = a(u, bs);
  u = a(u, br);
  u = a(u, e);
  u = a(u, k);
  u = a(u, 34);
  u = a(u, (long)((unsigned long)o << 48) >> 48);
  u = a(u, 7125);
  u = a(u, 249);
  u = a(u, 32766);
  u = a(u, (long)((unsigned long)n << 48) >> 48);
  u = a(u, (long)((unsigned long)p << 48) >> 48);
  u = a(u, q);
  u = a(u, (long)((unsigned long)r << 48) >> 48);
  u = a(u, (long)((unsigned long)s << 48) >> 48);
  u = a(u, (long)((unsigned long)s[1] << 48) >> 48);
  u = a(u, bk);
  u = a(u, bl);
  u = a(u, bm);
  u = a(u, bn);
  u = a(u, bo);
  u = a(u, (long)((unsigned long)bp << 48) >> 48);
  u = a(u, bq);
  u = a(u, br);
  u = a(u, *t);
  u = a(u, *t);
  u = a(u, 34);
  return u;
}
void q(int bk, int bl) {
  d = (-220176378 | (bl - 8)) + (-470937689 ^ bl);
  w = d;
  z = 44 * bk % 181;
  y = 16 * w % 181 + z;
  ar = bl;
  at = 135 * ar % 181;
  as = at + 77;
  n(y - 15566, as - 17014);
}
int r(char bk, long bl, long bm, char bn, long bo) {
  bf = -214;
  aq = -1;
  ap = -1057843166;
  v = -2141082991;
  ao = &ai;
  *ao = 354433036;
  be = 781899206 - bm;
  ao = &ah;
  aw = -32754;
  *ao = ~121634816 + 909623281;
  bd = 538919997 - (-571735057 | bo) - 132732435 * bl;
  au = 32767 - bo;
  ak = ((long)((unsigned long)bk << 56) >> 56) + 82;
  ac = -1497298191 / ak - 134217728 * ak - bo;
  aj = 1055653928 - (1073792974 ^ ak);
  av = 129 + ak;
  am = s(4027030896, av + 16249, av - 136, bb - 9223372032291373017, -522240,
         -1, -2048) -
       1659757192;
  al = am;
  al = a(al, ab);
  al = a(al, ac);
  al = a(al, au);
  al = a(al, 972760413);
  al = a(al, bb);
  al = a(al, ag);
  al = a(al, 1691277822);
  al = a(al, af);
  al = a(al, 28165);
  al = a(al, 363835543);
  al = a(al, ae);
  al = a(al, ai);
  al = a(al, (long)((unsigned long)aw << 48) >> 48);
  al = a(al, ad);
  al = a(al, ah);
  al = a(al, 138);
  al = a(al, av);
  al = a(al, bf);
  al = a(al, bd);
  al = a(al, -1255801593);
  al = a(al, be);
  al = a(al, aq);
  al = a(al, 3);
  al = a(al, 205);
  al = a(al, 191856929);
  al = a(al, ap);
  al = a(al, v);
  al = a(al, 2147483647);
  al = a(al, 232);
  al = a(al, aj);
  al = a(al, ak);
  al = a(al, (long)((unsigned long)bk << 56) >> 56);
  al = a(al, bl);
  al = a(al, bm);
  al = a(al, bn);
  al = a(al, bo);
  al = a(al, 232);
  al = a(al, *ao);
  return al;
}
int s(long bk, short bl, short bm, long bn, int bo, short bp, int bq) {
  int bt, bu = t(16, -1896022018, bq + 2049) - 1164145367;
  double bv, bw, *by, *bz, **ca;
  __attribute__((__vector_size__(8 * sizeof(double)))) double cb;
  cb[4] = 1.75;
  cb[5] = -8.0;
  cb[7] = 1.75;
  ca = &by;
  bt = 2048 + bu;
  bv = -65536;
  bz = &bw;
  cb[2] = 0 + (bm ? -8.0 : bg);
  if (-bl >= 0) {
    if (bm)
      goto bx;
    ca = &bz;
  }
  cb[3] = 524420 + bt;
  az = bl - (1646 ^ bl);
  bw = 2.0 * bv;
  bv = 2.0 * bw;
  *ca = &bv;
bx:
  cb[1] = -4.0 + 2.5 * bv;
  bc = 267503909 - bn;
  bi = *ca;
  *by = 131072 - 5.0 * bw;
  *bz = 3.0 * bg + 0.375 * bv;
  ay = ba = bl + 15 * az;
  bj = -k(109 + az);
  an = a(0, (long)((unsigned long)ax << 48) >> 48);
  an = a(an, (long)ay >> 48);
  an = a(an, 127);
  an = a(an, (long)((unsigned long)az << 48) >> 48);
  an = a(an, 0);
  an = a(an, bv);
  an = a(an, (long)((unsigned long)bj << 56) >> 56);
  an = a(an, 0);
  an = a(an, cb[1]);
  an = a(an, cb[2]);
  an = a(an, cb[3]);
  an = a(an, cb[4]);
  an = a(an, cb[5]);
  an = a(an, 0);
  an = a(an, cb[7]);
  an = a(an, (long)((unsigned long)ba << 48) >> 48);
  an = a(an, bc);
  an = a(an, bw);
  an = a(an, bk);
  an = a(an, bl);
  an = a(an, bm);
  an = a(an, bn);
  an = a(an, (long)((unsigned long)bo << 44) >> 44);
  an = a(an, bp);
  an = a(an, bg);
  an = a(an, bq);
  bh = *bi;
  an = a(an, bh);
  return an;
}
int t(int bk, int bl, int bm) {
  char cc = -8, cd = -29, ce = -9, cf = -72, cg, ch = -38, ci = -83;
  int cj = 1139056385, ck = 1, cl, cm, *cn, **co;
  short cp = -10436, cq = -1, cr;
  long cs;
  cn = &ck;
  co = &cn;
  cg = cf + 96;
  cr = 8207 - bk;
  while (1) {
    cf = cg - 255;
    if (-132149 >= *cn)
      break;
    cf = -64;
    ck = cs = 3995089908 - ((long)((unsigned long)cf << 56) >> 56);
  }
  *co = &cj;
  cg = cf - 125;
  cm = u(1, 1, cr - 10240, 1) + 1430004472;
  cl = a(0, (long)((unsigned long)cd << 56) >> 56);
  cl = a(cl, (long)((unsigned long)cc << 56) >> 56);
  cl = a(cl, (long)((unsigned long)ce << 56) >> 56);
  cl = a(cl, 127);
  cl = a(cl, cf);
  cl = a(cl, 1139056385);
  cl = a(cl, 149);
  cl = a(cl, 970153905);
  cl = a(cl, 19);
  cl = a(cl, 2600980);
  cl = a(cl, (long)((unsigned long)cg << 56) >> 56);
  cl = a(cl, cq);
  cl = a(cl, (long)((unsigned long)cp << 48) >> 48);
  cl = a(cl, 1);
  cl = a(cl, cs);
  cl = a(cl, (long)((unsigned long)ch << 56) >> 56);
  cl = a(cl, 96);
  cl = a(cl, cr);
  cl = a(cl, (long)((unsigned long)ci << 56) >> 56);
  cl = a(cl, 19734);
  cl = a(cl, 84070416);
  cl = a(cl, cm);
  cl = a(cl, bl);
  cl = a(cl, 0);
  cl = a(cl, 0);
  cl = a(cl, bm);
  cl = a(cl, (long)((unsigned long)ce << 56) >> 56);
  cl = a(cl, *cn);
  return cl;
}
int u(long bk, long bl, short bm, int bn) {
  int ct, cu, cv, cw, cx, cy, cz;
  char da, db, *dc;
  long dd, de;
  short df, dg, dh, *di = &dg;
  dc = &da;
  ct = (bn + 268432768) ^ 2106197547;
  cy = ct & 2106197547;
  cw = ~cy;
  cx = ct | 2106197547;
  ct = cx & cw;
  cz = bn - 1615855618;
  de = -1367384094 - ct;
  da = 128 - ct;
  dd = bk + bk;
  df = 32767 - ~bm;
  dg = bm + bm;
  cv = aa(18, -1.9999999925494194, -1, -1, -1, dg + 4095, -13, 335544317) +
       2134508355;
  cu = a(0, ct);
  cu = a(cu, da);
  cu = a(cu, dd);
  cu = a(cu, de);
  cu = a(cu, df);
  cu = a(cu, 2084569088);
  cu = a(cu, (long)((unsigned long)dg << 48) >> 48);
  cu = a(cu, 89413654);
  cu = a(cu, 1);
  cu = a(cu, 557842460);
  cu = a(cu, cz);
  cu = a(cu, bk);
  cu = a(cu, bl);
  cu = a(cu, (long)((unsigned long)bm << 48) >> 48);
  cu = a(cu, cv);
  cu = a(cu, 0);
  dh = *di;
  cu = a(cu, (long)((unsigned long)dh << 48) >> 48);
  db = *dc;
  cu = a(cu, db);
  return cu;
}
int main() {
  int dj =
      r(-76, 2198683675, -401648698, 63, -2305843009179915236) + 1494646043;
  q(28, 14704067 - dj);
  return 0;
}

Reply via email to