https://gcc.gnu.org/bugzilla/show_bug.cgi?id=127606
Bug ID: 127606
Summary: wrong code at -O{2,3} with
"-fno-guess-branch-probability -fno-tree-loop-im
-fno-tree-pre -fno-forward-propagate -fno-ipa-ra
-fno-tree-ch" 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/8c5EK8GMM
Note:
- fails: trunk
- works: 16.2 and earlier
[516] % 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 20260924 (experimental) [master r17-1628-gd1c12591336] (GCC)
[517] %
[517] % gcctk -O3 small.c; ./a.out
[518] %
[518] % gcctk -O3 -fno-guess-branch-probability -fno-tree-loop-im -fno-tree-pre
-fno-forward-propagate -fno-ipa-ra -fno-tree-ch small.c
[519] % ./a.out
Floating point exception
[520] %
[520] % cat small.c
struct a {
short d[2];
};
short m, d, p, aa, ab = -101, ac = -10493, ad = -65, ae, af = -15067, ag, t,
ah,
z, ai, *aj, **ak;
int n, q, r = -66, al, am = -781047284, an, ao = -39, ap, aq, ar, as, at, au,
av, aw, u, ax, w, ay, az, ba, bb, bc, bd = -284627199, be, bf, bg,
bh,
bi, bj, bk, bl, *bm, **bn;
long e, f, bo, bp = -342246050408, bq, br, bs, bt, bu, bv, bw, bx, by, bz,
ca = 6, cb, cc, cd, *ce, *cf, *cg, *ch, *ci, *cj;
float l, o = -3.75f, s;
char ck, v, cl;
__attribute__((noinline)) int cm(int cn, int co) {
static 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 = cn;
int k = co;
for (int b = 0; b < 4; ++b) {
char a = k;
k >>= 8;
j = j >> 8 ^ g[(j ^ a) & 255];
}
return j;
}
void cp(long, int, long);
int cq(short p1, short p2, int cr, int cs, short ct) {
m = n = cm(0, (unsigned long)cr << 40 >> 40);
n = cm(n, 0);
n = cm(n, cs);
n = cm(n, (unsigned long)ct >> 52);
n = cm(n, 0);
n = cm(n, 93);
n = cm(n, 0);
return n;
}
void cu(char);
int cv(int cn) {
cm(0, 0);
cm(0, cn);
return 0;
}
int cw(int, char, float, char, char, char, short);
int cx(short cn, char co, float cr) {
short cy = -3410;
ak = &aj;
ce = &e;
d = cn - -32563;
q = 1083998199 - 1083474983 + 16;
f = -1074528307 - ((long)((unsigned long)cy << 48) >> 48);
*ce = 1073609055;
l = -84541440;
s = 8.0f * cr;
*ak = &p;
cy = -16400;
*aj = 267 - cn;
al = cm(0, d);
al = cm(al, (long)((unsigned long)cy << 48) >> 48);
al = cm(al, e);
al = cm(al, 0);
al = cm(al, f);
al = cm(al, 1.5f);
al = cm(al, 0);
al = cm(al, o);
al = cm(al, 3.0f);
al = cm(al, 1.5f);
al = cm(al, 0);
al = cm(al, 1.0f);
al = cm(al, l);
al = cm(al, 84933729);
al = cm(al, p);
al = cm(al, r);
al = cm(al, q);
al = cm(al, s);
al = cm(al, 0);
al = cm(al, (long)((unsigned long)cn << 48) >> 48);
al = cm(al, co);
al = cm(al, 0);
al = cm(al, 0);
al = cm(al, 0);
al = cm(al, 0);
al = cm(al, 0);
al = cm(al, 0);
al = cm(al, 0);
aa = *aj;
al = cm(al, aa);
bo = *ce;
al = cm(al, bo);
return al;
}
int cz(int cn, short co, long cr, int cs, long ct, short da, int db) {
long dc = 17;
cf = cg = ch = &dc;
*cg = dc + dc;
ae = co - 9 * co;
an = -368690105 - -2048327106;
ap = cm(0, (long)((unsigned long)ad << 52) >> 52);
ap = cm(ap, (long)((unsigned long)ab << 52) >> 52);
ap = cm(ap, 11);
ap = cm(ap, 25022);
ap = cm(ap, (long)((unsigned long)ac << 48) >> 48);
ap = cm(ap, 261555065);
ap = cm(ap, 29095);
ap = cm(ap, ct);
ap = cm(ap, dc);
ap = cm(ap, (long)((unsigned long)ae << 48) >> 48);
ap = cm(ap, (long)((unsigned long)af << 48) >> 48);
ap = cm(ap, 0);
ap = cm(ap, am);
ap = cm(ap, 14);
ap = cm(ap, -712613994);
ap = cm(ap, -591966605);
ap = cm(ap, bp);
ap = cm(ap, an);
ap = cm(ap, ao);
ap = cm(ap, 4.0);
ap = cm(ap, cn);
ap = cm(ap, co);
ap = cm(ap, cr);
ap = cm(ap, (long)((unsigned long)cs << 44) >> 44);
ap = cm(ap, ct);
ap = cm(ap, (long)((unsigned long)da << 52) >> 52);
ap = cm(ap, 0);
ap = cm(ap, db);
bq = *cf;
ap = cm(ap, bq);
br = *cg;
ap = cm(ap, br);
bs = *ch;
ap = cm(ap, bs);
return ap;
}
void dd(long cn) {
bv = 1837996544 + cn;
bw = bv % 3037000493;
by = 1487194 * cn;
bx = by % 3037000493;
by = 1944416850 * bw % 3037000493;
bx = bx + by;
cp(bx, 3, -1);
}
void cp(long cn, int co, long cr) {
int x, de, df, dg = 0, dh, di = 11, dj, *dk;
char dl = 0, dm, y, dn, dp;
long dq = -82;
struct a dr = {{0,0}};
short ds = 0, dt = 0, du;
dk = &u;
do {
dh = cn;
aw = dh % 46337;
w = 40033 * aw;
au = w + 31847;
au = au % 46337;
ck = (long)((unsigned long)dq << 16) >> 16;
av = ck % di + 11;
av = av % di;
v = 2 * av % di;
dm = cn;
y = dm % di + 11;
y = y % di;
dp = 10 * y % di;
dn = dp + 4;
t = 45 * cr;
dj = cw(au - 20753 + 2050618351, -111, -1044328.0f, v - 6 - 104, dn - 5,
-19, t) -
95733627;
ag = (unsigned long)dq << 16 >> 6;
ds = ds + dt;
ds = ds % 81;
dt = 98 * ag;
du = dr.d[0];
de = (long)dl << 40 >> 40;
aq = 30 ^ de;
df = 127 ^ de;
aq = aq & df;
ar = cq(ds, du, -4079617 ^ aq, 54, -1) - 2032857596;
*dk = dj - ar;
x = (21 >> co) + ~u;
dr.d[0] = 6;
if (0 <= dl - 31) {
dq = cr;
ax = -10 * co;
dg = dg + 9;
at = cv(dg - 7) - 309410;
u = co + at;
}
dl = 127;
} while (0 <= u);
as = 10 + x;
cu(as - 10 - 1);
}
void cu(char cn) {
bb = cw(2050618351, -111, -1044328.0f, cn - 103, -72, -19, 136) + 979061894;
ba = 130280446 + bb;
if (-2 * ba != -262668294)
az = 1067210928 / ay;
}
int cw(int cn, char co, float cr, char cs, char ct, char da, short db) {
long dv = -197;
ci = &ca;
bn = &bm;
cj = &cb;
*cj = -66322669 - dv;
ah = 2048 - -79 - 2048;
do {
*ci = ~dv + (ca <= 0 ? 1008729983 : -1039925336);
z = ah - 21 * ah - 3 * ah;
dv = cb + *ci;
bh = 128 + 126 - 95 / da;
bk = cx(-16164, 121, -0.5f) - 826019009;
bi = bk + cn;
bm = &bf;
} while (8 < -ca);
*bm = (long)((unsigned long)da << 56) >> 56;
*cj = ca - 2116026151;
cl = da - 75;
*bn = &bi;
bg = da - 57 + ~cs;
be = 1991637 * bi - -2146475557 - 2129375996;
bc = -7342433 - ((long)((unsigned long)2048 << 52) >> 52);
ai = -257 + 32765 + db;
bz = 376721798 - 2146435071 / ca;
dv = -6029336;
ca = 97517562 - -10 * cb;
bl = cz(-1309835519, 2167, 663091339, -34828, 70368711542989, z - 206,
-1040119841) -
498025;
bj = cm(0, (long)((unsigned long)bc << 40) >> 40);
bj = cm(bj, (long)((unsigned long)z << 52) >> 52);
bj = cm(bj, bz);
bj = cm(bj, be);
bj = cm(bj, ai);
bj = cm(bj, bd);
bj = cm(bj, bf);
bj = cm(bj, ca);
bj = cm(bj, (long)((unsigned long)cl << 56) >> 56);
bj = cm(bj, 3);
bj = cm(bj, (unsigned long)bh << 56 >> 56);
bj = cm(bj, bg);
bj = cm(bj, 67);
bj = cm(bj, dv);
bj = cm(bj, cb);
bj = cm(bj, bi);
bj = cm(bj, bl);
bj = cm(bj, (long)((unsigned long)co << 56) >> 56);
bj = cm(bj, cr);
bj = cm(bj, 0);
bj = cm(bj, (long)((unsigned long)cs << 56) >> 56);
bj = cm(bj, (long)((unsigned long)ct << 56) >> 56);
bj = cm(bj, (long)((unsigned long)da << 56) >> 56);
bj = cm(bj, (unsigned long)db << 48 >> 48);
cc = *ci;
bj = cm(bj, cc);
cd = *cj;
bj = cm(bj, cd);
bj = cm(bj, *bm);
return bj;
}
int main() {
bt = 1316079754;
bu = 2397044987 * 111;
bt = bt + bu;
dd(bt);
}