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;
}