https://gcc.gnu.org/bugzilla/show_bug.cgi?id=78098
--- Comment #14 from H.J. Lu <hjl.tools at gmail dot com> ---
(In reply to Martin Liška from comment #13)
> (In reply to H.J. Lu from comment #12)
> > (In reply to Martin Liška from comment #10)
> > > (In reply to H.J. Lu from comment #9)
> > > > (In reply to Richard Biener from comment #6)
> > > > > Why would we be not able to tailcall in an interupt handler?
> > > >
> > > > We need to verify that the only instruction in an interrupt handler
> > > > is a tail call to another interrupt handler. On the other hand,
> > > > this interrupt handler isn't really needed at all.
> > >
> > > That can be vefief by fact that the symbol should have only one call (tail
> > > call) and set node->icf_merged == true.
> >
> > Another issue with ICF tail call:
> >
> > ;; Function foo1 (foo1, funcdef_no=3, decl_uid=1443, cgraph_uid=0,
> > symbol_order=0)
> >
> > foo1 (void * p)
> > {
> > ;; basic block 2, loop depth 0
> > ;; pred: ENTRY
> > foo2 (p_2(D)); [tail call]
> > ^^^^^^^^^^^^^^^^^^^^^^^^^^^ This isn't the same as sibcall.
> > return;
> > ^^^^^^ Here is a return statement.
> > ;; succ: EXIT
> >
> > }
>
> If I remember correctly, this is gimple representation of the tail-call. If
> you look at the generated binary, you'll see really just the jump
> instruction:
>
> foo2:
> .LFB1:
> .cfi_startproc
> movl $4276093056, %eax
> movl $0, (%rax)
> ret
> .cfi_endproc
> .LFE1:
> .size foo2, .-foo2
> .p2align 4,,15
> .globl foo1
> .type foo1, @function
> foo1:
> .LFB3:
> .cfi_startproc
> jmp foo2
> .cfi_endproc
Not with interrupt handler which needs different epilogue and prologue.