Commit bb00466
committed
race: Relax
[cherry-pick once_cell 2a707eedb459369687ffdb2183ee82fabaa5d97a]
See the analogous change in
rust-lang/rust#131746 and the discussion in
matklad/once_cell#220.
What is the effect of this change? Not much, because before we ever
execute the `compare_exchange`, we do a load with `Ordering::Acquire`;
the `compare_exchange` is in the `#[cold]` path already. Thus, this just mostly
clarifies our expectations. See the non-doc comment added under the module's doc
comment for the reasoning.
How does this change the code gen? Consider this analogous example:
```diff
#[no_mangle]
fn foo1(y: &mut i32) -> bool {
- let r = X.compare_exchange(0, 1, Ordering::AcqRel, Ordering::Acquire).is_ok();
+ let r = X.compare_exchange(0, 1, Ordering::Release, Ordering::Acquire).is_ok();
r
}
```
On x86_64, there is no change. Here is the generated code before and after:
```
foo1:
mov rcx, qword ptr [rip + example::X::h9e1b81da80078af7@GOTPCREL]
mov edx, 1
xor eax, eax
lock cmpxchg dword ptr [rcx], edx
sete al
ret
example::X::h9e1b81da80078af7:
.zero 4
```
On AArch64, regardless of whether atomics are outlined or not, there is no change. Here
is the generated code with inlined atomics:
```
foo1:
adrp x8, :got:example::X::h40b04fb69d714de3
ldr x8, [x8, :got_lo12:example::X::h40b04fb69d714de3]
.LBB0_1:
ldaxr w9, [x8]
cbnz w9, .LBB0_4
mov w0, #1
stlxr w9, w0, [x8]
cbnz w9, .LBB0_1
ret
.LBB0_4:
mov w0, wzr
clrex
ret
example::X::h40b04fb69d714de3:
.zero 4
```
For 32-bit ARMv7, with inlined atomics, the resulting diff in the object code is:
```diff
@@ -10,14 +10,13 @@
mov r0, #1
strex r2, r0, [r1]
cmp r2, #0
- beq .LBB0_5
+ bxeq lr
ldrex r0, [r1]
cmp r0, #0
beq .LBB0_2
.LBB0_4:
- mov r0, #0
clrex
-.LBB0_5:
+ mov r0, #0
dmb ish
bx lr
.LCPI0_0:
@@ -54,4 +53,3 @@
example::X::h47e2038445e1c648:
.zero 4
```compare_exchange success ordering from AcqRel to Release.1 parent eda1128 commit bb00466
1 file changed
Lines changed: 9 additions & 1 deletion
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
19 | 19 | | |
20 | 20 | | |
21 | 21 | | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
22 | 30 | | |
23 | 31 | | |
24 | 32 | | |
| |||
102 | 110 | | |
103 | 111 | | |
104 | 112 | | |
105 | | - | |
| 113 | + | |
106 | 114 | | |
107 | 115 | | |
108 | 116 | | |
| |||
0 commit comments