You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
race: Reduce success ordering from AcqRel to Release.
See the analogous change in rust-lang/rust#131746 and
the discussion in matklad#220.
What is the effect of this change? Consider this 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, matklad#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, matklad#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
```
0 commit comments