diff options
| author | Jakub Beránek <berykubik@gmail.com> | 2025-07-14 11:04:55 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-07-14 11:04:55 +0200 |
| commit | 70301da7c7ea0678b72cd25ed869b023547e15cb (patch) | |
| tree | 687facca58027662daa931aaf3caf0966d1c82a6 /compiler/rustc_codegen_gcc/tools/check_intrinsics_duplicates.py | |
| parent | a7ad680269cc250d87f584ce84c40f7f90dc7159 (diff) | |
| parent | f041962694875c0f0a33f8a5e27fd00597042169 (diff) | |
| download | rust-70301da7c7ea0678b72cd25ed869b023547e15cb.tar.gz rust-70301da7c7ea0678b72cd25ed869b023547e15cb.zip | |
Rollup merge of #143881 - orlp:once-state-repr, r=tgross35
Use zero for initialized Once state
By re-labeling which integer represents which internal state for `Once` we can ensure that the initialized state is the all-zero state. This is beneficial because some CPU architectures (such as Arm) have specialized instructions to specifically branch on non-zero, and checking for the initialized state is by far the most important operation.
As an example, take this:
```rust
use std::sync::atomic::{AtomicU32, Ordering};
const INIT: u32 = 3;
#[inline(never)]
#[cold]
pub fn slow(state: &AtomicU32) {
state.store(INIT, Ordering::Release);
}
pub fn ensure_init(state: &AtomicU32) {
if state.load(Ordering::Acquire) != INIT {
slow(state)
}
}
```
If `INIT` is 3 (as is currently the state for `Once`), we see the following assembly on `aarch64-apple-darwin`:
```asm
example::ensure_init::h332061368366e313:
ldapr w8, [x0]
cmp w8, #3
b.ne LBB1_2
ret
LBB1_2:
b example::slow::ha042bd6a4f33724e
```
By changing the `INIT` state to zero we get the following:
```asm
example::ensure_init::h332061368366e313:
ldapr w8, [x0]
cbnz w8, LBB1_2
ret
LBB1_2:
b example::slow::ha042bd6a4f33724e
```
So this PR saves 1 instruction every time a `LazyLock` gets accessed on platforms such as these.
Diffstat (limited to 'compiler/rustc_codegen_gcc/tools/check_intrinsics_duplicates.py')
0 files changed, 0 insertions, 0 deletions
