Skip to content
New issue

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

wrong code on x86_64-linux-gnu (affecting trunk and 3.3) #18476

Closed
zhendongsu opened this issue Nov 30, 2013 · 5 comments
Closed

wrong code on x86_64-linux-gnu (affecting trunk and 3.3) #18476

zhendongsu opened this issue Nov 30, 2013 · 5 comments
Labels
backend:X86 bugzilla Issues migrated from bugzilla

Comments

@zhendongsu
Copy link

Bugzilla Link 18102
Resolution FIXED
Resolved on Nov 02, 2015 09:17
Version trunk
OS All
CC @hfinkel,@kaomoneus

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;
}

@zhendongsu
Copy link
Author

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;
}

@hfinkel
Copy link
Collaborator

hfinkel commented Dec 13, 2013

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)

@kaomoneus
Copy link
Contributor

@kaomoneus
Copy link
Contributor

Finally fixed in r200202.

@jyknight
Copy link
Member

mentioned in issue llvm/llvm-bugzilla-archive#25154

@llvmbot llvmbot transferred this issue from llvm/llvm-bugzilla-archive Dec 9, 2021
This issue was closed.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
backend:X86 bugzilla Issues migrated from bugzilla
Projects
None yet
Development

No branches or pull requests

4 participants