-
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 generates better code when expression is stored in variable #102273
Labels
area-CodeGen-coreclr
CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI
Priority:2
Work that is important, but not critical for the release
tenet-performance
Performance related issue
Milestone
Comments
dotnet-issue-labeler
bot
added
the
area-CodeGen-coreclr
CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI
label
May 15, 2024
dotnet-policy-service
bot
added
the
untriaged
New issue has not been triaged by the area owner
label
May 15, 2024
Tagging subscribers to this area: @JulieLeeMSFT, @jakobbotsch |
Sounds like #87072 cc @jakobbotsch @dotnet/jit-contrib |
Yeah looks like it. The good news is that it is in my plans for .NET 9 to fix this. BTW, also looks like we are missing a simple transform in morph for the fgMorphTree BB01, STMT00004 (after)
[000026] DA-XG+----- ▌ STORE_LCL_VAR int V05 tmp2
[000025] ---XG+----- └──▌ IND ubyte
[000024] -----+----- └──▌ ADD long
[000023] -----+----- ├──▌ ADD long
[000004] -----+----- │ ├──▌ LCL_VAR long V00 arg0
[000007] -----+----- │ └──▌ SUB long
[000005] -----+----- │ ├──▌ LCL_VAR long V01 arg1 (last use)
[000006] -----+----- │ └──▌ LCL_VAR long V00 arg0
[000022] -----+----- └──▌ CNS_INT long -1
|
jakobbotsch
removed
the
untriaged
New issue has not been triaged by the area owner
label
May 15, 2024
This was referenced May 15, 2024
jakobbotsch
added
the
Priority:2
Work that is important, but not critical for the release
label
May 29, 2024
jakobbotsch
added a commit
to jakobbotsch/runtime
that referenced
this issue
May 29, 2024
This changes local morph to run in RPO when optimizations are enabled. It adds infrastructure to track and propagate LCL_ADDR values assigned to locals (or struct fields) during local morph. This allows us to avoid address exposure in cases where the destination local does not actually end up escaping in any way. Example: ```csharp public struct Awaitable { public int Opts; public Awaitable(bool value) { Opts = value ? 1 : 2; } } [MethodImpl(MethodImplOptions.NoInlining)] public static int Test() => new Awaitable(false).Opts; ``` Before: ```asm G_M59043_IG01: ;; offset=0x0000 push rax ;; size=1 bbWeight=1 PerfScore 1.00 G_M59043_IG02: ;; offset=0x0001 xor eax, eax mov dword ptr [rsp], eax mov dword ptr [rsp], 2 mov eax, dword ptr [rsp] ;; size=15 bbWeight=1 PerfScore 3.25 G_M59043_IG03: ;; offset=0x0010 add rsp, 8 ret ;; size=5 bbWeight=1 PerfScore 1.25 ; Total bytes of code: 21 ``` After: ```asm G_M59043_IG02: ;; offset=0x0000 mov eax, 2 ;; size=5 bbWeight=1 PerfScore 0.25 G_M59043_IG03: ;; offset=0x0005 ret ``` Propagating the addresses works much like local assertion prop in morph does. Proving that the locations that were stored to do not escape afterwards is done with a simplistic approach: we check globally that no reads of the location exists, and if so, we replace the `LCL_ADDR` stored to them by a constant 0. We leave it up to liveness to clean up the stores themselves. This could be more sophisticated, but in practice this handles the reported cases just fine. If we were able to remove any `LCL_ADDR` in this way then we run an additional pass over the locals of the IR to compute the final set of exposed locals. Fix dotnet#87072 Fix dotnet#102273 Fix dotnet#102518 This is still not sufficient to handle dotnet#69254. To handle that case we need to handle transferring assertions for struct copies, and also handle proving that specific struct fields containing local addresses do not escape. It is probably doable, but for now I will leave it as future work.
Sign up for free
to subscribe to this conversation on GitHub.
Already have an account?
Sign in.
Labels
area-CodeGen-coreclr
CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI
Priority:2
Work that is important, but not critical for the release
tenet-performance
Performance related issue
Description
Code:
M1:
M2:
SharpLab
Configuration
.NET 8.0.204
The text was updated successfully, but these errors were encountered: