-
Notifications
You must be signed in to change notification settings - Fork 10
Open
Labels
Needs ChampionWe need someone who can help drive this forward.We need someone who can help drive this forward.
Description
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
ormatch
statements.
Workarounds:
- Compiler intrinsics
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
)- Profile-guided optimization
elichai, spacejam, mrkeuz, tgross35 and dullbananas
Metadata
Metadata
Assignees
Labels
Needs ChampionWe need someone who can help drive this forward.We need someone who can help drive this forward.