-
Notifications
You must be signed in to change notification settings - Fork 114
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
race: Relax success ordering from AcqRel
to Release
.
#278
base: master
Are you sure you want to change the base?
Conversation
|
RelAcq
to Release
.AcqRel
to Release
.
32c2734
to
b527b4a
Compare
AcqRel
to Release
.AcqRel
to Release
.
b527b4a
to
2f82871
Compare
LGTM, especially with the same change in Rust! Could your remove the comments though, and instead add the (great) explanation of "there's nothing to synchronize with for And, as usual, could you bump a version in Cargo.toml&add a changelog entry? ^^ |
059d0c1
to
a245e8d
Compare
I think it's too important to hide in the git log, especially when people go to change the code later. Instead, I added a non-doc comment under the doc comment, and removed the other comments I added.
done. |
…ease`. See the analogous change in rust-lang/rust#131746 and the discussion in matklad#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, 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 ```
a245e8d
to
2a707ee
Compare
See the analogous change in
rust-lang/rust#131746 and the discussion in
#220.
What is the effect of this change? Not much, because before we ever execute the
compare_exchange
, we do a load withOrdering::Acquire
; thecompare_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:
On x86_64, there is no change. Here is the generated code before and after:
On AArch64, regardless of whether atomics are outlined or not, there is no change. Here
is the generated code with inlined atomics:
For 32-bit ARMv7, with inlined atomics, the resulting diff in the object code is: