https://gcc.gnu.org/bugzilla/show_bug.cgi?id=127070
Bug ID: 127070
Summary: wrong code at -O3 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/149fG7szr
Note:
- fails: 16.2 and trunk
- works: 16.1 and earlier
[621] % 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 20260825 (experimental) [master r17-1628-gd1c12591336] (GCC)
[622] %
[622] % gcctk -O2 small.c; ./a.out
[623] %
[623] % gcctk -O3 small.c
[624] % timeout -s 9 5 ./a.out
Killed
[625] % cat small.c
int k, u, x = -56, aa, ab, ac, ad;
long o, r, s, t, w, ae, af;
short p, q, v, *ag;
__attribute__((noinline)) int al(int am, int an) {
static int f[256];
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;
}
unsigned i = am;
int j = an;
for (int b = 0; b < 4; ++b) {
char a = j;
j >>= 8;
i = i >> 8 ^ f[(i ^ a) & 255];
}
return i;
}
__attribute__((noinline)) int ao(long p1, long p2, short p3, int p4, long p5) {
al(0, 0);
return 0;
}
int ap(int, short);
int aq(signed char, short, signed char, signed char, short);
void ar(long am, int an) {
char z, d = 81;
z = 4;
short *e;
long l = 0;
int m, n;
e = &v;
if (an)
ah:
goto ai;
ai:
s = s % 3037000493;
l = l % 3037000493 * s % 3037000493 * q % 3037000493 + t;
ao(l, p, 0, 0, 0);
v = p;
if (*e <= 0)
goto aj;
goto ak;
aj:
m = (long)d << 44 >> 44;
u = 1 ^ m;
n = 81 ^ m;
u = u & n;
ap(u, 0);
if (o) {
ak:
r = 7 * an;
z = v;
*e = 2047;
d = -v;
if (am)
goto ah;
p = v;
}
al(0, d);
al(0, z);
al(0, 0);
}
__attribute__((noinline)) int ap(int am, short p) {
short y, as;
while (1) {
y = am ^ x;
as = -56 ^ y;
x = aq(-128, as, -111, 15, -1408) - 765563752;
if (536870884 - 536870941 + ~x == -2)
break;
}
return 0;
}
int aq(signed char am, short an, signed char at, signed char au, short av) {
short aw, ax, ay;
ax = 0;
while (1) {
ag = &aw;
*ag = 17279 - (32767 | ax);
af = -536854912 + ((long)((unsigned long)aw << 48) >> 48);
if (0 < ax)
break;
ae = -1641331 + aw;
ax = aw - 16559;
for (int g = 0; g < 4; ++g)
k |= (1616 >> g * 8 & 255) << (3 - g) * 8;
}
aa = k + 1;
ab = al(0, (long)((unsigned long)aw << 48) >> 48);
ab = al(ab, 0);
ab = al(ab, ax);
ab = al(ab, af);
ab = al(ab, ae);
ab = al(ab, aa);
ab = al(ab, (long)((unsigned long)am << 56) >> 56);
ab = al(ab, an);
ab = al(ab, (long)((unsigned long)at << 56) >> 56);
ab = al(ab, au);
ab = al(ab, (long)((unsigned long)av << 52) >> 52);
ay = *ag;
ab = al(ab, (long)((unsigned long)ay << 48) >> 48);
ab = al(ab, 0);
return ab;
}
int main() {
ad = al(ad, w);
int az = ac + 80309;
ar(0, az);
return 0;
}