[Bug c++/41103] New: g++-4.3/4.4 generates wrong code on x86_64
tim at klingt dot org
gcc-bugzilla@gcc.gnu.org
Tue Aug 18 11:30:00 GMT 2009
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
More information about the Gcc-bugs
mailing list