gcc 4.4.1 and 4.2.4 failed to generate the correct code under -O0; gcc 3.4.6 works fine.
---BEGIN code --- #include <stdio.h> int main( ) { int a, b; a = 1; b = 2; register int *pa = &a; register int *pb = &b; /* Swap a and b using pointers pa and pb */ *pa ^= *pb ^= *pa ^= *pb; printf( "%d %d\n", a, b ); return 0; } ---END code --- Symptom ---------------------------- The expected end result is a = 2 and b = 1, but the code generated by gcc 4.4.1 and 4.2.4 produces a = 0 and b = 1. The Incorrect Assembly code ---------------------------- The relevant portion of the assembly code produced by 'gcc -S -O0' is ---BEGIN code --- movl $1, -20(%rbp) movl $2, -24(%rbp) leaq -20(%rbp), %rbx .cfi_offset 3, -32 .cfi_offset 12, -24 leaq -24(%rbp), %r12 movl (%rbx), %edx movl (%r12), %ecx movl (%rbx), %esi movl (%r12), %eax xorl %esi, %eax movl %eax, (%rbx) movl (%rbx), %eax xorl %ecx, %eax movl %eax, (%r12) movl (%r12), %eax xorl %edx, %eax movl %eax, (%rbx) ---END code --- The last xorl code is incorrect; the correct one should be "xorl (%rbx) %eax". The problem with the incorrect code is that even though the value pointed to by %rbx (or pa in the C code) has been changed, the above xorl code is still using the old saved value of (%rbx), or *pa, instead of its most current value. Below is the options given when gcc was built ----------------------------------------------- Configured with: ../src/configure -v --with-pkgversion='Ubuntu 4.4.1-4ubuntu9' --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-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 -- Summary: gcc failed to generate correct code under -O0 Product: gcc Version: 4.4.1 Status: UNCONFIRMED Severity: critical Priority: P3 Component: c AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: jasonzou1983 at yahoo dot com GCC host triplet: x86_64-linux-gnu http://gcc.gnu.org/bugzilla/show_bug.cgi?id=43474