https://gcc.gnu.org/bugzilla/show_bug.cgi?id=121522
Bug ID: 121522
Summary: wrong code at -O3 on x86_64-linux-gnu (the generated
code hangs)
Product: gcc
Version: unknown
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/K7csr9qM7
Note:
- fails: 14.* and later
- works: 13.* and earlier
- -fno-tree-slsr makes it disappear
[537] % 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/16.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++ --disable-werror --enable-multilib
Thread model: posix
Supported LTO compression algorithms: zlib
gcc version 16.0.0 20250812 (experimental) (GCC)
[538] %
[538] % gcctk -O2 small.c
[539] % ./a.out
[540] %
[540] % gcctk -O3 small.c
[541] % timeout -s 9 5 ./a.out
Killed
[542] % cat small.c
int a[] = {
0, 1996959894, 3993919788, 4, 7, 5,
3915621685, 2657392035, 4, 2044508324, 0, 2547177864,
5, 1, 7, 4049, 498536548, 6,
4089016648, 4, 50548861, 3, 107580753, 2211677639,
0, 2, 2, 2321926636, 7, 5,
4195302755, 7, 997073096, 6, 2, 2,
1006888145, 607687, 3524101629, 2768942443, 901097722, 9000684,
6, 8065728, 853044451, 1172266101, 705015759, 2882616665,
651767980, 6, 4, 3218104598, 3, 1,
3485111705, 3099436303, 671266974, 4, 30930, 70347812,
795835527, 5, 3244367275, 3060149565, 1994146192, 31158534,
2, 4023717930, 1907459465, 5, 3, 3904427059,
2013776290, 6, 4, 0, 3, 141376813,
9, 3865271297, 802195444, 6, 8001368, 4066508878,
70925, 3092731, 5, 4111451223, 706088902, 314042704,
2, 2, 1658658271, 7, 3, 4224994405,
303535960, 6, 7007092, 9037538, 70817, 1,
3, 3554079995, 1131014506, 6, 2909243462, 6,
7, 7, 2852801631, 708648649, 8, 6,
6048, 3373015174, 909, 5, 3110523913, 3462522015,
4, 702138776, 2966460450, 3352799412, 504918807, 783551873,
3082640443, 3233442989, 3988292384, 6, 62317068, 10842,
5, 1, 70997, 1943803523, 3814918930, 2489596804,
0, 2053790376, 3826175755, 2466906013, 167816743, 2097651377,
4027552580, 90386, 2, 2050814, 5, 2154129355,
426522225, 507879, 4275313526, 0, 6, 2,
708143, 2394877945, 397917763, 1622183637, 604390888, 2714866558,
953729732, 1340076626, 3518719985, 60999, 1068828381, 1219638859,
3624741850, 8, 906185462, 1090812512, 3747672003, 2825379669,
5, 1181335161, 4, 3160834842, 628085408, 6,
109, 8078467, 3, 400815, 3317316542, 608,
4, 6, 1, 5, 752459403, 1,
607071920, 3965973030, 1969922972, 40735498, 2617837225, 3943577151,
3087877, 908371, 2512341634, 803740692, 2075208622, 2,
3, 3855990285, 2094854071, 198958881, 2029012, 4057260610,
2, 0, 1, 4139329115, 1, 414664567,
2282248934, 4279200368, 1711684554, 6, 405801727, 5,
1634467795, 1, 5067896, 3608007406, 1308918612, 8,
2808555105, 3, 1, 1047427035, 8, 703836,
1088359270, 0, 2847714899, 9, 1202900863, 7,
3183342108, 0, 2, 0, 3134207493, 3453421203,
9, 601450431, 3009837614, 6, 6, 4,
3020668471, 3272380065, 1510334235, 755167117};
int d(int e, char h) { return (e >> 8 & 16777215) ^ a[(e ^ h) & 255]; }
int i(int e, int h[]) {
int f, b = 4294967295, g = 0;
for (; g < e; ++g) {
int c;
f = (b >> 8 & 16777215) ^ a[(b ^ h[g]) & 255];
c = f;
c = d(c, h[g] >> 8);
c = d(c, h[g] >> 6);
c = d(c, h[g] >> 24);
b = c;
}
b = (unsigned)(b ^ 4294967295) % 2147483647;
return b;
}
int j(int e, int h, int k, int l, int m, int n, int p, int q, int u) {
int r, s, t = -1 + k - -1;
if (!p)
k = 0;
s = 1 - (-1 + p - 1);
r = -1 - k - 1 / m + 1;
int v[] = {e, t, h, s, k, l, m, n, r, p, q, u};
return i(12, v);
}
int main() {
int e = -5, h = -805306364, k = 2147483647, l = 8, m = -536870911, n =
-1342177282;
int o = 0, r;
v:
r = -1 + h + 1 / l - 1;
if (j(-3, 30, -4, -4, -4, -4, -4, 32, -4) - 445113689 - r +
(j(-2, 23, -3, -3, -3, -3, -3, 22, -3) - 1062535215) * k +
(j(-1, 1, -2, -2, -2, -2, -2, 1, -2) - 950633090) * n +
j(-1, 1, -2, -2, -2, -2, -2, 1, -2) - 950633090 - e - 1 ==
0)
goto w;
do {
l = o;
goto v;
y:
o = -r;
} while (j(-3, 30, -4, -4, -4, -4, -4, 32, -4) + o == 0);
w:
r = -1 - m - -r - -1;
if ((j(-2, 23, -3, -3, -3, -3, -3, 22, -3) - 1062535222) * r + o > 0)
goto y;
return 0;
}