[NFC][SLP][AMDGPU] Precommit a cross-block fmul fadd contraction test (#226609)
Two contract fmuls feed contract fadds in different successors. AMDGPU
sinks such an fmul into the block of its user and fuses the pair, so the
scalar form is one fma per path. Record the current behaviour, the pair
is kept scalar when the fmul is operand 0 of the fadd and paired when it
is operand 1.
games/bsdgames: Update 0.76 => 0.77
This release fixes segmentation faults after reloading a save game.
While here:
- Drop backported patches since they are in now upstream.
- Regenerate tetris patch with `make makepatch` (stage-qa).
Commit log:
https://github.com/pianojockl/bsdgames/compare/v0.76...v0.77
PR: 281947
Approved by: osa, vvd (Mentors, implicit)
MFH: 2026Q3
(cherry picked from commit 4b2ff5266c239dfe67c43f78df7838dd99da22cb)
games/bsdgames: Update 0.76 => 0.77
This release fixes segmentation faults after reloading a save game.
While here:
- Drop backported patches since they are in now upstream.
- Regenerate tetris patch with `make makepatch` (stage-qa).
Commit log:
https://github.com/pianojockl/bsdgames/compare/v0.76...v0.77
PR: 281947
Approved by: osa, vvd (Mentors, implicit)
MFH: 2026Q3
[SSAF] Close unsafe-buffer reachability over override families
An unsafe pointer reaching one override's parameter is equally unsafe in every
sibling and base override of that method, because the call site picks the
target dynamically. Without closing over the families, reachability depended
on which override the extractor happened to see the flow through, so a fix
suggested for the base could be contradicted by a derived override.
- Mirroring is level-preserving: families relate slot entities, so a reachable
EPL propagates only to the same pointer level on its family members.
- Mirroring happens inside the pointer-flow search, so flows out of a mirrored
EPL are followed too.
- Type-constrained slots are never mirrored onto, so C3 still holds.
§4 of rdar://179151603
Assisted-By: claude
[SSAF] Serialize virtual method summaries and families
Per-TU summaries and whole-program results cross process boundaries, and the
JSON layer refuses to write a summary kind it has no format for. Register both
sides so --ssaf-extract-summaries=VirtualMethod becomes usable and the family
result survives a round trip.
Deserialization tolerates a missing override list, since a root virtual method
legitimately has none.
§3 of rdar://179151603
[SSAF] Drop the unused OwnerMethodId from method families
The only consumer, the unsafe-buffer reachability closure, needs just the family
a slot belongs to.
- Recording the owning method cost a map per analysis and a field per slot for
nothing.
- With only the family left, the per-slot `Data` collapses into a plain
slot-to-family map.
Assisted-By: claude
[SSAF] Drop the dead MethodFamilyUnionFind::seed overloads
Nothing calls either overload; they are scaffolding left over from the
prototype this analysis was extracted from.
- `Roots` is populated entirely by the lazy self-rooting in `find()`,
reached via `unionSets()`.
- `seed(E, Owner)` ignored `Owner` altogether. The parameter only existed
because `seed(Owner, S)` was copy-pasted from
`Owners::recordOwner(Owner, S)`, which does need it.
- Where the prototype did call `seed`, it ran immediately above
`unionSets()` over the same entities, so it was a no-op there too.
Also document that a virtual method with no override relation contributes
no entries, so the omission reads as deliberate rather than as a gap.
Assisted-By: claude
[SSAF] Group virtual method slots into override families
A virtual call site can dispatch to any override, so the parameter and return
slots that occupy the same vtable slot across an override chain are
indistinguishable to a caller. Whole-program consumers therefore have to treat
them as one unit or they will reason about a slot that a call never actually
reaches.
Compute those units up front, keyed per slot, so consumers only need a map
lookup rather than their own traversal of the override relation. Overloads
occupy distinct vtable slots and stay in distinct families.
The family representative is the smallest EntityId in the class, which keeps
the result stable across runs.
§2 of rdar://179151603
[SSAF] Extract the virtual method override relation per TU (#213316)
A virtual call may dispatch to any override of its callee, so a whole-program
analysis cannot reason about a method's parameters and return value in
isolation. It needs to know which method overrides which, and which slots
that relates. Collect this per TU, so a later pass can join the related
slots into families.
JSON serialization lands separately, so the summary is not writable via
`--ssaf-extract-summaries` yet.
§1 of rdar://179151603
Assisted-By: claude