Permit (Release, Acquire) ordering for compare_exchange[_weak] and add appropriate compiler intrinsic#74583
Permit (Release, Acquire) ordering for compare_exchange[_weak] and add appropriate compiler intrinsic#74583oliver-giersch wants to merge 1 commit intorust-lang:masterfrom oliver-giersch:cmpxchg_rel_acq
Conversation
|
r? @cramertj (rust_highfive has picked a reviewer for you, use r? to override) |
compare_exchange[_weak] and add appropriate compiler intrinsic|
Thanks for working on this. The produced assembly doesn't respect acquire ordering on the failure (https://bugs.llvm.org/show_bug.cgi?id=33332, #68464). |
Thanks for bringing up these issues, I wasn't aware at all and it hadn't come in the course of my research. I am also not proficient enough in reading ARM assembly to have spotted the miscompilation myself. |
|
☔ The latest upstream changes (presumably #73265) made this pull request unmergeable. Please resolve the merge conflicts. |
|
@oliver-giersch we do not support merge commits in the rust repository. Would recommend rolling it back and doing a rebase instead. |
…re) ordering for CAS
|
Would it be a sensible compromise to leave the intrinsics in place but disallow using the |
|
☔ The latest upstream changes (presumably #75797) made this pull request unmergeable. Please resolve the merge conflicts. |
|
@oliver-giersch any updates on this? (also if you can, do resolve the conflicts) |
|
@Dylan-DPC I would prefer if I could get some feedback on the matter in principle before resolving further conflicts, specifically:
|
What would be the goal of adding the intrinsics if they aren't to be used? |
|
@cramertj my idea was to enable their use at a later point if and when LLVM fixes its codegen, which I assume has to happen at some point, given that C++20 relaxes some ordering restrictions. |
|
Triage: There's still merge conflict. But it seems the author is also seeking for some discussions. @oliver-giersch Could you open a thread on Zulip or file a T-lang MCP for such a change? This pr should block on such an MCP before it could proceed. |
|
Ping from triage: |
This will probably require further discussion, but according to my research the current rule of disallowing (
Release,Acquire) as memory ordering for the atomiccompare_exchange[_weak]primitives is unnecessarily strict and not actually required by the memory model.Here is a link to a previous discussion on that topic and here a link to a question and answer I've posted to the llvm-dev mailing list (my follow-up was unfortunately not answered). According to that answer, LLVM currently does not consider
Acquireto be a stronger ordering thanRelease(source code) and apparently there are plans to drop the "relative strength" requirement altogether, since it is basically not really well-defined.Here is an example using
clangon ARM that shows different assembly is generated when (Release,Acquire) is used instead of the next best approximation (AcqRel,Acquire).