https://gcc.gnu.org/bugzilla/show_bug.cgi?id=127981
Bug ID: 127981
Summary: wrong code at -O3 with "-fno-tree-pre
-fno-move-loop-stores -fno-tree-forwprop
-fno-tree-dominator-opts" on x86_64-linux-gnu
Product: gcc
Version: 17.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/xqeoPWh9P
Note:
- fails: 15.1 till trunk
- works: 14.4 and earlier
[511] % 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 20261018 (experimental) [master r17-1628-gd1c12591336] (GCC)
[512] %
[512] % gcctk -O3 small.c; ./a.out
[513] %
[513] % gcctk -O3 -fno-tree-pre -fno-move-loop-stores -fno-tree-forwprop
-fno-tree-dominator-opts small.c
[514] % ./a.out
Floating point exception
[515] %
[515] % cat small.c
short t, o, aa, ab, ac, ad, ae, af, ag, ah, ai = -28404, aj, w, ak = -189, al,
am, *ca, *cb, *cc, **ch;
int u, m, p = -360738, an, ao, ap, aq, ar, as, at = -196, au = -1, av, aw, ax,
v, y, ay, az, ba, bb, *cp, cq[3], **cr, (*cs)[];
long d, e, f, l, q = -98, r = -7182853913501426594, bc = -209, bd, be, bf, bg,
bh, bi = -4847902687898551683, bj, bk, bl, bm,
bn = -358475941255374663, bo, x, *bz, **cd;
char s = -16, bp = -84, bq, br, bs, bt, bu, bv, bw, bx, by, *co;
float ce, cf, *cg;
double ci, cj, ck, cl, cm, cn;
int ct(int cu, int cv) {
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 = cu;
int k = cv;
for (int b = 0; b < 4; ++b) {
char a = k;
k >>= 8;
j = j >> 8 ^ g[(j ^ a) & 255];
}
return j;
}
int cw(char cu, long cv, int de, int df, short dg, long dh) {
ca = &aa;
cd = &bz;
*ca = 15005 + dg;
bq = 127 - -13 * cu;
*cd = &r;
o = aa + 299 * aa;
aa = 10254;
an = ct(0, (long)((unsigned long)o << 48) >> 48);
an = ct(an, q);
an = ct(an, 165);
an = ct(an, r);
an = ct(an, (long)((unsigned long)p << 44) >> 44);
an = ct(an, 223);
an = ct(an, (long)((unsigned long)bp << 56) >> 56);
an = ct(an, (long)((unsigned long)s << 56) >> 56);
an = ct(an, -1799859710);
an = ct(an, 64);
an = ct(an, 0);
an = ct(an, bc);
an = ct(an, 50008);
an = ct(an, 1);
an = ct(an, bq);
an = ct(an, 31);
an = ct(an, aa);
an = ct(an, (long)((unsigned long)cu << 56) >> 56);
an = ct(an, cv);
an = ct(an, de);
an = ct(an, df);
an = ct(an, (long)((unsigned long)dg << 48) >> 48);
an = ct(an, dh);
an = ct(an, 0);
bd = *bz;
an = ct(an, bd);
ab = *ca;
an = ct(an, ab);
return an;
}
void cx(int);
int cy(long, short, long, float, char);
void cz(int cu, short cv) {
ar = -1644167425 ^ cu;
if (510 - ar - 2048 % cv != cv + 1535)
bk = 8 % bj;
}
int da(short, int, long, long, char, char);
int db(short cu, long cv, float de, char df, char dg, long dh) {
ck = cm = cn = -1.0;
bw = -34;
bx = -127;
by = -121;
cc = &aj;
aj = 16247 - 160;
cl = cu ? -3.75 : 0.625;
ax = (long)((unsigned long)dg << 56) >> 56;
bv = df - dg;
*cc = -3493 + aj;
cj = ax - 15903378;
bo = cv - ~bm;
v = ct(0, 203);
v = ct(v, (long)((unsigned long)ai << 48) >> 48);
v = ct(v, bn);
v = ct(v, ax);
v = ct(v, 2.5);
v = ct(v, cj);
v = ct(v, 0);
v = ct(v, 8.0);
v = ct(v, ck);
v = ct(v, cl);
v = ct(v, cm);
v = ct(v, cn);
v = ct(v, bo);
v = ct(v, 1.5f);
v = ct(v, 0);
v = ct(v, (long)((unsigned long)bv << 56) >> 56);
v = ct(v, (long)((unsigned long)bw << 56) >> 56);
v = ct(v, 111);
v = ct(v, (long)((unsigned long)bx << 56) >> 56);
v = ct(v, (long)((unsigned long)by << 56) >> 56);
v = ct(v, aj);
v = ct(v, ax);
v = ct(v, (long)((unsigned long)cu << 48) >> 48);
v = ct(v, 0);
v = ct(v, cv);
v = ct(v, de);
v = ct(v, (long)((unsigned long)df << 56) >> 56);
v = ct(v, (long)((unsigned long)dg << 56) >> 56);
v = ct(v, dh);
w = *cc;
v = ct(v, w);
v = ct(v, 1.5f);
return v;
}
int dc(int cu, char cv, char de, char df, int dg) {
short di = 3, dj;
short *dk;
int *dl;
short **dm;
cr = &dl;
dm = &dk;
while (1) {
dj = 5 * di + (f ? di : 1);
dl = &bb;
*dm = &dj;
*dl = 369;
*dk = 32767 - (dj > 0 ? 28672 : 9) - 6143;
ay = -1876541446 - ((long)((unsigned long)dj << 48) >> 48);
cs = &cq;
di = dj - 15 * dj;
al = di - 24462 - ~dj;
if ((7 | x) > 0)
break;
}
az = 3630832 * bb;
y = 268820321 | bb;
if (di + (-4 ^ di) == 0) {
dm = &dk + 9;
cr = &dl + 2;
dk = *dm;
}
*dl = 1339777037 - az;
dj = 0;
*cr = *cs + 2;
*dl = 268435456;
ba = ct(0, bb);
ba = ct(ba, y);
ba = ct(ba, 122);
ba = ct(ba, di);
ba = ct(ba, ay);
ba = ct(ba, al);
ba = ct(ba, (long)((unsigned long)ak << 48) >> 48);
ba = ct(ba, az);
ba = ct(ba, 0);
ba = ct(ba, 88);
ba = ct(ba, 0);
ba = ct(ba, cq[2]);
ba = ct(ba, (long)((unsigned long)cu << 44) >> 44);
ba = ct(ba, (long)((unsigned long)cv << 56) >> 56);
ba = ct(ba, (long)((unsigned long)de << 56) >> 56);
ba = ct(ba, (long)((unsigned long)df << 56) >> 56);
ba = ct(ba, dg);
ba = ct(ba, 0);
am = *dk;
ba = ct(ba, am);
ba = ct(ba, *dl);
return ba;
}
void dd() {
int n = cy(-9223372030209757036, 1, 52586086183, 4198366.0f, 63) +
1850441282;
t = -32559 - 209;
d = (long)((unsigned long)((long)((unsigned long)n << 32) >> 32) << 16) >>
16;
e = d % 11863279 + 11863279;
l = 6235259 * e % 11863279;
f = l + 8366462;
m = cw(-2, 557308908, 279462, 1040712246, t + 17680,
f - 9153552 + 4291797271) -
1660983448;
u = m + 292610057 - -48242688;
cx(u - 1438659904);
}
void cx(int cu) {
be = (long)((unsigned long)cu << 32) >> 32;
bf = 182471382;
bg = 729295598 * be % 3037000493;
bf = bf + bg;
cy(bf - 716491929 - 2030209757036, 0, 0, 0, 0);
}
int cy(long cu, short cv, long de, float df, char dg) {
cg = &ce;
ag = (unsigned long)cu << 52 >> 52;
ah = 148 ^ ag;
cz(1644167424, -1536 ^ ah);
ch = &cb;
ac = 9118 - 6;
ao = -260088 - (-287223 - 130893);
ce = cv;
*ch = &ae;
ad = 10096 + 32768 - cu;
ae = ac + ad;
bh = 529025200 - 156183573 * de;
aq = da(-2015, -294912, 1074036764, -9223372033633550307, -69, dg - 53) +
1946427497;
ap = aq;
ap = ct(ap, ac);
ap = ct(ap, cv);
ap = ct(ap, 59);
ap = ct(ap, 0);
ap = ct(ap, bh);
ap = ct(ap, bi);
ap = ct(ap, (long)((unsigned long)ad << 48) >> 48);
ap = ct(ap, (long)((unsigned long)ae << 48) >> 48);
ap = ct(ap, ao);
ap = ct(ap, cv);
ap = ct(ap, cu);
ap = ct(ap, cv);
ap = ct(ap, de);
ap = ct(ap, 0);
ap = ct(ap, df);
ap = ct(ap, dg);
ap = ct(ap, 0);
af = *cb;
ap = ct(ap, (long)((unsigned long)af << 48) >> 48);
cf = *cg;
ap = ct(ap, cf);
return ap;
}
int da(short cu, int cv, long de, long df, char dg, char dh) {
co = &br;
cp = &as;
br = -58 - -5 * dh;
bl = -1073706853 - df;
bs = dh + 14 % br;
bu = *co;
as = dc(-523904, 128, bu - 120, 128, -1) + 954115498;
br = bs - -40;
ci = cv + 262144;
aw = db(32768, ci + 9223372032626429952, -28.971189498901367f, dg + 61, -2,
-32756) +
366892435;
av = ct(0, ci);
av = ct(av, 56);
av = ct(av, as);
av = ct(av, (long)((unsigned long)bs << 56) >> 56);
av = ct(av, bl);
av = ct(av, au);
av = ct(av, (long)((unsigned long)at << 40) >> 40);
av = ct(av, 246);
av = ct(av, (long)((unsigned long)cu << 52) >> 52);
av = ct(av, aw);
av = ct(av, de);
av = ct(av, df);
av = ct(av, (long)((unsigned long)dg << 56) >> 56);
av = ct(av, 0);
av = ct(av, (long)((unsigned long)dh << 56) >> 56);
bt = *co;
av = ct(av, bt);
av = ct(av, *cp);
return av;
}
int main() { dd(); }