public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
* [Bug c++/41103]  New: g++-4.3/4.4 generates wrong code on x86_64
@ 2009-08-18 11:30 tim at klingt dot org
  2009-08-18 11:35 ` [Bug c++/41103] " tim at klingt dot org
                   ` (4 more replies)
  0 siblings, 5 replies; 9+ messages in thread
From: tim at klingt dot org @ 2009-08-18 11:30 UTC (permalink / raw)
  To: gcc-bugs

g++-4.3 and 4.4 seem to generate wrong code, when optimizing. 4.2 produce
correct code for me

the bad code on 4.4 is:
00000000004449a0 <fifo_tester<boost::lockfree::caching_freelist_t>::get()>:
  4449a0:       41 57                   push   %r15
  4449a2:       48 8d 87 80 00 00 00    lea    0x80(%rdi),%rax
  4449a9:       48 8d 97 98 00 58 00    lea    0x580098(%rdi),%rdx
  4449b0:       48 8d 8f 90 00 00 00    lea    0x90(%rdi),%rcx
  4449b7:       41 56                   push   %r14
  4449b9:       41 55                   push   %r13
  4449bb:       4c 8d 6f 40             lea    0x40(%rdi),%r13
  4449bf:       41 54                   push   %r12
  4449c1:       55                      push   %rbp
  4449c2:       48 bd ff ff ff ff ff    mov    $0xffffffffffff,%rbp
  4449c9:       ff 00 00 
  4449cc:       49 89 ec                mov    %rbp,%r12
  4449cf:       53                      push   %rbx
  4449d0:       48 89 fb                mov    %rdi,%rbx
  4449d3:       48 81 ec c8 00 00 00    sub    $0xc8,%rsp
  4449da:       48 89 44 24 30          mov    %rax,0x30(%rsp)
  4449df:       48 8d 87 98 00 00 00    lea    0x98(%rdi),%rax
  4449e6:       48 89 54 24 18          mov    %rdx,0x18(%rsp)
  4449eb:       48 89 4c 24 20          mov    %rcx,0x20(%rsp)
  4449f0:       48 89 44 24 38          mov    %rax,0x38(%rsp)
  4449f5:       0f 1f 00                nopl   (%rax)
  4449f8:       48 8b 03                mov    (%rbx),%rax
  4449fb:       0f ae e8                lfence 
  4449fe:       48 8b 3b                mov    (%rbx),%rdi
  444a01:       48 89 c2                mov    %rax,%rdx
  444a04:       48 21 ea                and    %rbp,%rdx
  444a07:       48 89 ee                mov    %rbp,%rsi
  444a0a:       48 8b 4b 40             mov    0x40(%rbx),%rcx
  444a0e:       48 23 32                and    (%rdx),%rsi
  444a11:       48 39 c7                cmp    %rax,%rdi
  444a14:       0f 85 3c 03 00 00       jne    444d56
<fifo_tester<boost::lockfree::caching_freelist_t>::get()+0x3b6>
  444a1a:       48 89 cf                mov    %rcx,%rdi
  444a1d:       4c 21 e7                and    %r12,%rdi
  444a20:       48 39 fa                cmp    %rdi,%rdx
  444a23:       0f 84 27 02 00 00       je     444c50
<fifo_tester<boost::lockfree::caching_freelist_t>::get()+0x2b0>
  444a29:       48 89 c1                mov    %rax,%rcx
  444a2c:       44 8b 76 10             mov    0x10(%rsi),%r14d   <-- oops
  444a30:       48 89 74 24 50          mov    %rsi,0x50(%rsp)
  444a35:       48 c1 e9 30             shr    $0x30,%rcx
  444a39:       48 89 44 24 40          mov    %rax,0x40(%rsp)
  444a3e:       83 c1 01                add    $0x1,%ecx
  444a41:       66 89 4c 24 56          mov    %cx,0x56(%rsp)
  444a46:       48 8b 4c 24 50          mov    0x50(%rsp),%rcx
  444a4b:       f0 48 0f b1 0b          lock cmpxchg %rcx,(%rbx)

at position 444a2c it segfaults, because the register %rsi is 0

while the correct code of 4.2 is:
0000000000447380 <fifo_tester<boost::lockfree::caching_freelist_t>::get()>:
  447380:       41 57                   push   %r15
  447382:       48 8d 87 98 00 58 00    lea    0x580098(%rdi),%rax
  447389:       48 8d 97 90 00 00 00    lea    0x90(%rdi),%rdx
  447390:       41 56                   push   %r14
  447392:       41 55                   push   %r13
  447394:       4c 8d af 80 00 00 00    lea    0x80(%rdi),%r13
  44739b:       41 54                   push   %r12
  44739d:       4c 8d 67 40             lea    0x40(%rdi),%r12
  4473a1:       55                      push   %rbp
  4473a2:       48 89 fd                mov    %rdi,%rbp
  4473a5:       53                      push   %rbx
  4473a6:       48 bb ff ff ff ff ff    mov    $0xffffffffffff,%rbx
  4473ad:       ff 00 00 
  4473b0:       48 83 ec 28             sub    $0x28,%rsp
  4473b4:       48 89 44 24 10          mov    %rax,0x10(%rsp)
  4473b9:       48 8d 44 24 24          lea    0x24(%rsp),%rax
  4473be:       48 89 54 24 08          mov    %rdx,0x8(%rsp)
  4473c3:       48 89 04 24             mov    %rax,(%rsp)
  4473c7:       48 8b 55 00             mov    0x0(%rbp),%rdx
  4473cb:       0f ae e8                lfence 
  4473ce:       48 8b 75 40             mov    0x40(%rbp),%rsi
  4473d2:       48 89 d7                mov    %rdx,%rdi
  4473d5:       48 21 df                and    %rbx,%rdi
  4473d8:       48 8b 0f                mov    (%rdi),%rcx
  4473db:       48 21 d9                and    %rbx,%rcx
  4473de:       48 3b 55 00             cmp    0x0(%rbp),%rdx
  4473e2:       75 e3                   jne    4473c7
<fifo_tester<boost::lockfree::caching_freelist_t>::get()+0x47>
  4473e4:       48 89 f0                mov    %rsi,%rax
  4473e7:       48 21 d8                and    %rbx,%rax
  4473ea:       48 39 c7                cmp    %rax,%rdi
  4473ed:       0f 84 42 01 00 00       je     447535
<fifo_tester<boost::lockfree::caching_freelist_t>::get()+0x1b5>
  4473f3:       8b 41 10                mov    0x10(%rcx),%eax
  4473f6:       89 44 24 24             mov    %eax,0x24(%rsp)
  4473fa:       48 89 d0                mov    %rdx,%rax
  4473fd:       48 c1 e8 30             shr    $0x30,%rax
  447401:       83 c0 01                add    $0x1,%eax
  447404:       48 c1 e0 30             shl    $0x30,%rax
  447408:       48 09 c1                or     %rax,%rcx
  44740b:       48 89 d0                mov    %rdx,%rax
  44740e:       f0 48 0f b1 4d 00       lock cmpxchg %rcx,0x0(%rbp)
...

gcc-4.4
g++-4.4 -v
Using built-in specs.
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu
4.4.1-1ubuntu1~jaunty1' --with-bugurl=file:///usr/share/doc/gcc-4.4/README.Bugs
--enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr --enable-shared
--enable-multiarch --enable-linker-build-id --with-system-zlib
--libexecdir=/usr/lib --without-included-gettext --enable-threads=posix
--with-gxx-include-dir=/usr/include/c++/4.4 --program-suffix=-4.4 --enable-nls
--enable-clocale=gnu --enable-libstdcxx-debug --enable-mpfr --enable-objc-gc
--disable-werror --with-arch-32=i486 --with-tune=generic
--enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu
--target=x86_64-linux-gnu
Thread model: posix
gcc version 4.4.1 (Ubuntu 4.4.1-1ubuntu1~jaunty1) 

this also happens on gcc-4.3, where the corresponding code is:
0000000000441ed0 <fifo_tester<boost::lockfree::caching_freelist_t>::get()>:
  441ed0:       41 57                   push   %r15
  441ed2:       48 8d 87 80 00 00 00    lea    0x80(%rdi),%rax
  441ed9:       48 8d 97 98 00 58 00    lea    0x580098(%rdi),%rdx
  441ee0:       48 8d 8f 90 00 00 00    lea    0x90(%rdi),%rcx
  441ee7:       4c 8d 7f 40             lea    0x40(%rdi),%r15
  441eeb:       41 56                   push   %r14
  441eed:       41 55                   push   %r13
  441eef:       41 54                   push   %r12
  441ef1:       55                      push   %rbp
  441ef2:       48 89 fd                mov    %rdi,%rbp
  441ef5:       53                      push   %rbx
  441ef6:       48 bb ff ff ff ff ff    mov    $0xffffffffffff,%rbx
  441efd:       ff 00 00 
  441f00:       48 83 ec 38             sub    $0x38,%rsp
  441f04:       48 89 44 24 10          mov    %rax,0x10(%rsp)
  441f09:       48 89 54 24 08          mov    %rdx,0x8(%rsp)
  441f0e:       48 89 0c 24             mov    %rcx,(%rsp)
  441f12:       66 0f 1f 44 00 00       nopw   0x0(%rax,%rax,1)
  441f18:       48 8b 55 00             mov    0x0(%rbp),%rdx
  441f1c:       eb 05                   jmp    441f23
<fifo_tester<boost::lockfree::caching_freelist_t>::get()+0x53>
  441f1e:       66 90                   xchg   %ax,%ax
  441f20:       48 89 c2                mov    %rax,%rdx
  441f23:       0f ae e8                lfence 
  441f26:       48 8b 45 00             mov    0x0(%rbp),%rax
  441f2a:       48 89 d6                mov    %rdx,%rsi
  441f2d:       48 21 de                and    %rbx,%rsi
  441f30:       48 89 df                mov    %rbx,%rdi
  441f33:       48 8b 4d 40             mov    0x40(%rbp),%rcx
  441f37:       48 23 3e                and    (%rsi),%rdi
  441f3a:       48 39 d0                cmp    %rdx,%rax
  441f3d:       75 e1                   jne    441f20
<fifo_tester<boost::lockfree::caching_freelist_t>::get()+0x50>
  441f3f:       48 b8 ff ff ff ff ff    mov    $0xffffffffffff,%rax
  441f46:       ff 00 00 
  441f49:       48 21 c8                and    %rcx,%rax
  441f4c:       48 39 c6                cmp    %rax,%rsi
  441f4f:       0f 84 0b 02 00 00       je     442160
<fifo_tester<boost::lockfree::caching_freelist_t>::get()+0x290>
  441f55:       48 89 d0                mov    %rdx,%rax
  441f58:       44 8b 67 10             mov    0x10(%rdi),%r12d     <-- oops
  441f5c:       48 c1 e8 30             shr    $0x30,%rax
  441f60:       83 c0 01                add    $0x1,%eax
  441f63:       48 89 c1                mov    %rax,%rcx
  441f66:       48 89 d0                mov    %rdx,%rax
  441f69:       48 c1 e1 30             shl    $0x30,%rcx
  441f6d:       48 09 f9                or     %rdi,%rcx
  441f70:       f0 48 0f b1 4d 00       lock cmpxchg %rcx,0x0(%rbp)

Using built-in specs.
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu 4.3.3-5ubuntu4'
--with-bugurl=file:///usr/share/doc/gcc-4.3/README.Bugs
--enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr --enable-shared
--with-system-zlib --libexecdir=/usr/lib --without-included-gettext
--enable-threads=posix --enable-nls --with-gxx-include-dir=/usr/include/c++/4.3
--program-suffix=-4.3 --enable-clocale=gnu --enable-libstdcxx-debug
--enable-objc-gc --enable-mpfr --with-tune=generic --enable-checking=release
--build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
Thread model: posix
gcc version 4.3.3 (Ubuntu 4.3.3-5ubuntu4)


-- 
           Summary: g++-4.3/4.4 generates wrong code on x86_64
           Product: gcc
           Version: unknown
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: tim at klingt dot org


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=41103


^ permalink raw reply	[flat|nested] 9+ messages in thread

* [Bug c++/41103] g++-4.3/4.4 generates wrong code on x86_64
  2009-08-18 11:30 [Bug c++/41103] New: g++-4.3/4.4 generates wrong code on x86_64 tim at klingt dot org
@ 2009-08-18 11:35 ` tim at klingt dot org
  2009-08-18 11:37 ` tim at klingt dot org
                   ` (3 subsequent siblings)
  4 siblings, 0 replies; 9+ messages in thread
From: tim at klingt dot org @ 2009-08-18 11:35 UTC (permalink / raw)
  To: gcc-bugs



------- Comment #1 from tim at klingt dot org  2009-08-18 11:35 -------
Created an attachment (id=18395)
 --> (http://gcc.gnu.org/bugzilla/attachment.cgi?id=18395&action=view)
preprocessed source, 4.4


-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=41103


^ permalink raw reply	[flat|nested] 9+ messages in thread

* [Bug c++/41103] g++-4.3/4.4 generates wrong code on x86_64
  2009-08-18 11:30 [Bug c++/41103] New: g++-4.3/4.4 generates wrong code on x86_64 tim at klingt dot org
  2009-08-18 11:35 ` [Bug c++/41103] " tim at klingt dot org
@ 2009-08-18 11:37 ` tim at klingt dot org
  2009-08-18 11:50 ` tim at klingt dot org
                   ` (2 subsequent siblings)
  4 siblings, 0 replies; 9+ messages in thread
From: tim at klingt dot org @ 2009-08-18 11:37 UTC (permalink / raw)
  To: gcc-bugs



------- Comment #2 from tim at klingt dot org  2009-08-18 11:37 -------
Created an attachment (id=18396)
 --> (http://gcc.gnu.org/bugzilla/attachment.cgi?id=18396&action=view)
preprocessed source, 4.2


-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=41103


^ permalink raw reply	[flat|nested] 9+ messages in thread

* [Bug c++/41103] g++-4.3/4.4 generates wrong code on x86_64
  2009-08-18 11:30 [Bug c++/41103] New: g++-4.3/4.4 generates wrong code on x86_64 tim at klingt dot org
  2009-08-18 11:35 ` [Bug c++/41103] " tim at klingt dot org
  2009-08-18 11:37 ` tim at klingt dot org
@ 2009-08-18 11:50 ` tim at klingt dot org
  2009-08-18 14:25 ` rguenth at gcc dot gnu dot org
  2009-08-18 14:36 ` tim at klingt dot org
  4 siblings, 0 replies; 9+ messages in thread
From: tim at klingt dot org @ 2009-08-18 11:50 UTC (permalink / raw)
  To: gcc-bugs



------- Comment #3 from tim at klingt dot org  2009-08-18 11:50 -------
i forgot to mention, i am building with bjam, passing the following options:

COLLECT_GCC_OPTIONS='-ftemplate-depth-128' '-O3' '-finline-functions'
'-Wno-inline' '-Wall' '-pthread' '-fPIC' '-g' '-v' '-save-temps'
'-DBOOST_ALL_NO_LIB=1' '-DBOOST_THREAD_POSIX' '-DBOOST_THREAD_USE_DLL=1'
'-DNDEBUG' '-I../../..' '-c' '-o'
'../../../bin.v2/libs/lockfree/test/fifo_test.test/gcc-4.4.1/release/threading-multi/fifo_test.o'
'-shared-libgcc' '-mtune=generic'

when compiling in debug mode, the binary works fine:
COLLECT_GCC_OPTIONS='-ftemplate-depth-128' '-O0' '-fno-inline' '-Wall' '-g'
'-pthread' '-fPIC' '-g' '-v' '-save-temps' '-DBOOST_ALL_NO_LIB=1'
'-DBOOST_THREAD_POSIX' '-DBOOST_THREAD_USE_DLL=1' '-I../../..' '-c' '-o'
'../../../bin.v2/libs/lockfree/test/fifo_test.test/gcc-4.4.1/debug/threading-multi/fifo_test.o'
'-shared-libgcc' '-mtune=generic'


-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=41103


^ permalink raw reply	[flat|nested] 9+ messages in thread

* [Bug c++/41103] g++-4.3/4.4 generates wrong code on x86_64
  2009-08-18 11:30 [Bug c++/41103] New: g++-4.3/4.4 generates wrong code on x86_64 tim at klingt dot org
                   ` (2 preceding siblings ...)
  2009-08-18 11:50 ` tim at klingt dot org
@ 2009-08-18 14:25 ` rguenth at gcc dot gnu dot org
  2009-08-18 14:36 ` tim at klingt dot org
  4 siblings, 0 replies; 9+ messages in thread
From: rguenth at gcc dot gnu dot org @ 2009-08-18 14:25 UTC (permalink / raw)
  To: gcc-bugs



------- Comment #4 from rguenth at gcc dot gnu dot org  2009-08-18 14:24 -------
Does it work with -fno-strict-aliasing?  I suppose this is one case where boost
plays tricks with placement new on decls (non-anonymous storage)?


-- 

rguenth at gcc dot gnu dot org changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |rguenth at gcc dot gnu dot
                   |                            |org


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=41103


^ permalink raw reply	[flat|nested] 9+ messages in thread

* [Bug c++/41103] g++-4.3/4.4 generates wrong code on x86_64
  2009-08-18 11:30 [Bug c++/41103] New: g++-4.3/4.4 generates wrong code on x86_64 tim at klingt dot org
                   ` (3 preceding siblings ...)
  2009-08-18 14:25 ` rguenth at gcc dot gnu dot org
@ 2009-08-18 14:36 ` tim at klingt dot org
  4 siblings, 0 replies; 9+ messages in thread
From: tim at klingt dot org @ 2009-08-18 14:36 UTC (permalink / raw)
  To: gcc-bugs



------- Comment #5 from tim at klingt dot org  2009-08-18 14:36 -------
compiling with -fno-strict-aliasing doesn't do any difference.

the error is actually related to some code, that does a pointer/tag
compression, packing a pointer and an integer to a 64bit pointer [1] in order
to deal with the lack of cmpxchg16b instructions on early x86_64 cpus.

hth, tim

[1]
http://tim.klingt.org/git?p=boost_lockfree.git;a=blob;f=boost/lockfree/detail/tagged_ptr_ptrcompression.hpp


-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=41103


^ permalink raw reply	[flat|nested] 9+ messages in thread

* [Bug c++/41103] g++-4.3/4.4 generates wrong code on x86_64
       [not found] <bug-41103-4@http.gcc.gnu.org/bugzilla/>
  2011-10-19  0:17 ` paolo.carlini at oracle dot com
  2011-10-19  7:52 ` rguenth at gcc dot gnu.org
@ 2012-05-13 22:19 ` paolo.carlini at oracle dot com
  2 siblings, 0 replies; 9+ messages in thread
From: paolo.carlini at oracle dot com @ 2012-05-13 22:19 UTC (permalink / raw)
  To: gcc-bugs

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=41103

Paolo Carlini <paolo.carlini at oracle dot com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|WAITING                     |RESOLVED
         Resolution|                            |FIXED

--- Comment #8 from Paolo Carlini <paolo.carlini at oracle dot com> 2012-05-13 22:07:39 UTC ---
I guess we can close this.


^ permalink raw reply	[flat|nested] 9+ messages in thread

* [Bug c++/41103] g++-4.3/4.4 generates wrong code on x86_64
       [not found] <bug-41103-4@http.gcc.gnu.org/bugzilla/>
  2011-10-19  0:17 ` paolo.carlini at oracle dot com
@ 2011-10-19  7:52 ` rguenth at gcc dot gnu.org
  2012-05-13 22:19 ` paolo.carlini at oracle dot com
  2 siblings, 0 replies; 9+ messages in thread
From: rguenth at gcc dot gnu.org @ 2011-10-19  7:52 UTC (permalink / raw)
  To: gcc-bugs

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=41103

Richard Guenther <rguenth at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|UNCONFIRMED                 |WAITING
   Last reconfirmed|                            |2011-10-19
     Ever Confirmed|0                           |1

--- Comment #7 from Richard Guenther <rguenth at gcc dot gnu.org> 2011-10-19 07:51:48 UTC ---
Unlikely, it hasn't been properly analyzed and boost code is a mess.  There
are known issues with PTA and pointer-in-integer tricks.  Use GCC 4.6.1
which should have this fixed.

So, please try 4.5.3 and/or 4.6.1.


^ permalink raw reply	[flat|nested] 9+ messages in thread

* [Bug c++/41103] g++-4.3/4.4 generates wrong code on x86_64
       [not found] <bug-41103-4@http.gcc.gnu.org/bugzilla/>
@ 2011-10-19  0:17 ` paolo.carlini at oracle dot com
  2011-10-19  7:52 ` rguenth at gcc dot gnu.org
  2012-05-13 22:19 ` paolo.carlini at oracle dot com
  2 siblings, 0 replies; 9+ messages in thread
From: paolo.carlini at oracle dot com @ 2011-10-19  0:17 UTC (permalink / raw)
  To: gcc-bugs

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=41103

Paolo Carlini <paolo.carlini at oracle dot com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|gcc-bugs at gcc dot gnu.org |
      Known to fail|                            |

--- Comment #6 from Paolo Carlini <paolo.carlini at oracle dot com> 2011-10-19 00:16:49 UTC ---
Richard, do you think we could somehow resolve this? (doesn't seem a C++ issue)


^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2012-05-13 22:07 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2009-08-18 11:30 [Bug c++/41103] New: g++-4.3/4.4 generates wrong code on x86_64 tim at klingt dot org
2009-08-18 11:35 ` [Bug c++/41103] " tim at klingt dot org
2009-08-18 11:37 ` tim at klingt dot org
2009-08-18 11:50 ` tim at klingt dot org
2009-08-18 14:25 ` rguenth at gcc dot gnu dot org
2009-08-18 14:36 ` tim at klingt dot org
     [not found] <bug-41103-4@http.gcc.gnu.org/bugzilla/>
2011-10-19  0:17 ` paolo.carlini at oracle dot com
2011-10-19  7:52 ` rguenth at gcc dot gnu.org
2012-05-13 22:19 ` paolo.carlini at oracle dot com

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).