[Bug rtl-optimization/21202] New: Extra register moves generated

vda at port dot imtp dot ilyichevsk dot odessa dot ua gcc-bugzilla@gcc.gnu.org
Mon Apr 25 07:32:00 GMT 2005


See below: two register->register moves which
are not needed.

# cat byteorder.c
typedef unsigned long long u64;
typedef unsigned u32;

static inline u64 swab64(u64 val) {
        union {
                struct { u32 a,b; } s;
                u64 u;
        } v;
        v.u = val;
        asm("bswapl %0 ; bswapl %1"
            : "=r" (v.s.b), "=r" (v.s.a)
            : "0" (v.s.a), "1" (v.s.b));
        return v.u;
}

extern u64 w;
void f() {
    w = swab64(w);
}
# gcc -O3 byteorder.c -S
# cat byteorder.s
        .file   "byteorder.c"
        .text
        .p2align 2,,3
.globl f
        .type   f, @function
f:
        pushl   %ebp
        movl    %esp, %ebp
        pushl   %esi
        pushl   %ebx
        movl    w, %esi
        movl    w+4, %edx
        movl    %esi, %ebx
        movl    %edx, %esi
#APP
        bswapl %ebx ; bswapl %esi
#NO_APP
        movl    %ebx, w+4
        popl    %ebx
        movl    %esi, w
        popl    %esi
        leave
        ret
        .size   f, .-f
        .section        .note.GNU-stack,"",@progbits
        .ident  "GCC: (GNU) 3.4.3"
# gcc -O3 byteorder.c -S; cat byteorder.s; gcc -v
        .file   "byteorder.c"
        .text
        .p2align 2,,3
.globl f
        .type   f, @function
f:
        pushl   %ebp
        movl    %esp, %ebp
        pushl   %esi
        pushl   %ebx
        movl    w, %eax
        movl    w+4, %edx
        movl    %eax, %ebx
        movl    %edx, %esi
#APP
        bswapl %ebx ; bswapl %esi
#NO_APP
        movl    %esi, w
        movl    %ebx, w+4
        popl    %ebx
        popl    %esi
        leave
        ret
        .size   f, .-f
        .ident  "GCC: (GNU) 4.0.0"
        .section        .note.GNU-stack,"",@progbits
Using built-in specs.
Target: i386-pc-linux-gnu
Configured with: ../gcc-4.0.0.src/configure --prefix=/usr/app/gcc-4.0.0
--exec-prefix=/usr/app/gcc-4.0.0 --bindir=/usr/bin --sbindir=/usr/sbin
--libexecdir=/usr/app/gcc-4.0.0/libexec --datadir=/usr/app/gcc-4.0.0/share
--sysconfdir=/etc --sharedstatedir=/usr/app/gcc-4.0.0/var/com
--localstatedir=/usr/app/gcc-4.0.0/var --libdir=/usr/lib
--includedir=/usr/include --infodir=/usr/info --mandir=/usr/man
--with-slibdir=/usr/app/gcc-4.0.0/lib --with-local-prefix=/usr/local
--with-gxx-include-dir=/usr/app/gcc-4.0.0/include/g++-v3
--enable-languages=c,c++ --with-system-zlib --disable-nls --enable-threads=posix
i386-pc-linux-gnu
Thread model: posix
gcc version 4.0.0

-- 
           Summary: Extra register moves generated
           Product: gcc
           Version: 4.0.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P2
         Component: rtl-optimization
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: vda at port dot imtp dot ilyichevsk dot odessa dot ua
                CC: gcc-bugs at gcc dot gnu dot org
 GCC build triplet: i386-pc-linux-gnu
  GCC host triplet: i386-pc-linux-gnu
GCC target triplet: i386-pc-linux-gnu


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=21202



More information about the Gcc-bugs mailing list