[JIT] Inefficient in-place readonly record struct updates with "with" keyword
@jakobbotsch is already working on this.
Since Jan 6, 2025.
Assessment
This issue has not been assessed yet.
Description
Description
Consider the following code snippet:
public readonly record struct X(int A, int B, int C, int D, int E);
public record struct Y(int A, int B, int C, int D, int E);
public class C
{
public void M(ref X x)
{
x = x with { C = 12 };
}
public void N(ref Y y)
{
y.C = 12;
}
}
The function M uses "with" to change the reference x in place, this should be equivalent to just setting C = 12 directly. However, on sharplab we get:
C.M(X ByRef)
L0000: sub esp, 0x14
L0003: cmp [edx], dl
L0005: vmovdqu xmm0, [edx]
L0009: vmovdqu [esp], xmm0
L000e: mov eax, [edx+0x10]
L0011: mov [esp+0x10], eax
L0015: vmovdqu xmm0, [esp]
L001a: vmovdqu [edx], xmm0
L001e: mov eax, [esp+0x10]
L0022: mov [edx+0x10], eax
L0025: mov dword ptr [edx+8], 0xc
L002c: add esp, 0x14
L002f: ret
C.N(Y ByRef)
L0000: mov dword ptr [edx+8], 0xc
L0007: ret
Configuration
Sharplab / C# / x64 / JIT ASM / Release
- Dominant language
- C#
- Stars
- 18.3k
- Forks
- 5.6k
- PR merge metrics
- PR metrics pending
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
More from dotnet/runtime
-
agentic-workflows untriaged
Difficulty 2/5 1-3 hours Newbie friendliness 76/100
-
area-System.Reflection blocking-clean-ci-optional Known Build Error os-mac-os-x untriaged
Difficulty 2/5 1-3 hours Newbie friendliness 68/100
-
area-CodeGen-coreclr untriaged
Difficulty 1/5 Under an hour Newbie friendliness 92/100
-
agentic-workflows untriaged
Difficulty 1/5 Under an hour Newbie friendliness 78/100
-
area-VM-meta-mono untriaged
Difficulty 2/5 1-3 hours Newbie friendliness 72/100
Similar issues
-
Difficulty 2/5 1-3 hours Newbie friendliness 86/100
-
:watch: Not Triaged 11.0 fundamentals/subsvc
Difficulty 2/5 1-3 hours Newbie friendliness 92/100
dotnet/AspNetCore.Docs#37699 ·
-
Difficulty 2/5 1-3 hours Newbie friendliness 72/100
SubtitleEdit/subtitleedit#15108 · 1 comment ·
-
area/docs-content Bug pulumi/docs
Difficulty 1/5 1-3 hours Newbie friendliness 94/100
-
Create parent directories only after the containment check in InstallHelper.TryExtractToDirectory Open
Difficulty 2/5 1-3 hours Newbie friendliness 78/100
PowerShell/PSResourceGet#2056 ·