Fix value numbering of field assignments (#61113)
When value numbering an assignment to a field, VNApplySelectorsAssign
was called twice, first for the field sequence to find the exact
value, then for the heap VN update. This is not correct as the method
expects to be called only for sequences that will end up updating a
map with exact values, as it type checks the store with the helper
VNApplySelectorsAssignTypeCoerce. Usage of VNApplySelectorsAssign
to update the heap ended up meaning that any stores to struct fields
ended up with casts for maps, blocking traversal in VNForMapSelect.
A handful of positive diffs for this commit resulting from more CSEs
and redundant branch optimizations, due to more precise liberal VNs.