Fix value numbering of field assignments (#61113)
authorSingleAccretion <62474226+SingleAccretion@users.noreply.github.com>
Mon, 8 Nov 2021 16:08:09 +0000 (19:08 +0300)
committerGitHub <noreply@github.com>
Mon, 8 Nov 2021 16:08:09 +0000 (17:08 +0100)
commit39ece73bd08b1bcea0b9447cf34690bb1b41ba0a
tree7e250f8ed020aa27c7975d08241efab92dff63e3
parentff361bd6f46e640feca9c8b1d0173639ccc28689
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.
src/coreclr/jit/valuenum.cpp
src/coreclr/jit/valuenum.h