[Bug c++/84824] New: DCE fails to remove dead code of std::function constructor

manjian2006 at gmail dot com gcc-bugzilla@gcc.gnu.org
Mon Mar 12 03:43:00 GMT 2018


https://gcc.gnu.org/bugzilla/show_bug.cgi?id=84824

            Bug ID: 84824
           Summary: DCE fails to remove dead code of std::function
                    constructor
           Product: gcc
           Version: 7.2.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: manjian2006 at gmail dot com
  Target Milestone: ---

#include <functional>
#include <stdio.h>

std::function<int(int, int)> getFunc(int i) {
  auto f = [=] (int a, int b) {
    return a + b + i;
  };
  return f;
}

int main() {
  printf("%d", getFunc(1)(1, 1));
  return 0;
}

In this example gcc generate code with redundant store operations and exception
handling block like:
main:
.LFB1411:
        .cfi_startproc
        .cfi_personality 0x9b,DW.ref.__gxx_personality_v0
        .cfi_lsda 0x1b,.LLSDA1411
        pushq   %rbx
        .cfi_def_cfa_offset 16
        .cfi_offset 3, -16
        leaq    .LC0(%rip), %rsi
        movl    $3, %edx
        movl    $1, %edi
        subq    $48, %rsp
        .cfi_def_cfa_offset 64
        movq    %fs:40, %rax
        movq    %rax, 40(%rsp)
        xorl    %eax, %eax
        leaq   
_ZNSt17_Function_handlerIFiiiEZ7getFunciEUliiE_E9_M_invokeERKSt9_Any_dataOiS6_(%rip),
%rax
        movl    $1, (%rsp)
        movq    %rax, 24(%rsp)
        leaq   
_ZNSt14_Function_base13_Base_managerIZ7getFunciEUliiE_E10_M_managerERSt9_Any_dataRKS3_St18_Manager_operation(%rip),
%rax
        movq    %rax, 16(%rsp)
        xorl    %eax, %eax
.LEHB0:
        call    __printf_chk@PLT
.LEHE0:
        movq    16(%rsp), %rax
        testq   %rax, %rax
        je      .L10
        movq    %rsp, %rdi
        movl    $3, %edx
        movq    %rdi, %rsi
        call    *%rax
.L10:
        xorl    %eax, %eax
        movq    40(%rsp), %rcx
        xorq    %fs:40, %rcx
        jne     .L23
        addq    $48, %rsp
        .cfi_remember_state
        .cfi_def_cfa_offset 16
        popq    %rbx
        .cfi_def_cfa_offset 8
        ret


But clang manage to remove these code
main:                                   # @main
        .cfi_startproc
# %bb.0:
        pushq   %rax
        .cfi_def_cfa_offset 16
        movl    $.L.str, %edi
        movl    $3, %esi
        xorl    %eax, %eax
        callq   printf
        xorl    %eax, %eax
        popq    %rcx
        retq


compiler flags are: -O2 -S

It seems gcc insist on construct std::function<int(int,int)> object on stack.


More information about the Gcc-bugs mailing list