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 at -O2 and -O3 on x86_64-linux-gnu #26630

Closed
zhendongsu opened this issue Jan 22, 2016 · 3 comments
Closed

wrong code at -O2 and -O3 on x86_64-linux-gnu #26630

zhendongsu opened this issue Jan 22, 2016 · 3 comments
Assignees
Labels
bugzilla Issues migrated from bugzilla clang Clang issues not falling into any other category

Comments

@zhendongsu
Copy link

Bugzilla Link 26256
Resolution FIXED
Resolved on Jan 25, 2016 16:10
Version trunk
OS All
CC @ahmedbougacha,@majnemer,@hfinkel,@MatzeB,@sanjoy

Extended Description

The following code is miscompiled by the current clang trunk (and 3.7.x) on x86_64-linux-gnu at -O2 and -O3 in both 32-bit and 64-bit modes.

This is a regression from 3.6.x.

$ clang-trunk -v
clang version 3.9.0 (trunk 258416)
Target: x86_64-unknown-linux-gnu
Thread model: posix
InstalledDir: /usr/local/tools/bin
Found candidate GCC installation: /usr/lib/gcc/i686-linux-gnu/4.9
Found candidate GCC installation: /usr/lib/gcc/i686-linux-gnu/4.9.3
Found candidate GCC installation: /usr/lib/gcc/i686-linux-gnu/5.2.1
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.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.4
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/4.7
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/4.7.3
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/4.8
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/4.8.4
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/4.9
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/4.9.3
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/5.2.1
Selected GCC installation: /usr/lib/gcc/x86_64-linux-gnu/4.9
Candidate multilib: .;@m64
Candidate multilib: 32;@m32
Candidate multilib: x32;@MX32
Selected multilib: .;@m64
$
$ clang-trunk -Os small.c; ./a.out
$ clang-3.6 -O2 small.c; ./a.out
$
$ clang-trunk -O2 small.c
$ ./a.out
0
$ clang-3.7 -O2 small.c
$ ./a.out
0
$


int printf (const char *, ...);

int a = 8, b, d, e, f;
short c;

void
fn1 ()
{
char g = c, h = c = c | 195;
if (d)
;
if ((!a && c > d) || c < d)
for (g = 0; g < 20; g++)
e ^= f;
a = 2 & g;
if (h >= c || g)
printf ("%d\n", b);
if (a)
{
fn1 ();
for (;;)
;
}
}

int
main ()
{
fn1 ();
return 0;
}

@zhendongsu
Copy link
Author

assigned to @MatzeB

@majnemer
Copy link
Mannequin

majnemer mannequin commented Jan 25, 2016

Bisection points to r231507:
Author: Matthias Braun matze@braunis.de
Date: Fri Mar 6 19:49:10 2015 +0000

DAGCombiner: Canonicalize select(and/or,x,y) depending on target.

This is based on the following equivalences:
select(C0 & C1, X, Y) <=> select(C0, select(C1, X, Y), Y)
select(C0 | C1, X, Y) <=> select(C0, X, select(C1, X, Y))

Many target cannot perform and/or on the CPU flags and therefore the
right side should be choosen to avoid materializign the i1 flags in an
integer register. If the target can perform this operation efficiently
we normalize to the left form.

Matthias, can you please take a look?

@MatzeB
Copy link
Contributor

MatzeB commented Jan 26, 2016

The problem turned out to be unrelated to my commit. Fixed in r258729. +Ahmed who may be interested in a post-commit review (maybe there's a more elegant way to fix it).

@llvmbot llvmbot transferred this issue from llvm/llvm-bugzilla-archive Dec 10, 2021
This issue was closed.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bugzilla Issues migrated from bugzilla clang Clang issues not falling into any other category
Projects
None yet
Development

No branches or pull requests

2 participants