https://gcc.gnu.org/bugzilla/show_bug.cgi?id=128597
Bug ID: 128597
Summary: wrong code at -O3 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/8rj6P4bK1
Note:
- fails: 15.1 till trunk
- works: 14.4 and earlier
[528] % 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 20261109 (experimental) [master r17-1628-gd1c12591336] (GCC)
[529] %
[529] % gcctk -O2 small.c; ./a.out
[530] %
[530] % gcctk -O3 small.c
[531] % timeout -s 9 5 ./a.out
Killed
[532] % cat small.c
typedef int a;
typedef a d[];
struct {
a e[3];
} af = {{252}}, ag;
a f[256], g = -349228, h, k, ac, ae, ah = -85, ai, aj, ak = 939575033, al, am,
an, aq, bb, bh, bj, bn = -312436, bo, br = -1382610661, bs, bt = 95,
bu, bz, *r, *cc, **ce;
long l, o, p = -187, q = -249, ad, at, bl, bp, bq, by, ca, cb, *ab;
char ao, ap = -69, ar;
short as, au, av = -147, aw, ax = -147, bc, bd, s, t, u, be, bf, bg, bm,
bx = -1, cd = -1, *ay, *az, **ba;
float bk;
a v(a w, a x) {
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 m = w;
int n = x;
for (int b = 0; b < 4; ++b) {
char aa = n;
n >>= 8;
m = m >> 8 ^ f[(m ^ aa) & 255];
}
return m;
}
a y(a w, a x, short z, long cf, long cg, long ch) {
r = &k;
ab = &o;
h = x - z;
l = 654690961 - ~ch;
o = -16496128 + ch;
k = (-7456084 * w - -2656427 * x) ^ 789400172;
ae = ~k;
k = 789400172 & ae;
ac = v(0, 238);
ac = v(ac, 155);
ac = v(ac, (long)((unsigned long)g << 44) >> 44);
ac = v(ac, l);
ac = v(ac, o);
ac = v(ac, h);
ac = v(ac, k);
ac = v(ac, p);
ac = v(ac, q);
ac = v(ac, w);
ac = v(ac, x);
ac = v(ac, z);
ac = v(ac, cf);
ac = v(ac, cg);
ac = v(ac, ch);
ac = v(ac, *r);
ad = *ab;
ac = v(ac, ad);
return ac;
}
a ci(short, a, short);
a cj(long w, long x, a z, short cf, long cg) {
ao = -19;
short bi = -183;
ba = &ay;
au = bi + 32767;
bi = cf - au;
az = &as;
*az = bi + 19112;
ar = 127 - 32;
at = 2147467017 + (long)au - 75497147;
az = &ax;
ai = ~z;
*ba = &aw;
au = ((cf - 144) & bi) ^ 605;
bg = au & 605;
u = ~bg;
be = au | 605;
s = ~u;
t = ~be;
bf = t | s;
au = ~bf;
*ay = 32768 - au;
aj = v(0, ah);
aj = v(aj, 250);
aj = v(aj, 899262387);
aj = v(aj, 60);
aj = v(aj, (long)((unsigned long)ap << 56) >> 56);
aj = v(aj, (long)((unsigned long)ao << 56) >> 56);
aj = v(aj, ai);
aj = v(aj, 77);
aj = v(aj, 36);
aj = v(aj, 247);
aj = v(aj, (long)((unsigned long)bi << 48) >> 48);
aj = v(aj, ar);
aj = v(aj, (long)((unsigned long)as << 48) >> 48);
aj = v(aj, 1406);
aj = v(aj, 228);
aj = v(aj, at);
aj = v(aj, (long)((unsigned long)au << 48) >> 48);
aj = v(aj, (long)((unsigned long)av << 48) >> 48);
aj = v(aj, (long)((unsigned long)aw << 48) >> 48);
aj = v(aj, (long)((unsigned long)ax << 48) >> 48);
aj = v(aj, w);
aj = v(aj, x);
aj = v(aj, z);
aj = v(aj, cf);
aj = v(aj, cg);
aj = v(aj, 0);
bc = *ay;
aj = v(aj, (long)((unsigned long)bc << 48) >> 48);
bd = *az;
aj = v(aj, (long)((unsigned long)bd << 48) >> 48);
return aj;
}
void ck(a w) {
bk = 43262 + 3.75f;
do {
bl = (long)1073741825 + 1073741824 - -2147483646;
bm = aq = ak;
bb = 939575033 ^ ak;
aq = aq & bb;
bh = ci(0, aq, 0) + 1801156138;
am = 39069 * bl;
al = am;
am = bh * w;
al = al + am % 46337;
bq = bp = 2486624264;
bq = bq * w % 3037000493;
bp = bp + bq;
an = y(al, 62, 6155, bp, bk - 43263, 9223372032895333888) - 1298608474;
ak = an;
} while (-bm > 0);
}
a ci(short w, a x, short z) {
short bi = 9076;
d *cl;
a cm;
do {
ce = &cc;
ag = af;
bs = -2147483647 + bi;
*ce = &bu;
bj = (9076 - (unsigned long)bs) << 44 >> 44;
cl = &ag.e;
bz = cj(3627062303, 2955858147, 1436121834, 1, 9223372031595634702) -
175482970;
bi = x;
bo = bz - bs;
bu = **cl;
by = -7648;
} while (21497 - (short)bs - ~w <= 13305 + z);
cb = by;
by = -24 >> 24;
ca = 388104191 + 536870912 - by;
by = 268435457 - -1611472242;
if (bu + (bi == 0 ? x : -814992270) < bu)
bt = *cc;
*ce = &bo;
cm = v(0, bx);
cm = v(cm, (long)((unsigned long)32768 << 48) >> 48);
cm = v(cm, by);
cm = v(cm, 0);
cm = v(cm, (long)((unsigned long)524288 << 44) >> 44);
cm = v(cm, bj);
cm = v(cm, 1);
cm = v(cm, (long)((unsigned long)bn << 44) >> 44);
cm = v(cm, 252);
cm = v(cm, br);
cm = v(cm, 726034444);
cm = v(cm, 2683);
cm = v(cm, bo);
cm = v(cm, bs);
cm = v(cm, cb);
cm = v(cm, ca);
cm = v(cm, 254);
cm = v(cm, bt);
cm = v(cm, cd);
cm = v(cm, 32767);
cm = v(cm, 0);
cm = v(cm, 0);
cm = v(cm, 0);
cm = v(cm, 0);
cm = v(cm, 0);
cm = v(cm, 0);
cm = v(cm, *cc);
cm = v(cm, bu);
return cm;
}
a main() { ck(30); }