Using today's IRA branch (r136683), on the attached file.

> gcc -O3 -fno-pic -fomit-frame-pointer -m64 -S cabac-ret.i -fira
_get_cabac:
LFB2:
        pushq   %rbx
LCFI0:
        movl    (%rdi), %eax
        movl    4(%rdi), %r8d
# 16 "cabac-ret.i" 1
        #%ebx %r8d %ax 24(%rdi) %rsi
# 0 "" 2
        movl    %eax, (%rdi)
        movl    %r8d, 4(%rdi)
        movl    %ebx, %eax
        popq    %rbx
        andl    $1, %eax
        ret

with an unnecessary mov %ebx, %eax. Without -fira:
        movl    (%rdi), %r8d
        movl    4(%rdi), %r9d
# 16 "cabac-ret.i" 1
        #%eax %r9d %r8w 24(%rdi) %rsi
# 0 "" 2
        movl    %r8d, (%rdi)
        movl    %r9d, 4(%rdi)
        andl    $1, %eax
        ret

Both allocators don't allocate bit to eax in 32-bit mode, though all other
compilers with inline asm support I tried did. gcc 3.3 does, as well, but no
other version seemed to.

In this case it's not a problem, since changing the class to "=&a" fixes it,
but the function will be inlined a lot and I don't want to put unnecessary
constraints on it.


-- 
           Summary: [4.4 regression] IRA doesn't allocate asm output being
                    returned to eax
           Product: gcc
           Version: 4.4.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: target
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: astrange at ithinksw dot com
GCC target triplet: x86_64-*-*


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

Reply via email to