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