-
Notifications
You must be signed in to change notification settings - Fork 4.8k
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
JIT: Model GT_RETURN kills with contained operand #111230
Merged
Merged
Conversation
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
When `GT_RETURN` has a contained operand (due to returning a DNER local), it will load the ABI return registers directly from stack. This will kill those registers. However, nothing was modelling this kill. This was noticed while trying to ensure that GC information is correctly marked in codegen when going into epilogs. However, this is potential bad codegen even on its own: before this change LSRA might not properly spill locals that are required to be live around a `GT_RETURN` node even if they are getting killed by the `GT_RETURN`. A concrete case was seen in `<StartupCode$FSharp-Core>.$Tasks+Using@148-5[System.__Canon]:Invoke` under JitStressRegs=2, where the VM requests that the JIT keep "this" alive throughout the function. Before this change we get the following codegen: ``` G_M51753_IG05: ; bbWeight=0.50, gcVars=0000000000000000 {}, gcrefRegs=0002 {x1}, byrefRegs=0000 {}, gcvars, byref ; gcrRegs -[x0] +[x1] ; GC ptr vars -{V00} stp xzr, xzr, [fp, #0x38] ldp x0, x1, [fp, #0x38] // [V04 loc2], [V04 loc2+0x08] ; gcrRegs -[x1] +[x0] ;; size=8 bbWeight=0.50 PerfScore 2.00 ``` where "this" is in `x1` going into the block, and gets overridden by the return without being available somewhere else. After this change, the codegen becomes ```asm G_M51753_IG05: ; bbWeight=0.50, gcVars=0000000000000000 {}, gcrefRegs=0002 {x1}, byrefRegs=0000 {}, gcvars, byref ; gcrRegs -[x0] +[x1] ; GC ptr vars -{V00} str x1, [fp, #0x20] // [V00 this] ; GC ptr vars +{V00} stp xzr, xzr, [fp, #0x38] ldp x0, x1, [fp, #0x38] // [V04 loc2], [V04 loc2+0x08] ; gcrRegs -[x1] +[x0] ;; size=12 bbWeight=0.50 PerfScore 2.50 ```
dotnet-issue-labeler
bot
added
the
area-CodeGen-coreclr
CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI
label
Jan 9, 2025
Tagging subscribers to this area: @JulieLeeMSFT, @jakobbotsch |
3 tasks
cc @dotnet/jit-contrib PTAL @kunalspathak Diffs. Some minor size regressions from different register allocation and now having to spill in some cases before |
BruceForstall
approved these changes
Jan 10, 2025
grendello
added a commit
to grendello/runtime
that referenced
this pull request
Jan 13, 2025
* main: JIT: Model GT_RETURN kills with contained operand (dotnet#111230) Update dependencies from https://github.com/dotnet/runtime-assets build 20250110.2 (dotnet#111290) [NativeAOT/ARM64] Generate frames compatible with Apple compact unwinding (dotnet#107766) Cleanup unused JIT stubs in vm (dotnet#111237) Ensure that Shuffle is marked as HW_Flag_CanBenefitFromConstantProp (dotnet#111303) Fix CMP0173 policy warning with cmake 3.31 (dotnet#110522) [RISC-V] Fix HostActivation.Tests unknown-rid (dotnet#110687) Fix accidentally duplicated global-build-step.yml in runtime-official.yml (dotnet#111302) JIT: run extra SPMI queries for arrays (dotnet#111293) Split the Runtime Shared Framework project and combine legs in the official build (dotnet#111136) Do not ignore `MemoryMarshal.TryWrite` result (dotnet#108661) Update dependencies from https://github.com/dotnet/emsdk build 20250109.1 (dotnet#111263) Clean up in Number.Formatting.cs (dotnet#110955)
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Labels
area-CodeGen-coreclr
CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI
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.
When
GT_RETURN
has a contained operand (due to returning a DNER local), it will load the ABI return registers directly from stack. This will kill those registers. However, nothing was modelling this kill.This was noticed while trying to ensure that GC information is correctly marked in codegen when going into epilogs (#107283). However, this is potential bad codegen even on its own: before this change LSRA might not properly spill locals that are required to be live around a
GT_RETURN
node even if they are getting killed by theGT_RETURN
. A concrete case was seen in<StartupCode$FSharp-Core>.$Tasks+Using@148-5[System.__Canon]:Invoke
under JitStressRegs=2, where the VM requests that the JIT keep "this" alive throughout the function. Before this change we get the following codegen:where "this" is in
x1
going into the block, and gets overridden by the return without being available somewhere else. After this change, the codegen becomes