Skip to content

Branch prediction hints (i.e. Likely/Unlikely) #49

@aclysma

Description

@aclysma

In some performance sensitive code, hinting to the compiler that a certain path is likely or unlikely to be taken can be a helpful optimization:

  • Sometimes the unlikely path is extremely unlikely/unintended (for example, a fixed-size object pool being full, trying to normalize a 0-length vector). Sometimes, the path is completely unreachable.
  • Sometimes you may want to optimize for the unlikely path - for example a spin loop waiting for an event.

There is a discussion here: rust-lang/rust#26179

The RFC was accepted but the intrinsics are not stabilized, I think mainly because:

  • The LLVM team recommends (and clang uses) branch weights instead. (These intrinsics disable certain optimizations in LLVM, which might defeat the purpose of using them.)
  • This doesn't support hinting if let or match statements.

Workarounds:

  • Compiler intrinsics std::intrinsics::likely and std::intrinsics::unlikely are available in nightly, even though they could be harmful the way they work now
  • #[cold] will hint to llvm that a certain path is less likely to be called. This also prevents inlining which can reduce icache pressure
  • unreachable!() and unreachable_unchecked!() are worth considering for the unreachable case. It's not clear to me if unreachable!() does any optimization, but unreachable_unchecked does. (not sure, but probably via llvm's assume)
  • Profile-guided optimization

Metadata

Metadata

Assignees

No one assigned

    Labels

    Needs ChampionWe need someone who can help drive this forward.

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions