optimization/6806: gcc 3.0.4 ignoring clobbered registers in inline asm with -O1 or higher on i386
michaelni@gmx.at
michaelni@gmx.at
Fri May 24 18:26:00 GMT 2002
>Number: 6806
>Category: optimization
>Synopsis: gcc 3.0.4 ignoring clobbered registers in inline asm with -O1 or higher on i386
>Confidential: no
>Severity: serious
>Priority: medium
>Responsible: unassigned
>State: open
>Class: wrong-code
>Submitter-Id: net
>Arrival-Date: Fri May 24 18:26:01 PDT 2002
>Closed-Date:
>Last-Modified:
>Originator: Michael Niedermayer
>Release: gcc version 3.0.4
>Organization:
>Environment:
Linux MichaelsNB 2.4.18custom1 #1 Mit Mai 15 23:14:08 CEST 2002 i686 unknown
output from gcc -v:
Reading specs from /usr/lib/gcc-lib/i386-linux/3.0.4/specs
Configured with: ../src/configure -v --enable-languages=c,c++,java,f77,proto,objc --prefix=/usr --infodir=/share/info --mandir=/share/man --enable-shared --with-gnu-as --with-gnu-ld --with-system-zlib --enable-long-long --enable-nls --without-included-gettext --disable-checking --enable-threads=posix --enable-java-gc=boehm --with-cpp-install-dir=bin --enable-objc-gc i386-linux
Thread model: posix
gcc version 3.0.4
>Description:
volatile int f=64;
...
"addl %6, %0 \n\t"
:"+r" (out)
:"r" (a), "r" (b), "r" (c), "g" (d), "g" (e), "g"(f)
: "%eax", "%esi"
gcc puts f into eax even though eax is on the clobberlist
>How-To-Repeat:
compile the attached file with gcc -O1 and run it
>Fix:
a possible workaround is to force specific registers instead of using "r"(...)
>Release-Note:
>Audit-Trail:
>Unformatted:
----gnatsweb-attachment----
Content-Type: text/plain; name="gcc-test.i"
Content-Disposition: inline; filename="gcc-test.i"
# 1 "gcc-test.c"
volatile int out=1;
volatile int a=2;
volatile int b=4;
volatile int c=8;
volatile int d=16;
volatile int e=32;
volatile int f=64;
int main(){
int err=0;
asm volatile(
"xorl %%eax, %%eax \n\t"
"xorl %%esi, %%esi \n\t"
"addl %1, %0 \n\t"
"addl %2, %0 \n\t"
"addl %3, %0 \n\t"
"addl %4, %0 \n\t"
"addl %5, %0 \n\t"
"addl %6, %0 \n\t"
:"+r" (out)
:"r" (a), "r" (b), "r" (c), "g" (d), "g" (e), "g"(f)
: "%eax", "%esi"
);
if(out==127){
printf("test1: ok\n");
}else{
printf("test1: fail %d\n", 127-out);
err++;
}
return err;
}
More information about the Gcc-bugs
mailing list