[Bug target/56165] New: Missed optimization for 'noreturn' functions

akobets at mail dot ru gcc-bugzilla@gcc.gnu.org
Thu Jan 31 17:21:00 GMT 2013


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

             Bug #: 56165
           Summary: Missed optimization for 'noreturn' functions
    Classification: Unclassified
           Product: gcc
           Version: 4.7.2
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: target
        AssignedTo: unassigned@gcc.gnu.org
        ReportedBy: akobets@mail.ru
            Target: x86_64-linux-gnu


Created attachment 29318
  --> http://gcc.gnu.org/bugzilla/attachment.cgi?id=29318
Example source code

1) Functions with __attribute__((noreturn)) contain unnecessary
push rbx
or
sub rsp,8
instructions in prologue.

2) Tail call need replace to jmp.

Source code (there is 4 highlighted lines with !!!):

===Intrpt64.cpp===
struct _BiosConsole
{
    virtual void  __attribute__((stdcall)) PrintHexDWord(long n);
};

void __attribute__((noreturn)) Intrpt_All(long* thr, long IntNum)
{
    _BiosConsole BiosCons;

    BiosCons.PrintHexDWord((long)thr);
    asm volatile("mov rsp, %0;"
        : : "r" (thr));
    for(;;){}
}

void __attribute__((noreturn)) Intrpt_0()
{
    register long* thr;
    asm volatile("mov %0,rsp" : "=g" (thr));
    Intrpt_All(thr, 0);
}
===END===

Compile:
x86_64-linux-gnu-gcc -c -Wall -Wno-attributes -save-temps -fverbose-asm
-masm=intel -march=core2 -mcmodel=large -mno-mmx -mno-sse -O1 -fno-rtti
-fno-default-inline -fomit-frame-pointer -falign-functions=16
-foptimize-sibling-calls -ffreestanding -fno-stack-protector --no-exceptions
Intrpt64.cpp

Generated Assembly code:

===Intrpt64.s===
    .text
    .p2align 4,,15
    .globl    _Z10Intrpt_AllPll
    .type    _Z10Intrpt_AllPll, @function
_Z10Intrpt_AllPll:
.LFB0:
    .cfi_startproc
    push    rbx    # TRASH !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    .cfi_def_cfa_offset 16
    .cfi_offset 3, -16
    sub    rsp, 16    #,
    .cfi_def_cfa_offset 32
    mov    rbx, rdi    # thr, thr
    movabs    rax, OFFSET FLAT:_ZTV12_BiosConsole+16    #,
    mov    QWORD PTR [rsp+8], rax    # BiosCons._vptr._BiosConsole,
    mov    rsi, rdi    #, thr
    lea    rdi, [rsp+8]    #,
    movabs    rax, OFFSET FLAT:_ZN12_BiosConsole13PrintHexDWordEl    # tmp64,
    call    rax    # JMP !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
#APP
# 14 "Intrpt64.cpp" 1
    mov rsp, rbx;    # thr
# 0 "" 2
#NO_APP
.L2:
    jmp    .L2    #
    .cfi_endproc
.LFE0:
    .size    _Z10Intrpt_AllPll, .-_Z10Intrpt_AllPll
    .p2align 4,,15
    .globl    _Z8Intrpt_0v
    .type    _Z8Intrpt_0v, @function
_Z8Intrpt_0v:
.LFB4:
    .cfi_startproc
    sub    rsp, 8    # TRASH !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    .cfi_def_cfa_offset 16
#APP
# 21 "Intrpt64.cpp" 1
    mov rdi,rsp    # thr
# 0 "" 2
#NO_APP
    mov    esi, 0    #,
    movabs    rax, OFFSET FLAT:_Z10Intrpt_AllPll    # tmp61,
    call    rax    # JMP !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    .cfi_endproc
.LFE4:
    .size    _Z8Intrpt_0v, .-_Z8Intrpt_0v
    .ident    "GCC: (GNU) 4.7.2"
    .section    .note.GNU-stack,"",@progbits
===END===



More information about the Gcc-bugs mailing list