New user self-registration is disabled due to spam. For an account please email bugs-admin@lists.llvm.org with your e-mail address and full name.

Bug 22613 - wrong code at -O2 and -O3 on x86_64-linux-gnu
Summary: wrong code at -O2 and -O3 on x86_64-linux-gnu
Status: RESOLVED FIXED
Alias: None
Product: clang
Classification: Unclassified
Component: -New Bugs (show other bugs)
Version: trunk
Hardware: PC All
: P normal
Assignee: Unassigned Clang Bugs
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2015-02-16 22:17 PST by Zhendong Su
Modified: 2015-02-17 13:10 PST (History)
4 users (show)

See Also:
Fixed By Commit(s):


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Zhendong Su 2015-02-16 22:17:32 PST
The current clang trunk miscompiles the following code at -O2 and -O3 on x86_64-linux-gnu in both 32-bit and 64-bit modes.

This is a regression from 3.5.0. 


$ clang-trunk -v
clang version 3.7.0 (trunk 229360)
Target: x86_64-unknown-linux-gnu
Thread model: posix
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.2
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.2
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.5.0 -O2 small.c; ./a.out
$ 
$ clang-trunk -O2 small.c
$ ./a.out
Aborted (core dumped)
$ 


-------------------------------


int a, b, c, d, e;
char f[1][3];

void
fn1 ()
{
  for (d = 0; d < 2; d++)
    {
      f[b][d] = 0;
      for (e = 0; e < 3; e++)
	{
	  if (c)
	    a--;
	  f[0][e] = 1;
	}
    }
}

int
main ()
{
  fn1 ();

  if (f[0][1] != 1)
    __builtin_abort ();

  return 0;
}
Comment 1 David Majnemer 2015-02-17 02:33:48 PST
Reverting r224247 seems to fix it:
Date:   Mon Dec 15 14:09:53 2014 +0000

    Sink store based on alias analysis
     - by Ella Bolshinsky
    The alias analysis is used define whether the given instruction
    is a barrier for store sinking. For 2 identical stores, following
    instructions are checked in the both basic blocks, to determine
    whether they are sinking barriers.
    
    http://reviews.llvm.org/D6420
Comment 2 Elena Demikhovsky 2015-02-17 07:12:52 PST
I fixed the bug in 229495.