-
Notifications
You must be signed in to change notification settings - Fork 5.2k
Forbid - byref cnst -> + (byref -cnst) transformation.
#44266
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 3 commits
546cc65
660dad6
db8b3ff
6318887
8d1d5d4
f81f6c9
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,55 @@ | ||
| // Licensed to the .NET Foundation under one or more agreements. | ||
| // The .NET Foundation licenses this file to you under the MIT license. | ||
|
|
||
| // This test shows an inlining of `byref LCL_VAR_ADDR - byref CNST_INT` method that returns a native int. | ||
| // However, Jit could try to optimize `-` as `+ -CNST_INT` that could lead to an incorrect `long + (-byref)`. | ||
|
|
||
| .assembly extern System.Console {} | ||
| .assembly extern legacy library mscorlib {} | ||
| .assembly byrefsubbyref1 { } | ||
| .class a extends [mscorlib]System.Object | ||
| { | ||
| .field static class ctest S_1 | ||
| .method public static native int byrefsubbyref(class ctest& V_1, class ctest& V_2) aggressiveinlining | ||
| { | ||
| ldarg 0 | ||
| ldarg 1 | ||
| sub | ||
| ret | ||
| } | ||
|
|
||
| .method public static int32 main() cil managed | ||
| { | ||
| .entrypoint | ||
| .maxstack 2 | ||
| .locals init (class ctest V_1, | ||
| class ctest V_2, | ||
| native int V_3) | ||
| newobj instance void ctest::.ctor() | ||
| stloc.0 | ||
| newobj instance void ctest::.ctor() | ||
| dup | ||
| stsfld class ctest a::S_1 | ||
| stloc.1 | ||
|
|
||
| ldloca V_1 | ||
| ldsflda class ctest a::S_1 | ||
| call native int a::byrefsubbyref(class ctest&, class ctest&) | ||
| stloc V_3 | ||
| ldloc V_3 | ||
| ret | ||
|
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Do you need conv.i4 before returning the value? Stack has If you need the method to return 100, you could allocate a 101 element array and subtract the managed reference between the first element and last element. The difference between a stack location and a static field that this is returning right now is a very random number.
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
You are right, I will fix the test to always return 100 instead of a random number. I am not an expert in ECMA so I am very glad that you are looking at the test, thank you. from ECMA, page 38:
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I believe that @sandreenko is correct that this implicit conversion is allowed. |
||
| } | ||
| } | ||
|
|
||
| .class private auto ansi ctest | ||
| extends [mscorlib]System.Object | ||
| { | ||
| .method public specialname rtspecialname | ||
| instance void .ctor() cil managed | ||
| { | ||
| .maxstack 1 | ||
| ldarg.0 | ||
| call instance void [mscorlib]System.Object::.ctor() | ||
| ret | ||
| } | ||
| } | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,12 @@ | ||
| <Project Sdk="Microsoft.NET.Sdk.IL"> | ||
| <PropertyGroup> | ||
| <OutputType>Exe</OutputType> | ||
| </PropertyGroup> | ||
| <PropertyGroup> | ||
| <DebugType /> | ||
| <Optimize>True</Optimize> | ||
| </PropertyGroup> | ||
| <ItemGroup> | ||
| <Compile Include="$(MSBuildProjectName).il" /> | ||
| </ItemGroup> | ||
| </Project> |

Uh oh!
There was an error while loading. Please reload this page.