[release/9.0] Fix optimization of Vector512 AndMask + NotMask to AndNotMask #108803
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Backport of #108775 to release/9.0
/cc @BruceForstall
Customer Impact
Found by fuzz testing. The bug causes either bad code generation or JIT crash in a specific case of optimizing Vector512 "and" and "not" on masks to the combined "AndNotMask" on AVX-512 machines.
For example:
(user code:) Vector512.AndNot(Vector512.Equals(v1, v2), Vector512.Equals(v3, v4))
=> (internally) AndMask(m1, NotMask(m2))
=> (internally) AndNotMask(m2, m1)
This internal transformation fails with this bug.
Regression
I believe this is not a regression, but represents a test hole.
Testing
Reduced fuzzing test used to verify. Created a small test based on this to verify, and add to the regression tests as part of this change.
Risk
Low. Very simple, isolated fix.