Skip to content
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

Optimize acquire-release operations in CFP #7264

Merged
merged 18 commits into from
Feb 4, 2025
Merged

Conversation

tlively
Copy link
Member

@tlively tlively commented Feb 1, 2025

We previously avoided optimizing acquire-release operations in
ConstantFieldPropagation to avoid having to replace them with
acquire-release fences, which are potentially more expensive than normal
acquire-release operations. However, in #7168 we reasoned that optimized
acquire gets of constant fields do not need to be replaced with fences
because they never necessarily synchronize with a set on another thread;
a get can be considered to read the same constant value from before the
set. Apply that reasoning to CFP and start optimizing acquire-release
operations without replacing them with fences.

Both passes use StructUtils::StructScanner to analyze struct operations.
Add support for RMW operations to this utility and update its users to
provide the new `noteRMW` hook. Test that GTO and TypeRefining
optimizations work as expected in the presence of RMW operations, but
leave a proper implementation in ConstantFieldPropagation to a later PR.

To allow TypeRefining to refine field types based only on the
"replacement" operand and not the "expected" operand of cmpxchg
operations, update validation to allow the "expected" field to be a
supertype of the accessed field type as long as it is still equality
comparable.
WebAssembly/shared-everything-threads#92
clarifies this intended typing in the upstream proposal.
RMW operations generally modify the field they access, so they inhibit
constant field propagation. The exceptions are xchg and cmpxchg
operations, which are like sets (conditional sets in the case of
cmpxchg) that happen to do gets as well. Just like for sets, we can
still optimize when the value written by xchg or cmpxchg happens to be
either the same constant value we know is already in the field or is a
copy from some instance of the same field.

There is potential for further optimization when we know an xchg or
cmpxchg sets a value that was read from some other field that we know
has the same constant value, but that's a missing optimization for plain
sets as well. There is also further optimization potential when we can
reason that a cmpxchg that would write a different value will never
perform the write because the comparison would never succeed. Add tests
with TODOs so we remember these potential optimizations in the future.
We previously avoided optimizing acquire-release operations in
ConstantFieldPropagation to avoid having to replace them with
acquire-release fences, which are potentially more expensive than normal
acquire-release operations. However, in #7168 we reasoned that optimized
acquire gets of constant fields do not need to be replaced with fences
because they never necessarily synchronize with a set on another thread;
a get can be considered to read the same constant value from before the
set. Apply that reasoning to CFP and start optimizing acquire-release
operations without replacing them with fences.
@tlively tlively requested a review from kripken February 1, 2025 06:56
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: )
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: )
(func $rmw-cmpxchg-acqrel (param (ref $A) i32) (result i32)
;; Making the accesses acqrel instead of seqcst means that the replacement
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Comment needs updating

;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: )
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: )
(func $rmw-cmpxchg-acqrel (param (ref $A) i32) (result i32)
;; Making the accesses acqrel instead of seqcst means that the replacement
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

here too

Base automatically changed from struct-rmw-cfp to main February 4, 2025 19:59
@tlively tlively requested a review from kripken February 4, 2025 20:25
@tlively tlively enabled auto-merge (squash) February 4, 2025 21:02
@tlively tlively merged commit b0a453c into main Feb 4, 2025
14 checks passed
@tlively tlively deleted the cfp-optimize-acqrel branch February 4, 2025 21:37
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants