Surgical fix for bad assertion generation #55626
Merged
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.
Say we have a cast like this:
CAST(uint <- long)
.What value does this tree compute?
[int.MinValue..int.MaxValue]
- IR operates on signedTYP_INT
s.But assertion prop generated
[0..uint.MaxValue]
for it.The confusion created by this "how to interpret
TYP_UINT
" questioncaused a bug where for the assertion generated for the above cast,
in the form of
[0..uint.MaxValue]
, propagation could removea checked cast in the form of
CAST_OVF(uint < int)
.The proper fix is to generate proper ranges for such casts, it is in #55186 and waiting for .NET 7.
The surgical fix proposed here, for .NET 6, is to always treat casts to
TYP_UINT
as if they were to
TYP_INT
. This is conservative, but always correct.The generated assertion is useless of course, but that makes this a
zero-diff change (verified via replaying all
win-x64
&win-x86
collections).Fixes #54842
cc @kunalspathak