lkml.org 
[lkml]   [2019]   [Jun]   [26]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    From
    SubjectRe: [PATCH] perf/x86/intel: Mark expected switch fall-throughs
    On Wed, Jun 26, 2019 at 11:24:32AM +0200, Peter Zijlstra wrote:
    > That is, would something like this:
    >
    > diff --git a/arch/x86/include/asm/jump_label.h b/arch/x86/include/asm/jump_label.h
    > index 06c3cc22a058..1761b1e76ddc 100644
    > --- a/arch/x86/include/asm/jump_label.h
    > +++ b/arch/x86/include/asm/jump_label.h
    > @@ -32,7 +32,7 @@ static __always_inline bool arch_static_branch(struct static_key *key, bool bran
    > : : "i" (key), "i" (branch) : : l_yes);
    >
    > return false;
    > -l_yes:
    > +l_yes: __attribute__((cold));
    > return true;
    > }
    >
    > @@ -49,7 +49,7 @@ static __always_inline bool arch_static_branch_jump(struct static_key *key, bool
    > : : "i" (key), "i" (branch) : : l_yes);
    >
    > return false;
    > -l_yes:
    > +l_yes: __attribute__((hot));
    > return true;
    > }
    >
    > Help LLVM?

    No, that's broken. What we do is the likely() and unlikely() hints in
    static_branch_{,un}likely():

    #define static_branch_likely(x) \
    ({ \
    bool branch; \
    if (__builtin_types_compatible_p(typeof(*x), struct static_key_true)) \
    branch = !arch_static_branch(&(x)->key, true); \
    else if (__builtin_types_compatible_p(typeof(*x), struct static_key_false)) \
    branch = !arch_static_branch_jump(&(x)->key, true); \
    else \
    branch = ____wrong_branch_error(); \
    likely(branch); \
    })

    #define static_branch_unlikely(x) \
    ({ \
    bool branch; \
    if (__builtin_types_compatible_p(typeof(*x), struct static_key_true)) \
    branch = arch_static_branch_jump(&(x)->key, false); \
    else if (__builtin_types_compatible_p(typeof(*x), struct static_key_false)) \
    branch = arch_static_branch(&(x)->key, false); \
    else \
    branch = ____wrong_branch_error(); \
    unlikely(branch); \
    })

    That should convey out-of-line vs in-line 'hint'. And clearly that's
    broken for LLVM.

    \
     
     \ /
      Last update: 2019-06-26 12:44    [W:5.136 / U:0.024 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site