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.
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)
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:
There is a discussion here: https://github.com/rust-lang/rust/issues/26179
The RFC was accepted but the intrinsics are not stabilized, I think mainly because:
if let
ormatch
statements.Workarounds:
std::intrinsics::likely
andstd::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 pressureunreachable!()
andunreachable_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'sassume
)