Open
Description
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