LLVM Bugzilla is read-only and represents the historical archive of all LLVM issues filled before November 26, 2021. Use github to submit LLVM bugs

Bug 18102 - wrong code on x86_64-linux-gnu (affecting trunk and 3.3)
Summary: wrong code on x86_64-linux-gnu (affecting trunk and 3.3)
Status: RESOLVED FIXED
Alias: None
Product: libraries
Classification: Unclassified
Component: Backend: X86 (show other bugs)
Version: trunk
Hardware: PC All
: P normal
Assignee: Unassigned LLVM Bugs
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2013-11-30 13:53 PST by Zhendong Su
Modified: 2015-11-02 09:17 PST (History)
4 users (show)

See Also:
Fixed By Commit(s):


Attachments
bugpoint reduced test case (4.73 KB, application/zip)
2013-12-12 19:52 PST, Hal Finkel
Details

Note You need to log in before you can comment on or make changes to this bug.
Description Zhendong Su 2013-11-30 13:53:40 PST
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;
}
Comment 1 Zhendong Su 2013-11-30 13:56:18 PST
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;
}
Comment 2 Hal Finkel 2013-12-12 19:52:57 PST
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)
Comment 3 Stepan Dyatkovskiy 2014-01-15 07:22:55 PST
Posted patch+test:
http://lists.cs.uiuc.edu/pipermail/llvm-commits/Week-of-Mon-20140113/201555.html
Comment 4 Stepan Dyatkovskiy 2014-02-03 12:39:48 PST
Finally fixed in r200202.