Skip to content

Forbid - byref cnst -> + (byref -cnst) transformation. - #44266

Merged
sandreenko merged 6 commits into
dotnet:masterfrom
sandreenko:fixSubCnstGcRef
Nov 6, 2020
Merged

Forbid - byref cnst -> + (byref -cnst) transformation.#44266
sandreenko merged 6 commits into
dotnet:masterfrom
sandreenko:fixSubCnstGcRef

Conversation

@sandreenko

@sandreenkosandreenko commented Nov 5, 2020

Copy link
Copy Markdown
Contributor

This came up during #43386 work,
if we declare a method that subs 2 addresses and returns native int:

 .method public static native int byrefsubbyref(class ctest& V_1, class ctest& V_2) aggressiveinlining
{
ldarg 0
ldarg 1
sub
ret
}

and pass to it a local var addr (will be represented as long on x64) and a const byref:

 [000040] ------------ * SUB long [000037] ------------ +--* ADDR long // not sure why this is not a byref...
[000038] -------N---- | \--* LCL_VAR ref V00 loc0 [000039] H----------- \--* CNS_INT(h) byref 0x1f6a1802cb8 static Fseq[S_1]

and if morph transforms SUB to ADD with - on [000039] we will get:

N004 ( 6, 14) [000040] ------------ \--* ADD long $300
N002 ( 3, 3) [000037] ------------ +--* ADDR long $2c0
N001 ( 3, 2) [000038] ----G--N---- | \--* LCL_VAR ref (AX) V00 loc0 $280
N003 ( 2, 10) [000039] H----------- \--* CNS_INT(h) byref -0x1f6a1802cb8 static $142

then this tree will trigger an assert Make sure a GC address doesn't end up in 'rv2' when we try to create an addr mode from it.

The PR fixes it by forbidding SUB(A, CNST) -> ADD(A, -CNST) transformation for byrefs.

oldJit.NewTest.BeforeTheFix.txt
oldJit.NewTest.AfterTheFix.txt

@Dotnet-GitSync-BotDotnet-GitSync-Bot added the area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI label Nov 5, 2020
@sandreenko
sandreenko marked this pull request as ready for review November 5, 2020 00:45
@sandreenkosandreenko changed the title placeholder.Forbid - byref cnst -> + (byref -cnst) transformation.Nov 5, 2020
@sandreenko

Copy link
Copy Markdown
ContributorAuthor

PTAL @AndyAyersMS @dotnet/jit-contrib , I added a new IL test that fails with an assert during compilation and proposed a fix for it. Please check that IL test looks correct to you and if you see more potential issues like that with other transformations.

Comment threadsrc/coreclr/src/jit/morph.cpp Outdated
Co-authored-by: Andy Ayers <andya@microsoft.com>
Comment threadsrc/coreclr/src/jit/morph.cpp Outdated
call native int a::byrefsubbyref(class ctest&, class ctest&)
stloc V_3
ldloc V_3
ret

@MichalStrehovskyMichalStrehovskyNov 5, 2020

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Do you need conv.i4 before returning the value? Stack has native int, but method returns int32.

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.

@sandreenkosandreenkoNov 5, 2020

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

The difference between a stack location and a static field that this is returning right now is a very random number.

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.
My understanding is that ECMA allows implicit coercion of native int to int so I do not need a cast there.
However, I could read it wrong and can add a cast just for safety.

from ECMA, page 38:
I.8.7.3 General assignment compatibility:
image

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.

I believe that @sandreenko is correct that this implicit conversion is allowed.

WriteLine is just to make sure we don't delete the value.
avoid a possible overflow and don't waste time on printing.
@sandreenko
sandreenko merged commit 5ed389b into dotnet:masterNov 6, 2020
@sandreenko
sandreenko deleted the fixSubCnstGcRef branch November 6, 2020 00:18
tqiu8 pushed a commit to tqiu8/runtime that referenced this pull request Nov 9, 2020
author Stephen Toub <stoub@microsoft.com> 1604601164 -0500
committer Tammy Qiu <tammy.qiu@yahoo.com> 1604960878 -0500
Add stream conformance tests for TranscodingStream (dotnet#44248)
* Add stream conformance tests for TranscodingStream
* Special-case 0-length input buffers to TranscodingStream.Write{Async}
The base implementation of Encoder.Convert doesn't like empty inputs. Regardless, if the input is empty, we can avoid a whole bunch of unnecessary work.
JIT: minor inliner refactoring (dotnet#44215)
Extract out the budget check logic so it can vary by inlining policy.
Use this to exempt the FullPolicy from budget checking.
Fix inline xml to dump the proper (full name) hash for inlinees.
Update range dumper to dump ranges in hex.
Remove unused QCall for WinRTSupported (dotnet#44278)
ConcurrentQueueSegment allows spinning threads to sleep. (dotnet#44265)
* Allow threads to sleep when ConcurrentQueue has many enqueuers/dequeuers.
* Update src/libraries/System.Private.CoreLib/src/System/Collections/Concurrent/ConcurrentQueueSegment.cs
Co-authored-by: Stephen Toub <stoub@microsoft.com>
* Apply suggestions from code review
Co-authored-by: Stephen Toub <stoub@microsoft.com>
Co-authored-by: AMD DAYTONA EPYC <amd@amd-DAYTONA-X0.com>
Co-authored-by: Stephen Toub <stoub@microsoft.com>
File.Exists() is not null when true (dotnet#44310)
* File.Exists() is not null when true
* Fix compile
* Fix compile 2
[master][watchOS] Add simwatch64 support (dotnet#44303)
Xcode 12.2 removed 32 bits support for watchOS simulators, this PR helps to fixdotnet/macios#9949, we have tested the new binaries and they are working as expected
![unknown](https://user-images.githubusercontent.com/204671/98253709-64413200-1f49-11eb-9774-8c5aa416fc57.png)
Co-authored-by: dalexsoto <dalexsoto@users.noreply.github.com>
Implementing support to Debugger::Break. (dotnet#44305)
Set fgOptimizedFinally flag correctly (dotnet#44268)
- Initialize to 0 at compiler startup
- Set flag when finally cloning optimization kicks in
Fixes non-deterministic generation of nop opcodes into ARM32 code
Forbid `- byref cnst` -> `+ (byref -cnst)` transformation. (dotnet#44266)
* Add a repro test.
* Forbid the transformation for byrefs.
* Update src/coreclr/src/jit/morph.cpp
Co-authored-by: Andy Ayers <andya@microsoft.com>
* Update src/coreclr/src/jit/morph.cpp
* Fix the test return value.
WriteLine is just to make sure we don't delete the value.
* improve the test.
avoid a possible overflow and don't waste time on printing.
Co-authored-by: Andy Ayers <andya@microsoft.com>
Pick libmonosgen-2.0.so from cmake install directory instead of .libs (dotnet#44291)
This aligns Linux with what we already do for all the other platforms.
Update SharedPerformanceCounter assert (dotnet#44333)
Remove silly ToString in GetCLRInstanceString (dotnet#44335)
Use targetPlatformMoniker for net5.0 and newer tfms (dotnet#43965)
* Use targetPlatformMoniker for net5.0 and newer tfms
* disabling analyzer, update version to 0.0, and use new format.
* update the targetFramework.sdk
* removing supportedOS assembly level attribute
* fix linker errors and addressing feedback
* making _TargetFrameworkWithoutPlatform as private
[sgen] Add Ward annotations to sgen_get_total_allocated_bytes (dotnet#43833)
Attempt to fix https://jenkins.mono-project.com/job/test-mono-mainline-staticanalysis/
Co-authored-by: lambdageek <lambdageek@users.noreply.github.com>
[tests] Re-enable tests fixed by dotnet#44081 (dotnet#44212)
Fixesmono/mono#15030 and
fixesmono/mono#15031 and
fixesmono/mono#15032
Add an implicit argument coercion check. (dotnet#43386)
* Add `impCheckImplicitArgumentCoercion`.
* Fix tests with type mismatch.
* Try to fix VM signature.
* Allow to pass byref as native int.
* another fix.
* Fix another IL test.
[mono] Change CMakelists.txt "python" -> Python3_EXECUTABLE (dotnet#44340)
Debian doesn't install a "python" binary for python3.
Tweak StreamConformanceTests for cancellation (dotnet#44342)
- Avoid unnecessary timers
- Separate tests for precancellation, ReadAsync(byte[], ...) cancellation, and ReadAsync(Memory, ...) cancellation
Use Dictionary for underlying cache of ResourceSet (dotnet#44104)
Simplify catch-rethrow logic in NetworkStream (dotnet#44246)
A follow-up on dotnet#40772 (comment), simplifies and harmonizes the way we wrap exceptions into IOException. Having one catch block working with System.Exception seems to be enough here, no need for specific handling of SocketException.
Simple GT_NEG optimization for dotnet#13837 (dotnet#43921)
* Simple arithmetic optimization with GT_NEG
* Skip GT_NEG optimization when an operand is constant. Revert bitwise rotation pattern
* Fixed Value Numbering assert
* Cleaned up code and comments for simple GT_NEG optimization
* Formatting
Co-authored-by: Julie Lee <jeonlee@microsoft.com>
[master] Update dependencies from mono/linker (dotnet#44322)
* Update dependencies from https://github.com/mono/linker build 20201105.1
Microsoft.NET.ILLink.Tasks
From Version 6.0.0-alpha.1.20527.2 -> To Version 6.0.0-alpha.1.20555.1
* Update dependencies from https://github.com/mono/linker build 20201105.2
Microsoft.NET.ILLink.Tasks
From Version 6.0.0-alpha.1.20527.2 -> To Version 6.0.0-alpha.1.20555.2
* Disable new optimization for libraries mode (it cannot work in this mode)
Co-authored-by: dotnet-maestro[bot] <dotnet-maestro[bot]@users.noreply.github.com>
Co-authored-by: Marek Safar <marek.safar@gmail.com>
Tighten argument validation in StreamConformanceTests (dotnet#44326)
Add threshold on number of files / partition in SPMI collection (dotnet#44180)
* Add check for files count
* Fix the OS check
* decrese file limit to 1500:
* misc fix
* Do not upload to azure if mch files are zero size
Fix ELT profiler tests (dotnet#44285)
[master] Update dependencies from dotnet/arcade dotnet/llvm-project dotnet/icu (dotnet#44336)
[master] Update dependencies from dotnet/arcade dotnet/llvm-project dotnet/icu
- Merge branch 'master' into darc-master-2211df94-2a02-4c3c-abe1-e3534e896267
Fix Send_TimeoutResponseContent_Throws (dotnet#44356)
If the client times out too quickly, the server may never have a connection to accept and will hang forever.
Match CoreCLR behaviour on thread start failure (dotnet#44124)
Co-authored-by: Aleksey Kliger (λgeek) <akliger@gmail.com>
Add slash in Windows SoD tool build (dotnet#44359)
* Add slash in Windows SoD tool build
* Update SoD search path to match output dir
* Fixup dotnet version
* Remove merge commit headers
* Disable PRs
Co-authored-by: Drew Scoggins <andrew.g.scoggins@gmail>
Reflect test path changes in .gitattributes; remove nonexistent files (dotnet#44371)
Bootstrapping a test for R2RDump (dotnet#42150)
Improve performance of Enum's generic IsDefined / GetName / GetNames (dotnet#44355)
Eliminates the boxing in IsDefined/GetName/GetValues, and in GetNames avoids having to go through RuntimeType's GetEnumNames override.
clarify http version test (dotnet#44379)
Co-authored-by: Geoffrey Kizer <geoffrek@windows.microsoft.com>
Update dependencies from https://github.com/mono/linker build 20201106.1 (dotnet#44367)
Microsoft.NET.ILLink.Tasks
From Version 6.0.0-alpha.1.20555.2 -> To Version 6.0.0-alpha.1.20556.1
Co-authored-by: dotnet-maestro[bot] <dotnet-maestro[bot]@users.noreply.github.com>
Disable RunThreadLocalTest8_Values on Mono (dotnet#44357)
* Disable RunThreadLocalTest8_Values on Mono
It's failing on SLES
* fix typo
LongProcessNamesAreSupported: make test work on distros where sleep is a symlink/script (dotnet#44299)
* LongProcessNamesAreSupported: make test work on distros where sleep is a symlink/script
* PR feedback
Co-authored-by: Stephen Toub <stoub@microsoft.com>
* fix compilation
Co-authored-by: Stephen Toub <stoub@microsoft.com>
add missing constructor overloads (dotnet#44380)
Co-authored-by: Geoffrey Kizer <geoffrek@windows.microsoft.com>
change using in ConnectCallback_UseUnixDomainSocket_Success (dotnet#44366)
Clean up the samples (dotnet#44293)
Update dotnet/roslyn issue link
Delete stale comment about dotnet/roslyn#30797
Fix/remove TODO-NULLABLEs (dotnet#44300)
* Fix/remove TODO-NULLABLEs
* remove redundant !
* apply Jozkee's feedback
* address feedback
Update glossary (dotnet#44274)
Co-authored-by: Juan Hoyos <juan.hoyos@microsoft.com>
Co-authored-by: Stephen Toub <stoub@microsoft.com>
Co-authored-by: Günther Foidl <gue@korporal.at>
Add files need for wasm executable relinking/aot to the wasm runtime pack. (dotnet#43785)
Co-authored-by: Alexander Köplinger <alex.koeplinger@outlook.com>
Move some more UnmanagedCallersOnly tests to IL now that they're invalid C# (dotnet#43366)
Fix C++ build for mono/metadata/threads.c (dotnet#44413)
`throw` is a reserved keyword in C++.
Disable a failing test. (dotnet#44404)
Change async void System.Text.Json test to be async Task (dotnet#44418)
Improve crossgen2 comparison jobs (dotnet#44119)
- Fix compilation on unix platforms
- Wrap use of wildcard in quotes
- Print better display name into log
- Fix X86 constant comparison handling
- Add ability to compile specific overload via single method switches
Remove some unnecessary GetTypeInfo usage (dotnet#44414)
Fix MarshalTypedArrayByte and re-enable it. Re-enable TestFunctionApply
@EgorBoEgorBo mentioned this pull request Dec 5, 2020
@ghostghost locked as resolved and limited conversation to collaborators Dec 6, 2020
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.

5 participants

@sandreenko@CarolEidt@AndyAyersMS@MichalStrehovsky@Dotnet-GitSync-Bot