llvm / llvm/llvm-project

wrong code at -O{1,2,3} on x86_64-linux-gnu

Open
#217,217 1 comment 0 reactions 0 assignees View on GitHub
llvm:optimizations miscompilation regression:23
Dominant language
LLVM
Stars
40.5k
Forks
18.7k
PR merge metrics
PR metrics pending

Description

Compiler Explorer: https://godbolt.org/z/njW3vreE6

Note:
- fails: trunk
- works: 22.1.0 and earlier
- seems difficult to reduce much further

```
[603] % clangtk -v
clang version 24.0.0git (https://github.com/llvm/llvm-project.git 8bcec584121b5274c8ee854443342cd4266c652c)
Target: x86_64-unknown-linux-gnu
Thread model: posix
InstalledDir: /local/home/suz/suz-local/software/local/clang-trunk/bin
Build config: +assertions
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/10
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/11
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/13
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/14
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/9
Selected GCC installation: /usr/lib/gcc/x86_64-linux-gnu/14
Candidate multilib: .;@m64
Selected multilib: .;@m64
[604] %
[604] % clangtk -O0 -w small.c; ./a.out
[605] %
[605] % clangtk -O1 -w small.c
[606] % ./a.out
Aborted
```

```c
struct a {
long g;
int d[1];
};
int f[256], w = 223, x = 60, af, ak, al, am, an, ao, ap, aq, bm, bo, z, bq, cc,
cd = -2010266311, ce, ci, cv, da, dd, dh, yt2_0, yv3 = -175, rk,
y__dfa20_1, r1_0, r1_1, r1_3, z2, r2_2,
r2_3, *yp1;
short h = -131, ab, k = -96, ag, at, au, av, t = -233, u = -88;
char aw = -115, v = -100, ar, ax, bl, bn = -11, bp = -79, ca = -90, cj, cl, co,
cp;
long ac = -254, ad = -1, ae = -115, ah, ai, aj, y, br, bs, bt, cb, cf, cg, ch,
ck, cq = -71, cr = -70, cs = -1206829959439835166, ct, cu, db = -227, dc,
de, df, di, dj, dl, dm, dn, r0_6, z3, *cw, *cx, **cy, **cz;
double cm, cn;
float dg = -1.75f, dk, y_pld_0, *yp0;
char e(char p) { return 0; }
int p(int p1, int p2) {
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 l = p1;
int m = p2;
for (int b = 0; b < 4; ++b) {
char aa = m;
m >>= 8;
l = l >> 8 ^ f[(l ^ aa) & 255];
}
return l;
}
void n(int p1, int p2) {
if (p1 != p2)
__builtin_abort();
}
int o(long p1, short p2, long p3, short p4, int p5) {
cf = -130;
ch = -237;
cg = -1567612871 - p1;
at = 32768 - p4;
cc = 11 * p5;
cb = 538988457 - ((long)((unsigned long)at << 48) >> 48);
ce = -16 * p5 + p2;
ci = p(0, (long)((unsigned long)at << 48) >> 48);
ci = p(ci, 0);
ci = p(ci, cb);
ci = p(ci, 0);
ci = p(ci, cc);
ci = p(ci, 66);
ci = p(ci, cd);
ci = p(ci, 43);
ci = p(ci, ce);
ci = p(ci, cf);
ci = p(ci, 2132921188);
ci = p(ci, cg);
ci = p(ci, ch);
ci = p(ci, 3.0f);
ci = p(ci, p1);
ci = p(ci, p2);
ci = p(ci, p3);
ci = p(ci, (long)((unsigned long)p4 << 48) >> 48);
ci = p(ci, 0);
ci = p(ci, p5);
ci = p(ci, 0);
ci = p(ci, 0);
ci = p(ci, 0);
return ci;
}
int q(short, int, int, char, int, short, char);
int r(int, short);
int s(int p1, int p2, short p3, short p4, float p5) {
dj = -119;
dn = -41;
r0_6 = -1;
r1_1 = -4680666;
r1_3 = -1;
r2_3 = -573468538;
z3 = 821624880 - 45;
z2 = ~p2 - 16777211 - (25 >> p2);
r2_2 = -2122769132 + (11 << p2) - -1082660610;
dl = -656266378 - ~z3;
r1_0 = -3839180 + 45;
dm = 13041664 + z3;
z = p(0, dj);
z = p(z, dl);
z = p(z, dm);
z = p(z, 212933616);
z = p(z, dn);
z = p(z, 241);
z = p(z, r0_6);
z = p(z, 934524928);
z = p(z, 45);
z = p(z, 0);
z = p(z, (long)((unsigned long)r1_0 << 40) >> 40);
z = p(z, (long)((unsigned long)r1_1 << 40) >> 40);
z = p(z, 8388607);
z = p(z, r1_3);
z = p(z, z2);
z = p(z, 223);
z = p(z, -2147483648);
z = p(z, r2_2);
z = p(z, r2_3);
z = p(z, z3);
z = p(z, 0);
z = p(z, (long)((unsigned long)p1 << 44) >> 44);
z = p(z, p2);
z = p(z, 0);
z = p(z, p3);
z = p(z, (long)((unsigned long)p4 << 48) >> 48);
z = p(z, p5);
z = p(z, z2);
z = p(z, 0);
return z;
}
int as(short p1, int p2, long p3, char p4, short p5) {
char ay;
struct a az[1] = {{3, {-2147483647}}};
int ba = 0, bf, *bb = 0, *bc = 0, **bd, **be;
long bg, bh;
short bi, bj, bk;
bb = 0;
bc = 0;
bd = &bc;
be = &bb;
bb = 0;
ah = (long)((unsigned long)p4 << 56) >> 56;
ai = ah + 3037000493;
ai = ai % 3037000493;
bg = (long)p1 << 48 >> 48;
bh = bg + 3037000493;
bh = bh % 3037000493;
y = 449022400 * ai % 3037000493;
aj = 929519526 * bh % 3037000493 + y;
aj = aj % 3037000493;
bi = (long)x << 32 >> 32 << 52 >> 52;
bj = bi % 43;
bj = bj + 43;
bj = bj % 43;
bk = 30 * bj;
bk = bk % 43;
p2 % 7 + am % 7;
ak = al = o(aj - 2170430419 + 9223372033096679384, bk - 37 + 80, 2113970144,
k - 8096, 134217728) +
1701997322;
bc = ⁡
ba = al - 7 * p2;
ag = -16385 - 32768 * p1 - 32767 * p1;
if (-1596270585 - -335544313 / ba == 3 * p2 - 2066032640 / ba)
goto bv;
ay = 9 * p4 + 8;
bb = bc;
be = bd;
v = p4 + 2;
bv:
bb = &w;
**be;
*bc = (long)((unsigned long)ag << 48) >> 48;
an = ao = w % 337;
ao = ao % 337;
aq = *bc;
bm = aq % 46337 + 46337;
bm = bm % 46337;
ap = 43071 * ao % 46337;
bo = bo + 15092 * bm % 46337 + ap;
bo = bo % 46337;
ar = (unsigned)k << 8 >> 8;
ax = ax ^ ae;
ax = ax ^ ar;
z = *bc;
bq = q(ag - 14658, 671089295, bo - 46315 - 22, 53 ^ bl, z + 16387, 318,
p4 - 61) +
78377272;
*bb = bq + ba;
*bd = bb;
if (e((p4 + 7) & p4) + 2)
bw:
bd = 0;
ab = ag + p1;
bb = &ba;
az[0].g = ag > 4;
az[0].g = ba >> 2 > (ag < 4);
bb = bc;
if (-1339633854 > *bc)
goto by;
*bc = -6 * p2 + *bc - (1 >> ba);
ay = -1 - 3 * p4;
w = *bc + 403083200;
if (16368 - p1 == 16367 - 3 % p1)
goto bw;
bc = &az[0].d[0];
k = p1;
bc = *bd;
bb = 0;
by:
az[0].g = (-1064960 - (unsigned long)((long)((unsigned long)ag << 48) >> 48)) << 24 >> 24;
x = 1689645733 | ba;
ag = 53 - -61 * p1 - 32658;
bf = p(0, (long)((unsigned long)ab << 48) >> 48);
bf = p(bf, (long)((unsigned long)h << 48) >> 48);
bf = p(bf, (long)((unsigned long)k << 48) >> 48);
bf = p(bf, (long)ay << 56 >> 56);
bf = p(bf, 179);
bf = p(bf, ad);
bf = p(bf, 64);
bf = p(bf, (long)((unsigned long)aw << 56) >> 56) ^ 2090539235 ^ 2090539235;
bf = p(bf, 46);
bf = bs = p(bf, 0);
bf = p(bf, 1);
bf = p(bf, (long)((unsigned long)v << 56) >> 56);
bf = p(bf, ae);
bf = p(bf, 0);
bf = p(bf, ac);
bf = p(bf, w);
bf = p(bf, af);
bf = p(bf, x);
bf = bt = p(bf, (unsigned long)az[0].g << 24 >> 24);
bf = p(bf, az[0].d[0]);
bf = p(bf, (long)((unsigned long)ag << 48) >> 48);
bf = p(bf, ba);
bf = p(bf, (unsigned long)p1 << 48 >> 48);
bf = p(bf, p2);
bf = p(bf, p3);
bf = p(bf, (long)((unsigned long)p4 << 56) >> 56);
bf = p(bf, (long)((unsigned long)p5 << 52) >> 52);
bf = p(bf, *bb);
bf = p(bf, *bc);
br = (unsigned long)bf << 32 >> 32;
return br;
}
int q(short p1, int p2, int p3, char p4, int p5, short p6, char p7) {
cm = -8.0;
cn = -1.0;
cy = &cw;
cz = &cx;
dd = r(-867520, p1 + 31041) + 1539996822;
*cz = &cq;
cv = 44309758 * p3 + dd;
cj = p4 - 96;
au = p1 + p6;
*cy = cx;
cq = -4 - (*cx - 615964683);
ck = -213;
da = p(0, ck);
da = p(da, (long)((unsigned long)bn << 56) >> 56);
da = p(da, 228);
da = p(da, 1);
da = p(da, 0);
da = p(da, cm);
da = p(da, 0);
da = p(da, 0);
da = p(da, 0);
da = p(da, 3.0);
da = p(da, cn);
da = p(da, (long)((unsigned long)au << 48) >> 48);
da = p(da, 0);
da = p(da, cq);
da = p(da, 61);
da = p(da, (long)((unsigned long)ca << 56) >> 56);
da = p(da, (long)((unsigned long)bp << 56) >> 56);
da = p(da, cr);
da = p(da, 225);
da = p(da, 102);
da = p(da, cs);
da = p(da, (long)((unsigned long)cj << 56) >> 56);
da = p(da, cv);
da = p(da, (long)((unsigned long)p1 << 48) >> 48);
da = p(da, p2);
da = p(da, p3);
da = p(da, p4);
da = p(da, p5);
da = p(da, p6);
da = p(da, (long)((unsigned long)p7 << 56) >> 56);
ct = *cw;
da = p(da, ct);
cu = *cx;
da = p(da, cu);
return da;
}
int r(int p1, short p2) {
de = -238;
df = -9223372036854775807;
di = -140;
co = -108;
cp = -40;
yp0 = &dk;
yp1 = &yv3;
dh = 1082556242 + ~yv3;
*yp0 = -3.75f + 8.0f;
yt2_0 = -85523240 / yv3;
av = 11106 - -8192 + 32767 * p2;
cl = 70 - db;
y__dfa20_1 =
s(-361723, 1, u + 16472, p2 - 32767, -536870912.0f) - 2059315276;
*yp1 = -6193984 * yv3 - y__dfa20_1;
dc = -1610612831 + yv3;
yv3 = db - *yp1;
rk = p(0, (long)((unsigned long)av << 48) >> 48);
rk = p(rk, (long)((unsigned long)32768 << 48) >> 48);
rk = p(rk, dh);
rk = p(rk, 0);
rk = p(rk, dg);
rk = p(rk, db);
rk = p(rk, dc);
rk = p(rk, dk);
rk = p(rk, 88);
rk = p(rk, de);
rk = p(rk, df);
rk = p(rk, di);
rk = p(rk, cl);
rk = p(rk, (long)((unsigned long)co << 56) >> 56);
rk = p(rk, 111);
rk = p(rk, 77);
rk = p(rk, 89);
rk = p(rk, 0);
rk = p(rk, (long)((unsigned long)cp << 56) >> 56);
rk = p(rk, 54);
rk = p(rk, yt2_0);
rk = p(rk, (long)((unsigned long)u << 48) >> 48);
rk = p(rk, (long)((unsigned long)t << 48) >> 48);
rk = p(rk, yv3);
rk = p(rk, yv3);
rk = p(rk, 0);
rk = p(rk, 0);
rk = p(rk, 0);
rk = p(rk, 0);
rk = p(rk, (long)((unsigned long)p1 << 40) >> 40);
rk = p(rk, p2);
rk = p(rk, 0);
y_pld_0 = *yp0;
rk = p(rk, y_pld_0);
rk = p(rk, *yp1);
return rk;
}
int main() {
int rr = as(1, 268435456, 1073741634, -4, -1825);
n(-2111982393, rr);
return 0;
}
```

Contributor guide

Open the contributing guide

Research direction

Start with the Compiler Explorer link and the provided small.c reproducer, compiling it with clangtk at -O0 through -O3 on x86_64-linux-gnu. Compare the result with clang 22.1.0 and earlier; done means the reproducer no longer aborts at the affected optimization levels while retaining the expected result.

Written by the indexing model from the issue text.

Assessment

Tech stack
c
Domain
compilers
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Active
Clarity
Mostly clear
Newbie friendliness
35/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.