Bug#714840: [gcc-4.7] gcc generates wrong code for global register variables
Package: gcc-4.7
Version: 4.7.2-5
Severity: normal
--- Please enter the report below this line. ---
When I compile and run the small program below using
gcc -O2 -o test test.c
./test
I get the (correct) output
1
When I compile and run the small program below using
gcc -DFAIL -O2 -o test test.c
./test
I get the (wrong) output
2
The define "-DFAIL" only adds an empty asm statement which shouldn't make any
difference (see below).
***************************************************************
#include <stdio.h>
unsigned long reg;
register unsigned long *env asm ("rbp");
register unsigned long T0 asm ("rbx");
register unsigned long T1 asm ("r12");
void
cmpxchgl(void)
{
unsigned long dst;
dst = *env - T0;
if ((unsigned) dst == 0) {
T0 = (T0 & ~0xffffffff) | (T1 & 0xffffffff);
} else {
*env = (*env & ~0xffffffff) | (T0 & 0xffffffff);
}
#ifdef FAIL
asm volatile ("");
#endif
}
int
main(void)
{
env = ®
*env = 0;
T0 = 1;
T1 = 2;
cmpxchgl();
printf("%lx\n", T0);
return 0;
}
***************************************************************
--- System information. ---
Architecture: amd64
Kernel: Linux 3.2.0-4-amd64
Debian Release: 7.1
500 stable-updates ftp.de.debian.org
500 stable security.debian.org
500 stable ftp.de.debian.org
--- Package information. ---
Depends (Version) | Installed
===============================-+-===============
gcc-4.7-base (= 4.7.2-5) | 4.7.2-5
cpp-4.7 (= 4.7.2-5) | 4.7.2-5
binutils (>= 2.21.1) | 2.22-8
libgcc1 (>= 1:4.7.2-5) | 1:4.7.2-5
libgomp1 (>= 4.7.2-5) | 4.7.2-5
libitm1 (>= 4.7.2-5) | 4.7.2-5
libquadmath0 (>= 4.7.2-5) | 4.7.2-5
libc6 (>= 2.11) | 2.13-38
libgmp10 | 2:5.0.5+dfsg-2
libmpc2 | 0.9-4
libmpfr4 (>= 3.1.0) | 3.1.0-5
zlib1g (>= 1:1.1.4) | 1:1.2.7.dfsg-13
Recommends (Version) | Installed
==========================-+-============
libc6-dev (>= 2.13-5) | 2.13-38
Suggests (Version) | Installed
======================================-+-===============
gcc-4.7-multilib | 4.7.2-5
libmudflap0-4.7-dev (>= 4.7.2-5) |
gcc-4.7-doc (>= 4.7.2) | 4.7.2-2
gcc-4.7-locales (>= 4.7.2) |
libgcc1-dbg |
libgomp1-dbg |
libitm1-dbg |
libquadmath0-dbg |
libmudflap0-dbg |
libcloog-ppl0 (>= 0.15.9-2~) |
libppl-c2 |
libppl7 |
binutils-gold (>= 2.21.1) |
Reply to: