Fix bad cast morphing (dotnet/coreclr#13429)
authormikedn <onemihaid@hotmail.com>
Mon, 28 Aug 2017 17:59:02 +0000 (20:59 +0300)
committerSergey Andreenko <seandree@microsoft.com>
Mon, 28 Aug 2017 17:59:02 +0000 (10:59 -0700)
commitdac0d63817b02f9e9fd6e9344750b4a1b851dd7b
tree3f9bfbf03aa6dcd6a491f824b2927ea9661db3cc
parent2f283460d26c9a5cb943d44b4dd9f0e0db11abc5
Fix bad cast morphing (dotnet/coreclr#13429)

fgMorphCast thinks that casting a i1 value to i2 via conv.ovf.i2.un is a widening conversion and removes the overflow check. But this is in fact a narrowing conversion because i1 is implicitly sign extended to i4 and then i4 is treated as u4. Going from i4 to u4 overflows for negative values so we can't treat the source type of the cast as i1, it has to be u4.

Of course, the existing code works fine if the source type is unsigned. Going from u1 to i4 and then to u4 never overflows so it's safe to treat the source type as u1.

Commit migrated from https://github.com/dotnet/coreclr/commit/68e7669cf9cc6ad64fa0393339dbebafd03612e9
src/coreclr/src/jit/morph.cpp
src/coreclr/tests/src/JIT/Regression/JitBlue/GitHub_13404/GitHub_13404.il [new file with mode: 0644]
src/coreclr/tests/src/JIT/Regression/JitBlue/GitHub_13404/GitHub_13404.ilproj [new file with mode: 0644]