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

--- Comment #3 from Rafael Avila de Espindola <rafael at espindo dot la> ---
(In reply to Jakub Jelinek from comment #2)
> I must say I don't understand your suggestion.  bar is not a pointer and its
> address is non-NULL no matter whether it has been already initialized or not.
> What kind of assembly you'd like to see for f?

Bar is not a pointer, but a guard variable for bar can be. It is initially null
and is set to bar's address once bar is initialized.

I think the assembly for f could be:

_Z1fv:
        movq    %fs:__guard_for_bar@tpoff, %rax                                 
        testq   %rax, %rax
        je      .L15
        ret
.L15:
        pushq   %rbx
        movq    %fs:0, %rbx
        leaq    _ZL3bar@tpoff(%rbx), %rdi
        call    _ZN3fooC1Ev
        leaq    _ZL3bar@tpoff(%rbx), %rax
        movq    %rax, %fs:__guard_for_bar@tpoff
        popq    %rbx
        ret

The .L15 label could even be moved to a cold section.

Reply via email to