Skip to content

Surgical fix for bad assertion generation - #55626

Merged
kunalspathak merged 3 commits into
dotnet:mainfrom
SingleAccretion:Fix-Assertion-Prop-Surgical
Jul 15, 2021
Merged

Surgical fix for bad assertion generation#55626
kunalspathak merged 3 commits into
dotnet:mainfrom
SingleAccretion:Fix-Assertion-Prop-Surgical

Conversation

@SingleAccretion

@SingleAccretionSingleAccretion commented Jul 14, 2021

Copy link
Copy Markdown
Contributor

Say we have a cast like this: CAST(uint <- long).
What value does this tree compute?
[int.MinValue..int.MaxValue] - IR operates on signed TYP_INTs.
But assertion prop generated [0..uint.MaxValue] for it.

The confusion created by this "how to interpret TYP_UINT" question
caused a bug where for the assertion generated for the above cast,
in the form of [0..uint.MaxValue], propagation could remove
a 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

Say we have a cast like this: CAST(uint <- long).
What value does this tree compute?
[int.MinValue..int.MaxValue] - IR operates on signed TYP_INTs.
But assertion prop generated [0..uint.MaxValue] for it.
The confusion created by this "how to interpret TYP_UINT" question
caused a bug where for the assertion generated for the above cast,
in the form of [0..uint.MaxValue], propagation could remove
a checked cast in the form of CAST_OVF(uint < int).
The proper fix is to generate proper ranges for such casts.
The surgical fix proposed here 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.
@ghostghost added the area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI label Jul 14, 2021
Comment threadsrc/coreclr/jit/assertionprop.cpp

@kunalspathakkunalspathak left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@ghost

Copy link
Copy Markdown

Hello @kunalspathak!

Because this pull request has the auto-merge label, I will be glad to assist with helping to merge this pull request once all check-in policies pass.

p.s. you can customize the way I help with merging this pull request, such as holding this pull request until a specific person approves. Simply @mention me (@msftbot) and give me an instruction to get started! Learn more here.

@kunalspathak

Copy link
Copy Markdown
Contributor

Failures seems to be infra issues.

@kunalspathak
kunalspathak merged commit 5bcf2c6 into dotnet:mainJul 15, 2021
@SingleAccretion
SingleAccretion deleted the Fix-Assertion-Prop-Surgical branch July 16, 2021 08:21
@ghostghost locked as resolved and limited conversation to collaborators Aug 19, 2021
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-CodeGen-coreclrCLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Checked casts can be silently dropped by assertion prop

3 participants

@SingleAccretion@kunalspathak@jakobbotsch