https://gcc.gnu.org/bugzilla/show_bug.cgi?id=125713
Bug ID: 125713
Summary: wrong code at -O1 on x86_64-linux-gnu
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/xTrvhhvWb
Note:
- fails: 14.1 till trunk
- works: 13.4 and earlier
[568] % 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++ --disable-werror --enable-multilib
Thread model: posix
Supported LTO compression algorithms: zlib
gcc version 17.0.0 20260609 (experimental) (GCC)
[569] %
[569] % gcctk -O0 small.c; ./a.out
[570] %
[570] % gcctk -O1 small.c
[571] % ./a.out
Aborted
[572] %
[572] % cat small.c
int a[256], j, k, l, m, n;
int aa(int p, int q) {
for (int f = 0; f < 256; ++f) {
unsigned c = f;
for (int g = 0; g < 8; ++g)
c = c & 1 ? c >> 1 ^ 3988292384 : c >> 1;
a[f] = c;
}
unsigned h = p;
int i = q;
for (int b = 0; b < 4; ++b) {
char d = i;
i >>= 8;
h = h >> 8 ^ a[(h ^ d) & 255];
}
return h;
}
int o(int p, int q, long r, char s, long t, int u) {
int v = 1, *x, *y;
short w = 1;
x = y = &v;
z:
*y = -274202625 + *x;
if (822083585 <= q - v)
goto ac;
j = -8;
if (*x == -q)
goto ae;
w = w - 2;
m = 32751;
if (536870944 == (3 << u) + 2147483584 / u)
goto z;
ac:
k = 1593769989 - ((long)((unsigned long)j << 56) >> 56);
ae:
l = -2138554379;
n = aa(0, v);
n = aa(n, 25165821);
n = aa(n, (long)((unsigned long)j << 56) >> 56);
n = aa(n, k);
n = aa(n, 1);
n = aa(n, w);
n = aa(n, 16375);
n = aa(n, l);
n = aa(n, 1);
n = aa(n, 1);
n = aa(n, 1);
n = aa(n, 1);
n = aa(n, 1);
n = aa(n, 1);
n = aa(n, 1);
n = aa(n, m);
n = aa(n, p);
n = aa(n, q);
n = aa(n, r);
n = aa(n, (long)((unsigned long)s << 56) >> 56);
n = aa(n, t);
n = aa(n, u);
n = aa(n, *x);
n = aa(n, *y);
return n;
}
int main() {
int e = o(2, 1, 1342177473, -100, 4294967222, 4);
if (1207337067 != e)
__builtin_abort();
return 0;
}