llvm / llvm/llvm-project

wrong code at -O1 on x86_64-linux-gnu

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

Description

Compiler Explorer:

Note:
- fails: 20.1.0 to trunk
- works: 19.1.0 and earlier

```
[506] % clangtk -v
clang version 24.0.0git (https://github.com/llvm/llvm-project.git f3bc5801e20ce00feb55313735d7ee6b4d62bb23)
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
[507] %
[507] % clangtk -O0 -w small.c; ./a.out
[508] %
[508] % clangtk -O1 -w small.c
[509] % ./a.out
Floating point exception
```

```c
struct a {
char c;
long d[3];
} * c;
struct e {
long c;
int d[1];
};
char l, p, aa, ab, ac, ad, ae;
short m, o, r, d, f, g, h, j, k, n, u, v, x, y, z, af, ag, ah, ai, s;
int q, a, e, w, aj, ak, al, am, an;
void ao(int p1, int p2) {}
int ap(short, short, long);
void aq(char p1, double p2, double p3, long p4, long p5, short p6, short p7) {}
void ar(int);
void as(int);
void at(short au, int av) {
short aw[] = {1};
struct a ax[3] = {{3, {9, 1, 4}}};
int ay[] = {3, 7, 0};
struct e az[] = {{3,{0}}};
int *ba = 0, *bb = 0;
int **bc, **bd;
short be, bf, bg, bh, bi, bj;
ba = 0;
bb = 0;
bc = &bb;
bd = &ba;
ba = 0;
bb = &q;
a = 1879048193 - 7 * av;
aj = a | 3059;
r = -(8 * au) - 32767 * au;
bf = r & 3;
be = ~bf;
bh = r | 3;
r = bh & be;
r = r ^ 3;
r = r ^ 8;
bj = r & 8;
bg = ~bj;
bi = r | 8;
r = bi & bg;
c = &ax[2];
ba = 0;
if (-1596270585 - -335544313 / a == 3 * av - 2066032640 / a - 4 / av)
goto bl;
ax[0].c = l * l + 1 + 9 * l + 8;
ba = bb;
bd = bc;
p = l + 2;
bl:
ba = &ay[0];
**bd;
*bb = 0;
*ba = 1934090263 + a;
bb = *bd;
bm:
bc = 0;
s = (r + au) & a;
az[0].c = r > 4;
az[0].c = a > 4 + r;
ba = bb;
if ((-1339633854 | av) > 6 + *bb)
goto bo;
*bb = -6 * av + *bb - (1 >> a);
ax[0].c = 1 + 3 * l;
ba = bb;
ay[0] = *bb + 403083200;
if (16368 - au == 16367 - 3 % au)
goto bm;
bb = &az[0].d[0];
o = au;
bb = *bc;
ba = *bd + r - au + (m != 6);
if (au + r * -au / -(au == 2) ? 0 : r)
bo:
bb = *bd;
az[0].c = r << 8 >> 8 << 4 >> 4;
ba = *bd;
r = -(61 * au + 8);
r = r ^ 6;
r = (r ^ 3) | a;
aa = m << 2 >> aa % 11;
ab = ab + 1;
ab = ab % 11;
ac = p % 11;
ac = ac + 1;
ac = ac % 11;
ad = ax[2].d[0] = ad % 11;
ae = ae + 1;
ae = ae % 11;
ag = l << 6 >> 6 << 2 >> 2;
ai = 4 ^ ah;
aq(0, 0, 0, 0, 0, ag + 3, 0 ^ ai);
x = o % 81;
x = x + 1;
x = x % 81;
y = (long)av << 2 >> 2;
z = y % 81;
z = z + 1;
z = z % 81;
af = au % 81;
af = e = *ba;
d = (unsigned long)e << 32 >> 32;
f = d % 181;
f = f + 181;
f = f % 181;
g = 106;
h = 119 * f;
h = h % 181;
g = g + h;
g = g % 181;
j = ax[1].d[0];
k = ax[1].d[1];
n = (unsigned)ay[0] << 2 >> 2;
u = j ^ k;
u = u ^ n;
v ^ u;
for (int b = 0; b; ++b)
;
w = ap(g - 87 - 16384, v, 0);
ao(0, (long)aw > 0);
ao(0, o > 8);
ao(0, ax[0].c > 6);
int i = ax[0].d[0];
for (int b = 0; b; ++b)
ao(0, ax[0].d[1]);
ao(0, ax[0].d[2]);
ao(0, ax[1].c > 6);
ao(0, ax[1].d[0]);
ao(0, ax[1].d[1]);
ao(0, ax[1].d[2]);
ao(0, p > 6);
ao(0, ax[2].d[0]);
ao(0, ax[2].d[1]);
ao(0, ax[2].d[2]);
ao(0, ay[0]);
ao(0, q);
ao(0, ay[2]);
ao(0, az[0].c > 4);
ao(0, az[0].d[0]);
ao(0, r > 8);
ao(0, a);
ao(0, au > 8);
ao(0, w);
ao(0, 0);
ao(0, 0);
ao(0, 0);
ao(0, *ba);
ao(0, *bb);
}
int ap(short au, short p, long q) {
ak = (long)((unsigned long)au << 48) >> 48;
al = -16383 ^ ak;
ar(al);
return 0;
}
void ar(int au) { as(au - 9); }
void as(int au) {
if (-au > 0)
return;
an = 2 % am;
}
int main() {
int t = -239;
at(1, t + 268435695);
return 0;
}
```

Contributor guide

Open the contributing guide

Research direction

Save the supplied reproducer as small.c and compile it with the reported clangtk -O0 and -O1 commands on x86_64-unknown-linux-gnu, then confirm the differing runtime behavior. Compare the generated behavior and compiler output to narrow down the optimization change; done means the -O1 build no longer produces the reported floating point exception.

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
48/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.