https://gcc.gnu.org/bugzilla/show_bug.cgi?id=127034
Bug ID: 127034
Summary: wrong code at -O1 and above on x86_64-linux-gnu
(generated code hangs)
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/b16TPPzbe
Note:
- fails: trunk
- works: 16.2 and earlier
[546] % 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 20260823 (experimental) [master r17-1628-gd1c12591336] (GCC)
[547] %
[547] % gcctk -O0 small.c; ./a.out
[548] %
[548] % gcctk -O1 small.c
[549] % timeout -s 9 5 ./a.out
Killed
[550] % cat small.c
struct {
long d;
} aa, *ab;
struct {
int d;
} ac, *ad;
int f[256];
int p, x, y, g, h = -247, t, ae, af = -200, ag, ah, ai, aj, ak, al, am, an, ao,
ap = -25, aq, ar, as, at, au, av = -791414350, aw = -225308568,
ax, ay, az, ba = -63, bb, bc;
short d = -100, w, bd, be, bf, bg, bh, bi, bj, bk, bl, bm, bn = -50, bo, bp,
bq,
br, bs = -119;
double e, k = -1.125, z = -3.75;
long n, bt, bu = -50, bv, bw, bx, by, bz, ca, cb = -287750997381;
int *q, *r, *cc, *cd;
int **s, **ce, **cf;
char cg, ch, ci, cj, ck, cl, cm = -119, cn, co = -80, cp = -97, cq, cr, cs;
float ct, cu, cv;
long *cw, *cx;
char *cy;
char *cz;
char **da;
int db(int dc, int dd) {
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;
f[i] = c;
}
unsigned l = dc;
int m = dd;
for (int b = 0; b < 4; ++b) {
char a = m;
m >>= 8;
l = l >> 8 ^ f[(l ^ a) & 255];
}
return l;
}
char de(char dc, char dd) {
char o = dc % dd + dd;
return o;
}
void df(int dc) {
int u = -369594442 + dc;
v:
p = 83985218 * dc + ~u - ~dc;
if ((unsigned long)p << 44)
goto v;
}
int dg(char, short, int, short, short, float);
int dj(char dc, long dd, long dk, long dl, int dm, long dn) {
int u = -178, v = -61;
g = -181;
q = &u;
s = &r;
*q = -8888384 * u;
*q = (-2129816861 | u) + 403497516 - 2377690 * v;
*s = &u;
x = ~u;
e = -2147483391 + k;
v = -1073856466 - -12;
n = 1073856729 - ~dd - ~dk;
y = 1 - 2147483128;
t = db(0, h);
t = db(t, 2147483647);
t = db(t, g);
t = db(t, x);
t = db(t, y);
t = db(t, (long)((unsigned long)d << 48) >> 48);
t = db(t, e);
t = db(t, u);
t = db(t, h);
t = db(t, 2147483647);
t = db(t, g);
t = db(t, 0);
t = db(t, v);
t = db(t, k);
t = db(t, n);
t = db(t, (long)((unsigned long)dc << 56) >> 56);
t = db(t, dd);
t = db(t, dk);
t = db(t, dl);
t = db(t, dm);
t = db(t, 0);
t = db(t, dn);
t = db(t, *q);
t = db(t, *r);
return t;
}
int fn6(int dc, long dd) {
br = -238;
bq = -23380;
bp = -215;
cz = &cq;
bm = bo = ~bl;
cv = 134217726;
ca = (long)1728053634 - -1739533229;
*cz = 2 + 128;
da = &cy;
*da = cz;
bb = 27 - -9938901 - 30;
bc = db(0, ca);
bc = db(bc, bm);
bc = db(bc, 636);
bc = db(bc, 23);
bc = db(bc, (long)((unsigned long)bn << 48) >> 48);
bc = db(bc, z);
bc = db(bc, 6683);
bc = db(bc, 1);
bc = db(bc, (long)((unsigned long)bs << 48) >> 48);
bc = db(bc, bo);
bc = db(bc, 52);
bc = db(bc, (long)((unsigned long)br << 48) >> 48);
bc = db(bc, (long)((unsigned long)bq << 48) >> 48);
bc = db(bc, (long)((unsigned long)bp << 48) >> 48);
bc = db(bc, cb);
bc = db(bc, 54);
bc = db(bc, 524287);
bc = db(bc, cv);
bc = db(bc, 0);
bc = db(bc, (long)((unsigned long)cq << 56) >> 56);
bc = db(bc, 13);
bc = db(bc, ba);
bc = db(bc, 670905315);
bc = db(bc, bb);
bc = db(bc, dc);
bc = db(bc, 0);
bc = db(bc, dd);
bc = db(bc, 0);
bc = db(bc, 0);
bc = db(bc, 0);
bc = db(bc, 0);
cr = *cy;
bc = db(bc, (long)((unsigned long)cr << 56) >> 56);
cs = *cz;
bc = db(bc, (long)((unsigned long)cs << 56) >> 56);
return bc;
}
void fn7(int dc, int dd) {
bt = 87 - bu;
am = (long)((unsigned long)dc << 40) >> 40;
an = dd ^ am ^ bt;
ao = -1103093602 ^ an;
df(-5 ^ ao);
}
int fn8(short dc, int dd, short dk, long dl, float dm, char dn) {
cl = -104;
ck = -72;
cj = -98;
ci = -9;
cx = &bv;
ab = &aa;
be = 13824 - dc;
bd = (dk + 26967) ^ 2428;
bi = bd & 2428;
bh = ~bi;
bj = ~bd;
bf = ~2428;
bk = bj & bf;
bg = ~bk;
bd = bg & bh;
*cx = -1290752172;
ch = dn - 122;
cw = &ab->d;
cn = dn + de(dn - -24 * dn, dn - -67 + (-53 & dn));
aq = -2 * dd - 299384 * dd;
*cw = -619679627 + ~bv;
cg = -47 + cn;
ct = (0 == 0 ? dm : d) - 8189;
as = dg(18, -26033, 8385536, -20992, 2048, -536870912.0f) - 678182947;
ar = db(0, dl);
ar = db(ar, (long)((unsigned long)cm << 56) >> 56);
ar = db(ar, (long)((unsigned long)cl << 56) >> 56);
ar = db(ar, (long)((unsigned long)ck << 56) >> 56);
ar = db(ar, (long)((unsigned long)cg << 56) >> 56);
ar = db(ar, (long)((unsigned long)cj << 56) >> 56);
ar = db(ar, 127);
ar = db(ar, (long)((unsigned long)ci << 56) >> 56);
ar = db(ar, (long)((unsigned long)ch << 56) >> 56);
ar = db(ar, dd);
ar = db(ar, bd);
ar = db(ar, cn);
ar = db(ar, ct);
ar = db(ar, aa.d);
ar = db(ar, ap);
ar = db(ar, (long)((unsigned long)co << 56) >> 56);
ar = db(ar, 17);
ar = db(ar, bv);
ar = db(ar, be);
ar = db(ar, aq);
ar = db(ar, dc);
ar = db(ar, as);
ar = db(ar, (long)((unsigned long)dk << 48) >> 48);
ar = db(ar, dl);
ar = db(ar, dm);
ar = db(ar, 0);
ar = db(ar, (long)((unsigned long)dn << 56) >> 56);
bw = *cw;
ar = db(ar, bw);
bx = *cx;
ar = db(ar, bx);
return ar;
}
int dg(char dc, short dd, int dk, short dl, short dm, float dn) {
au = -9;
at = -145;
int t60, t61 = -1;
long t62, t63, t64;
ce = &cc;
cf = &cd;
ad = ∾
*ce = *cf = &ad->d;
cu = 8.0f * dn;
t60 = -1276660795 + 15 * t61;
dh:
az = fn6(1612300524 - 1612300493, 4294966752) - 1029364274;
t61 = az - by;
by = -1073741822 + ((long)((unsigned long)cp << 56) >> 56);
cp = 0;
t62 = cu;
t63 = t60 ^ t62;
bz = -1276660810 ^ t63;
t64 = 3018306486 ^ t63;
bz = bz & t64;
ay = dj(-64, -548682072064 ^ bz, -547608330270, 403726925359, 430,
4611686016279904320) -
13960317;
*cc = ay - t61;
if (-2143289344 + ~by <= 1077936121 + 2 * by)
goto di;
goto dh;
di:
cp = -19 + dc;
*cc = 3714416 * t61 + *cc;
ax = db(0, by);
ax = db(ax, ac.d);
ax = db(ax, 0);
ax = db(ax, 773789);
ax = db(ax, 1612300524);
ax = db(ax, 2056307494);
ax = db(ax, 47);
ax = db(ax, 143);
ax = db(ax, av);
ax = db(ax, au);
ax = db(ax, 190);
ax = db(ax, at);
ax = db(ax, t60);
ax = db(ax, aw);
ax = db(ax, t61);
ax = db(ax, 0);
ax = db(ax, 2.0f);
ax = db(ax, 0);
ax = db(ax, 0);
ax = db(ax, cp);
ax = db(ax, t61);
ax = db(ax, dc);
ax = db(ax, (long)((unsigned long)dd << 48) >> 48);
ax = db(ax, dk);
ax = db(ax, (long)((unsigned long)dl << 48) >> 48);
ax = db(ax, (long)((unsigned long)dm << 52) >> 52);
ax = db(ax, dn);
ax = db(ax, *cc);
ax = db(ax, *cd);
return ax;
}
int main() {
w = al = fn8(2192, -5058, -14627, 32, 32797.0f, 79 - 83) + 1422840203;
ag = w - al;
ae = af - 524018;
ah = (long)((unsigned long)ae << 44) >> 44;
ai = ah % 46337 + 46337;
aj = ag;
ak = 20842 * ai % 46337;
aj = aj + ak;
fn7(-8380400, aj - 3337 + 1103101959);
}