The following code is miscompiled by the current clang trunk and clang 3.3 on x86_64-linux-gnu at -Os and -O3 in 64-bit mode (but not 32-bit mode). This is a regression from clang 3.2. $ clang-trunk -v clang version 3.5 (trunk 195973) Target: x86_64-unknown-linux-gnu Thread model: posix Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/4.4 Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/4.4.6 Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/4.4.7 Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/4.6 Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/4.6.3 Selected GCC installation: /usr/lib/gcc/x86_64-linux-gnu/4.6 $ $ clang-trunk -O1 small.c; a.out 0 $ clang-trunk -O2 small.c; a.out 0 $ clang-3.2 -Os small.c; a.out 0 $ $ clang-trunk -Os small.c; a.out 1 $ clang-3.3 -Os small.c; a.out 1 $ ---------------------------------- int printf (const char *, ...); int a, b, c, d, f, g; struct S0 { char f0; int f1; int f2; } e, u; int fn1 () { return b; } int fn2 () { struct S0 j = { 0, 0, 1 }; e = j; if (fn1 () >= 0) { e.f2 = 0; j = u; } else for (;;) for (e.f2 = 0; e.f2 < 1;) if (d) return 0; for (; j.f0; j.f0++) { if (g) e.f1 = j.f1; f = a || 1 >> c ? 0 >> c : 1; } return 0; } int main () { fn2 (); printf ("%d\n", e.f2); return 0; }
Below is a variant that fails at -O1, -Os, and -O2 (but not -O3): -------------------------------- int printf (const char *, ...); int a, d, h, c; char b; struct S0 { char f0; int f1; int f2; } e, f, g; void fn1 () { short j; struct S0 k = { 0, 1, 1 }; e = k; j = k.f1 >> d; if (j & 232907L) { for (; k.f0 < 1; k.f0++) e.f2 = 0; k = g; } else e.f2 = 0; for (; k.f0; k.f0++) { e = k; h = 0; c = b || a || 1 >> a ? 0 : b << 1; f.f2 = c | 1; } } int main () { fn1 (); printf ("%d\n", e.f2); return 0; }
Created attachment 11726 [details] bugpoint reduced test case opt bugpoint-tooptimize.bc -simplifycfg > bugpoint-tooptimize.out.bc clang bugpoint-tooptimize.bc bugpoint-tonotoptimize.bc ./a.out 0 clang bugpoint-tooptimize.out.bc bugpoint-tonotoptimize.bc ./a.out 0 llc bugpoint-tooptimize.out.bc clang bugpoint-tooptimize.out.s bugpoint-tonotoptimize.bc ./a.out 1 (thus, this appears to be a backend bug)
Posted patch+test: http://lists.cs.uiuc.edu/pipermail/llvm-commits/Week-of-Mon-20140113/201555.html
Finally fixed in r200202.