public inbox for gcc-bugs@sourceware.org help / color / mirror / Atom feed
* [Bug c/40693] New: atomic built-ins malfunction with 64-bit and optimization @ 2009-07-08 23:10 m dot rosellini at f5 dot com 2009-07-09 0:10 ` [Bug c/40693] " m dot rosellini at f5 dot com ` (3 more replies) 0 siblings, 4 replies; 5+ messages in thread From: m dot rosellini at f5 dot com @ 2009-07-08 23:10 UTC (permalink / raw) To: gcc-bugs #include <stdint.h> #include <stdio.h> int main(int ac, char *av[]) { int64_t x; int64_t like_a_constant = -1; int64_t unlike_a_constant = -1; if (ac == 0) unlike_a_constant = 5; x = 0; __sync_add_and_fetch(&x, like_a_constant); printf("%016llx\n", x); x = 0; __sync_add_and_fetch(&x, unlike_a_constant); printf("%016llx\n", x); } Expected result: ffffffffffffffff ffffffffffffffff Actual result: 00000000ffffffff ffffffffffffffff -- Summary: atomic built-ins malfunction with 64-bit and optimization Product: gcc Version: 4.1.2 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: m dot rosellini at f5 dot com http://gcc.gnu.org/bugzilla/show_bug.cgi?id=40693 ^ permalink raw reply [flat|nested] 5+ messages in thread
* [Bug c/40693] atomic built-ins malfunction with 64-bit and optimization 2009-07-08 23:10 [Bug c/40693] New: atomic built-ins malfunction with 64-bit and optimization m dot rosellini at f5 dot com @ 2009-07-09 0:10 ` m dot rosellini at f5 dot com 2009-07-09 5:54 ` [Bug target/40693] atomic built-ins malfunction with 64-bit signed ptrs and negative constants jakub at gcc dot gnu dot org ` (2 subsequent siblings) 3 siblings, 0 replies; 5+ messages in thread From: m dot rosellini at f5 dot com @ 2009-07-09 0:10 UTC (permalink / raw) To: gcc-bugs ------- Comment #1 from m dot rosellini at f5 dot com 2009-07-09 00:10 ------- I forgot to add: You need to compile this with -O2 and -march=pentium. The way that negative constants are handled in the code emitted for __sync_blah_and_blah is incorrect when the pointer type is 64-bits and the platform is 32-bit x86. That's the real issue. Calling __sync_blah_and_blah(ptr, -1) is sufficient (where ptr is a pointer to a 64-bit signed type). Then you do not need to turn on optimization. This doesn't really have anything to do with optimization... it's just that there is a strange interplay with optimization whereby the function has the bad behavior exhibited with constants even when it doesn't look like one is passing a constant (such as when calling this through an inline function). -- m dot rosellini at f5 dot com changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |m dot rosellini at f5 dot | |com http://gcc.gnu.org/bugzilla/show_bug.cgi?id=40693 ^ permalink raw reply [flat|nested] 5+ messages in thread
* [Bug target/40693] atomic built-ins malfunction with 64-bit signed ptrs and negative constants 2009-07-08 23:10 [Bug c/40693] New: atomic built-ins malfunction with 64-bit and optimization m dot rosellini at f5 dot com 2009-07-09 0:10 ` [Bug c/40693] " m dot rosellini at f5 dot com @ 2009-07-09 5:54 ` jakub at gcc dot gnu dot org 2009-07-09 20:29 ` m dot rosellini at f5 dot com 2009-10-14 4:00 ` pinskia at gcc dot gnu dot org 3 siblings, 0 replies; 5+ messages in thread From: jakub at gcc dot gnu dot org @ 2009-07-09 5:54 UTC (permalink / raw) To: gcc-bugs ------- Comment #2 from jakub at gcc dot gnu dot org 2009-07-09 05:54 ------- Can't reproduce. -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=40693 ^ permalink raw reply [flat|nested] 5+ messages in thread
* [Bug target/40693] atomic built-ins malfunction with 64-bit signed ptrs and negative constants 2009-07-08 23:10 [Bug c/40693] New: atomic built-ins malfunction with 64-bit and optimization m dot rosellini at f5 dot com 2009-07-09 0:10 ` [Bug c/40693] " m dot rosellini at f5 dot com 2009-07-09 5:54 ` [Bug target/40693] atomic built-ins malfunction with 64-bit signed ptrs and negative constants jakub at gcc dot gnu dot org @ 2009-07-09 20:29 ` m dot rosellini at f5 dot com 2009-10-14 4:00 ` pinskia at gcc dot gnu dot org 3 siblings, 0 replies; 5+ messages in thread From: m dot rosellini at f5 dot com @ 2009-07-09 20:29 UTC (permalink / raw) To: gcc-bugs ------- Comment #3 from m dot rosellini at f5 dot com 2009-07-09 20:29 ------- OK, maybe some assembly will make the issue clearer. Or perhaps you just want to close this bug if you're not fixing bugs in the 4.1 compiler. I verified that the problem does occur with 4.1 and that it does not occur with 4.2. The relevant built-ins seem not to exist in 4.0. Below is the output from a 4.1 compiler and a 4.2 compiler. I have annotated the relevant instructions with "<<<". In the first example, from a 4.1 compiler, you can see that there is a constant of "0" passed to adcl (which is incorrect), whereas in the second example, from a 4.2 compiler, there is a constant of "-1" passed to adcl (which is correct). seapddev(catalan) ~/ 503$ cat t.c int main(int ac, char **av) { volatile long long x; __sync_fetch_and_add(&x, -1); return x; } seapddev(catalan) ~/ 504$ gcc --version gcc (GCC) 4.1.2 20080704 (Red Hat 4.1.2-44) Copyright (C) 2006 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. seapddev(catalan) ~/ 505$ gcc -march=pentium t.c seapddev(catalan) ~/ 506$ cat t.s .file "t.c" .text .globl main .type main, @function main: leal 4(%esp), %ecx andl $-16, %esp pushl -4(%ecx) pushl %ebp movl %esp, %ebp pushl %edi pushl %esi pushl %ebx pushl %ecx subl $40, %esp leal -24(%ebp), %eax movl %eax, -36(%ebp) movl -36(%ebp), %edx movl (%edx), %eax movl 4(%edx), %edx movl %eax, -48(%ebp) movl %edx, -44(%ebp) .L2: movl -48(%ebp), %eax movl -44(%ebp), %edx movl %eax, -56(%ebp) movl %edx, -52(%ebp) movl -56(%ebp), %ecx movl -52(%ebp), %ebx addl $-1, %ecx adcl $0, %ebx <<< movl %ecx, %esi movl %ebx, %ecx movl -36(%ebp), %edi movl -56(%ebp), %eax movl -52(%ebp), %edx movl %esi, %ebx lock cmpxchg8b (%edi) movl %eax, -48(%ebp) movl %edx, -44(%ebp) jne .L2 movl -24(%ebp), %eax movl -20(%ebp), %edx addl $40, %esp popl %ecx popl %ebx popl %esi popl %edi popl %ebp leal -4(%ecx), %esp ret .size main, .-main .ident "GCC: (GNU) 4.1.2 20080704 (Red Hat 4.1.2-44)" .section .note.GNU-stack,"",@progbits seapddev(catalan) ~/ 507$ wayward ~/ 537$ cat t.c int main(int ac, char **av) { volatile long long x; __sync_fetch_and_add(&x, -1); return x; } wayward ~/ 538$ gcc-4.2 --version i686-apple-darwin9-gcc-4.2.1 (GCC) 4.2.1 (Apple Inc. build 5574) Copyright (C) 2007 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. wayward ~/ 539$ rm t.s rm: t.s: No such file or directory wayward ~/ 540$ gcc-4.2 -march=pentium -S t.c wayward ~/ 541$ cat t.s .text .globl _main _main: pushl %ebp movl %esp, %ebp pushl %edi pushl %esi subl $64, %esp leal -16(%ebp), %eax movl %eax, -28(%ebp) movl -28(%ebp), %edi movl (%edi), %esi movl 4(%edi), %edi movl %esi, -40(%ebp) movl %edi, -36(%ebp) L2: movl -40(%ebp), %eax movl -36(%ebp), %edx movl %eax, -64(%ebp) movl %edx, -60(%ebp) movl -64(%ebp), %esi movl -60(%ebp), %edi addl $-1, %esi adcl $-1, %edi <<< movl %esi, -44(%ebp) movl %edi, %ecx movl -28(%ebp), %esi movl -64(%ebp), %eax movl -60(%ebp), %edx movl -44(%ebp), %edi xchgl %ebx, %edi lock cmpxchg8b (%esi) xchgl %ebx, %edi movl %eax, -40(%ebp) movl %edx, -36(%ebp) jne L2 movl -16(%ebp), %eax movl -12(%ebp), %edx addl $64, %esp popl %esi popl %edi popl %ebp ret .subsections_via_symbols wayward ~/ 542$ -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=40693 ^ permalink raw reply [flat|nested] 5+ messages in thread
* [Bug target/40693] atomic built-ins malfunction with 64-bit signed ptrs and negative constants 2009-07-08 23:10 [Bug c/40693] New: atomic built-ins malfunction with 64-bit and optimization m dot rosellini at f5 dot com ` (2 preceding siblings ...) 2009-07-09 20:29 ` m dot rosellini at f5 dot com @ 2009-10-14 4:00 ` pinskia at gcc dot gnu dot org 3 siblings, 0 replies; 5+ messages in thread From: pinskia at gcc dot gnu dot org @ 2009-10-14 4:00 UTC (permalink / raw) To: gcc-bugs ------- Comment #4 from pinskia at gcc dot gnu dot org 2009-10-14 04:00 ------- Fixed in 4.2.0 so closing. -- pinskia at gcc dot gnu dot org changed: What |Removed |Added ---------------------------------------------------------------------------- Status|UNCONFIRMED |RESOLVED Resolution| |FIXED Target Milestone|--- |4.2.0 http://gcc.gnu.org/bugzilla/show_bug.cgi?id=40693 ^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2009-10-14 4:00 UTC | newest] Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2009-07-08 23:10 [Bug c/40693] New: atomic built-ins malfunction with 64-bit and optimization m dot rosellini at f5 dot com 2009-07-09 0:10 ` [Bug c/40693] " m dot rosellini at f5 dot com 2009-07-09 5:54 ` [Bug target/40693] atomic built-ins malfunction with 64-bit signed ptrs and negative constants jakub at gcc dot gnu dot org 2009-07-09 20:29 ` m dot rosellini at f5 dot com 2009-10-14 4:00 ` pinskia at gcc dot gnu dot org
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).