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

            Bug ID: 127814
           Summary: wrong code at -O3 with -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/csjKEch7d

Note:
- fails: 12.1 to trunk
- works: 11.5 and earlier


[521] % 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 20261010 (experimental) [master r17-1628-gd1c12591336] (GCC) 
[522] % 
[522] % gcctk -O3 small.c; ./a.out
[523] % 
[523] % gcctk -O3 -fno-vect-cost-model small.c
[524] % ./a.out
Aborted
[525] % 
[525] % cat small.c
struct {
  long a[1];
  int d;
} aa = {{0}, 144}, *ao;
int e, f = -224, h = -6294000, n, v = -1, ag, ai, aj, ap = -81, aq, ar,
       as = -167, av, aw, ax = -1737895715, bf, bj, bl, bm, bn, bp, l[256],
*bg,
       *bu, **bi, **bw;
char t = -121, ad = -54, au, bd, be, bk, bq, *bh;
long u = -139, ay = -86, az = -238, bc, br, bs, bt, bx = -164, bz, *bv;
short w, ac = -45, ah, ak, al, am, at, ba, bb, bo, ca = -211, cc = -54,
         cd = -99, ce = -28901, cf = -20990, cg, ch, *ae, *ci, **af, **cj;
long (*by)[1];
int g(int x) {
  unsigned k = x;
  for (int i = 0; i < 4; ++i)
    e |= (k >> i * 8 & 255) << (3 - i) * 8;
  return e;
}
int m(int x, int y) {
  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;
    l[i] = c;
  }
  unsigned o = x;
  int p = y;
  for (int b = 0; b < 4; ++b) {
    char ab = p;
    p >>= 8;
    o = o >> 8 ^ l[(o ^ ab) & 255];
  }
  return o;
}
int q(long x, short y, int z, short ck, int cl) {
  bi = &bg;
  *bi = &ar;
  at = ck - -12 * ck;
  bh = &be;
  bd = 127;
  aq = 3 + (1863153918 & as);
  as = ~cl + 1025;
  *bg = -671089675 - g(1048577 * as);
  *bh = 31;
  bb = -11560 - 16;
  au = -48 + 127;
  ba = ck - 30691 + 32767;
  bc = 7978 - ay;
  bh = &bd;
  av = m(0, 3);
  av = m(av, at);
  av = m(av, au);
  av = m(av, ap);
  av = m(av, ar);
  av = m(av, aq);
  av = m(av, ay);
  av = m(av, az);
  av = m(av, -1208611946);
  av = m(av, 2487);
  av = m(av, (long)((unsigned long)bb << 48) >> 48);
  av = m(av, ba);
  av = m(av, bc);
  av = m(av, 127);
  av = m(av, be);
  av = m(av, 0);
  av = m(av, x);
  av = m(av, y);
  av = m(av, 0);
  av = m(av, (long)((unsigned long)z << 44) >> 44);
  av = m(av, ck);
  av = m(av, cl);
  av = m(av, 0);
  bk = *bh;
  av = m(av, bk);
  return av;
}
int r(long, signed char, short, signed char, long, long);
int s(int x, short y) {
  char cm = -127;
  cg = cd;
  cj = &ci;
  bt = -1235585;
  bz = -1073741640 - 78;
  bn = 1074266113 % x;
  *cj = &cg;
  bm = 524287 - 262044 + ((long)((unsigned long)cd << 48) >> 48);
  bp = m(0, (long)((unsigned long)ca << 48) >> 48);
  bp = m(bp, bt);
  bp = m(bp, 78);
  bp = m(bp, bm);
  bp = m(bp, bn);
  bp = m(bp, 491109);
  bp = m(bp, (long)((unsigned long)cc << 48) >> 48);
  bp = m(bp, (long)((unsigned long)cd << 48) >> 48);
  bp = m(bp, (long)((unsigned long)ce << 48) >> 48);
  bp = m(bp, 1);
  bp = m(bp, 8114);
  bp = m(bp, 105);
  bp = m(bp, (long)((unsigned long)cf << 48) >> 48);
  bp = m(bp, bz);
  bp = m(bp, bx);
  bp = m(bp, 185);
  bp = m(bp, (long)((unsigned long)cm << 56) >> 56);
  bp = m(bp, 0);
  bp = m(bp, 0);
  bp = m(bp, 0);
  bp = m(bp, x);
  bp = m(bp, y);
  bp = m(bp, 0);
  ch = *ci;
  bp = m(bp, (long)((unsigned long)ch << 48) >> 48);
  bp = m(bp, (long)((unsigned long)cd << 48) >> 48);
  return bp;
}
int an(char x, char y, int z, short ck, long cl) {
  af = &ae;
  n = -1;
  *af = &ac;
  w = 32767 - 1;
  am = w & 3;
  ak = ~am;
  al = w | 3;
  w = al & ak;
  aj = r(cl - 4611686016548265118, -38, 768, -1, 2415619623, -4294849770) -
       1068550532;
  ai = q(1, 1, -262341, 1991, 1) + aj;
  ag = m(0, 116);
  ag = m(ag, (long)((unsigned long)t << 56) >> 56);
  ag = m(ag, u);
  ag = m(ag, cl);
  ag = m(ag, (long)((unsigned long)h << 40) >> 40);
  ag = m(ag, f);
  ag = m(ag, w);
  ag = m(ag, 0);
  ag = m(ag, n);
  ag = m(ag, (long)((unsigned long)ac << 48) >> 48);
  ag = m(ag, v);
  ag = m(ag, (long)((unsigned long)ad << 56) >> 56);
  ag = m(ag, x);
  ag = m(ag, y);
  ag = m(ag, z);
  ag = m(ag, ai);
  ag = m(ag, ck);
  ag = m(ag, cl);
  ah = *ae;
  ag = m(ag, (long)((unsigned long)ah << 48) >> 48);
  ag = m(ag, (long)((unsigned long)t << 56) >> 56);
  return ag;
}
int r(long x, signed char y, short z, signed char ck, long cl, long cn) {
  int cb = -996736171;
  bu = &cb;
  bw = &bu;
  ao = &aa;
  by = &ao->a;
  bv = *by;
  if (0 == x)
    *bu = 0;
  bf = s(1073741824, z - 769) - 1993837874;
  aw = 2147483548 - 429496672 * bf;
  *bw = &bf;
  while (1) {
    bq = ck - (17 / ck + y);
    br = 158687952 - 1902071836;
    aa.a[0] = x - -3 * cn;
    *bu = -2 + bf;
    if (-520093677 * bf >= cb)
      break;
  }
  bj = -8342959 + 158687952;
  bo = 1660 - 14 * z;
  bu = &ao->d;
  bl = m(0, 370125827);
  bl = m(bl, ax);
  bl = m(bl, 0);
  bl = m(bl, aw);
  bl = m(bl, 30);
  bl = m(bl, 72);
  bl = m(bl, 250);
  bl = m(bl, (long)((unsigned long)bo << 48) >> 48);
  bl = m(bl, bq);
  bl = m(bl, aa.a[0]);
  bl = m(bl, 144);
  bl = m(bl, bf);
  bl = m(bl, br);
  bl = m(bl, (long)((unsigned long)bj << 40) >> 40);
  bl = m(bl, 1073741824);
  bl = m(bl, 158687952);
  bl = m(bl, x);
  bl = m(bl, (long)((unsigned long)y << 56) >> 56);
  bl = m(bl, z);
  bl = m(bl, ck);
  bl = m(bl, cl);
  bl = m(bl, cn);
  bl = m(bl, *bu);
  bs = *bv;
  bl = m(bl, bs);
  return bl;
}
int main() {
  int co = an(-1, -1, -1, -1, -1);
  if (1919592802 != co)
    __builtin_abort();
  return 0;
}

Reply via email to