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

            Bug ID: 89139
           Summary: GCC emits code for static functions that aren't used
                    by the optimized code
           Product: gcc
           Version: unknown
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: tree-optimization
          Assignee: unassigned at gcc dot gnu.org
          Reporter: m...@nieper-wisskirchen.de
  Target Milestone: ---

Consider the following C module.

**
typedef struct cont
{
    void (*f) (struct cont, int a);
} Cont;

int quux (int a);

static void g (Cont c, Cont d, int a)
{
    if (quux (a))
      return g (c, d, a + 1);
    c.f (d, a * 2); // XXX
}

void bar (struct cont, int a);

static void h (Cont d, int a)
{
    if (d.f != bar)
      d.f (d, a);
}

void foo (int a)
{
    g ((Cont) { h }, (Cont) { bar }, a);
}
**

I compiled the code with the x86-64 gcc (trunk) version on https://godbolt.org
and I get:

**
h:
        cmpq    $bar, %rdi
        je      .L1
        jmp     *%rdi
.L1:
        ret
foo:
        pushq   %rbx
        movl    %edi, %ebx
        jmp     .L6
.L8:
        addl    $1, %ebx
.L6:
        movl    %ebx, %edi
        call    quux
        testl   %eax, %eax
        jne     .L8
        popq    %rbx
        ret
**

As one can see, code for the function `h' is emitted but nowhere used.

Interestingly, when I replace `a * 2' in the line marked with XXX by `a', gcc
does not emit code for `h':

**
foo:
        pushq   %rbx
        movl    %edi, %ebx
        jmp     .L3
.L6:
        addl    $1, %ebx
.L3:
        movl    %ebx, %edi
        call    quux
        testl   %eax, %eax
        jne     .L6
        popq    %rbx
        ret
**

Reply via email to