We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
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; }
The text was updated successfully, but these errors were encountered:
Below is a variant that fails at -O1, -Os, and -O2 (but not -O3):
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; }
Sorry, something went wrong.
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.
mentioned in issue llvm/llvm-bugzilla-archive#25154
No branches or pull requests
Extended Description
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;
}
The text was updated successfully, but these errors were encountered: