More context at dotnet/coreclr#23783, specifically the comment at dotnet/coreclr#23783 (comment).
We have code in Memory<T>.Span that attempts to read an IntPtr field at offset 0 from an object. The way this is done is by getting a ref to the field at offset IntPtr.Size, then subtracting IntPtr.Size and dereferencing.
Today it results in this codegen:
; assume rcx := 'obj' and has already been validated as non-null
lea temp64, [rcx + 08h] ; ref to obj._firstField
mov temp64, qword ptr [temp64 - 08h] ; deref field at offset 0 in 'obj'
cmp 0, dword ptr [temp64] ; compare *(int*)temp64 < 0
It should ideally result in this codegen:
; assume rcx := 'obj' and has already been validated as non-null
mov temp64, qword ptr [rcx] ; deref field at offset 0 in 'obj'
cmp 0, dword ptr [temp64] ; compare *(int*)temp64 < 0
This optimization would also obviate the need for the new intrinsic proposed as part of dotnet/coreclr#23783.
category:cq
theme:basic-cq
skill-level:expert
cost:large
More context at dotnet/coreclr#23783, specifically the comment at dotnet/coreclr#23783 (comment).
We have code in
Memory<T>.Spanthat attempts to read anIntPtrfield at offset 0 from an object. The way this is done is by getting a ref to the field at offsetIntPtr.Size, then subtractingIntPtr.Sizeand dereferencing.Today it results in this codegen:
It should ideally result in this codegen:
This optimization would also obviate the need for the new intrinsic proposed as part of dotnet/coreclr#23783.
category:cq
theme:basic-cq
skill-level:expert
cost:large