https://gcc.gnu.org/bugzilla/show_bug.cgi?id=127814
Bug ID: 127814
Summary: wrong code at -O3 with -fno-vect-cost-model 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/csjKEch7d
Note:
- fails: 12.1 to trunk
- works: 11.5 and earlier
[521] % 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 20261010 (experimental) [master r17-1628-gd1c12591336] (GCC)
[522] %
[522] % gcctk -O3 small.c; ./a.out
[523] %
[523] % gcctk -O3 -fno-vect-cost-model small.c
[524] % ./a.out
Aborted
[525] %
[525] % cat small.c
struct {
long a[1];
int d;
} aa = {{0}, 144}, *ao;
int e, f = -224, h = -6294000, n, v = -1, ag, ai, aj, ap = -81, aq, ar,
as = -167, av, aw, ax = -1737895715, bf, bj, bl, bm, bn, bp, l[256],
*bg,
*bu, **bi, **bw;
char t = -121, ad = -54, au, bd, be, bk, bq, *bh;
long u = -139, ay = -86, az = -238, bc, br, bs, bt, bx = -164, bz, *bv;
short w, ac = -45, ah, ak, al, am, at, ba, bb, bo, ca = -211, cc = -54,
cd = -99, ce = -28901, cf = -20990, cg, ch, *ae, *ci, **af, **cj;
long (*by)[1];
int g(int x) {
unsigned k = x;
for (int i = 0; i < 4; ++i)
e |= (k >> i * 8 & 255) << (3 - i) * 8;
return e;
}
int m(int x, int y) {
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;
l[i] = c;
}
unsigned o = x;
int p = y;
for (int b = 0; b < 4; ++b) {
char ab = p;
p >>= 8;
o = o >> 8 ^ l[(o ^ ab) & 255];
}
return o;
}
int q(long x, short y, int z, short ck, int cl) {
bi = &bg;
*bi = &ar;
at = ck - -12 * ck;
bh = &be;
bd = 127;
aq = 3 + (1863153918 & as);
as = ~cl + 1025;
*bg = -671089675 - g(1048577 * as);
*bh = 31;
bb = -11560 - 16;
au = -48 + 127;
ba = ck - 30691 + 32767;
bc = 7978 - ay;
bh = &bd;
av = m(0, 3);
av = m(av, at);
av = m(av, au);
av = m(av, ap);
av = m(av, ar);
av = m(av, aq);
av = m(av, ay);
av = m(av, az);
av = m(av, -1208611946);
av = m(av, 2487);
av = m(av, (long)((unsigned long)bb << 48) >> 48);
av = m(av, ba);
av = m(av, bc);
av = m(av, 127);
av = m(av, be);
av = m(av, 0);
av = m(av, x);
av = m(av, y);
av = m(av, 0);
av = m(av, (long)((unsigned long)z << 44) >> 44);
av = m(av, ck);
av = m(av, cl);
av = m(av, 0);
bk = *bh;
av = m(av, bk);
return av;
}
int r(long, signed char, short, signed char, long, long);
int s(int x, short y) {
char cm = -127;
cg = cd;
cj = &ci;
bt = -1235585;
bz = -1073741640 - 78;
bn = 1074266113 % x;
*cj = &cg;
bm = 524287 - 262044 + ((long)((unsigned long)cd << 48) >> 48);
bp = m(0, (long)((unsigned long)ca << 48) >> 48);
bp = m(bp, bt);
bp = m(bp, 78);
bp = m(bp, bm);
bp = m(bp, bn);
bp = m(bp, 491109);
bp = m(bp, (long)((unsigned long)cc << 48) >> 48);
bp = m(bp, (long)((unsigned long)cd << 48) >> 48);
bp = m(bp, (long)((unsigned long)ce << 48) >> 48);
bp = m(bp, 1);
bp = m(bp, 8114);
bp = m(bp, 105);
bp = m(bp, (long)((unsigned long)cf << 48) >> 48);
bp = m(bp, bz);
bp = m(bp, bx);
bp = m(bp, 185);
bp = m(bp, (long)((unsigned long)cm << 56) >> 56);
bp = m(bp, 0);
bp = m(bp, 0);
bp = m(bp, 0);
bp = m(bp, x);
bp = m(bp, y);
bp = m(bp, 0);
ch = *ci;
bp = m(bp, (long)((unsigned long)ch << 48) >> 48);
bp = m(bp, (long)((unsigned long)cd << 48) >> 48);
return bp;
}
int an(char x, char y, int z, short ck, long cl) {
af = &ae;
n = -1;
*af = ∾
w = 32767 - 1;
am = w & 3;
ak = ~am;
al = w | 3;
w = al & ak;
aj = r(cl - 4611686016548265118, -38, 768, -1, 2415619623, -4294849770) -
1068550532;
ai = q(1, 1, -262341, 1991, 1) + aj;
ag = m(0, 116);
ag = m(ag, (long)((unsigned long)t << 56) >> 56);
ag = m(ag, u);
ag = m(ag, cl);
ag = m(ag, (long)((unsigned long)h << 40) >> 40);
ag = m(ag, f);
ag = m(ag, w);
ag = m(ag, 0);
ag = m(ag, n);
ag = m(ag, (long)((unsigned long)ac << 48) >> 48);
ag = m(ag, v);
ag = m(ag, (long)((unsigned long)ad << 56) >> 56);
ag = m(ag, x);
ag = m(ag, y);
ag = m(ag, z);
ag = m(ag, ai);
ag = m(ag, ck);
ag = m(ag, cl);
ah = *ae;
ag = m(ag, (long)((unsigned long)ah << 48) >> 48);
ag = m(ag, (long)((unsigned long)t << 56) >> 56);
return ag;
}
int r(long x, signed char y, short z, signed char ck, long cl, long cn) {
int cb = -996736171;
bu = &cb;
bw = &bu;
ao = &aa;
by = &ao->a;
bv = *by;
if (0 == x)
*bu = 0;
bf = s(1073741824, z - 769) - 1993837874;
aw = 2147483548 - 429496672 * bf;
*bw = &bf;
while (1) {
bq = ck - (17 / ck + y);
br = 158687952 - 1902071836;
aa.a[0] = x - -3 * cn;
*bu = -2 + bf;
if (-520093677 * bf >= cb)
break;
}
bj = -8342959 + 158687952;
bo = 1660 - 14 * z;
bu = &ao->d;
bl = m(0, 370125827);
bl = m(bl, ax);
bl = m(bl, 0);
bl = m(bl, aw);
bl = m(bl, 30);
bl = m(bl, 72);
bl = m(bl, 250);
bl = m(bl, (long)((unsigned long)bo << 48) >> 48);
bl = m(bl, bq);
bl = m(bl, aa.a[0]);
bl = m(bl, 144);
bl = m(bl, bf);
bl = m(bl, br);
bl = m(bl, (long)((unsigned long)bj << 40) >> 40);
bl = m(bl, 1073741824);
bl = m(bl, 158687952);
bl = m(bl, x);
bl = m(bl, (long)((unsigned long)y << 56) >> 56);
bl = m(bl, z);
bl = m(bl, ck);
bl = m(bl, cl);
bl = m(bl, cn);
bl = m(bl, *bu);
bs = *bv;
bl = m(bl, bs);
return bl;
}
int main() {
int co = an(-1, -1, -1, -1, -1);
if (1919592802 != co)
__builtin_abort();
return 0;
}