Skip to content

ReadOnlySpan.CopyTo is surprisingly (relatively) expensive and doesn't inline #10332

@benaadams

Description

@benaadams

Its mostly a wrapper on BufferMemmove with some checks

[FAILED: unprofitable inline] ReadOnlySpan`1:CopyTo(struct):this

image

First occurrence in System.Private.CoreLib.dasm

; Assembly listing for method ReadOnlySpan`1:CopyTo(struct):this
; Lcl frame size = 48
G_M47339_IG01:
       push     rdi
       push     rsi
       push     rbx
       sub      rsp, 48
       mov      qword ptr [rsp+28H], rdx
G_M47339_IG02:
       mov      eax, dword ptr [rcx+8]
       mov      r9d, eax
       mov      r10, qword ptr [rdx+48]
       mov      r10, qword ptr [r10]
       cmp      r9d, dword ptr [r8+8]
       ja       SHORT G_M47339_IG05
       mov      rsi, bword ptr [r8]
       mov      rcx, bword ptr [rcx]
       mov      rdi, rcx
       movsxd   rbx, eax
       mov      rcx, qword ptr [r10+64]
       test     rcx, rcx
       jne      SHORT G_M47339_IG03
       mov      rcx, rdx
       lea      rdx, [(reloc)]
       call     CORINFO_HELP_RUNTIMEHANDLE_CLASS
       mov      rcx, rax
G_M47339_IG03:
       mov      rdx, rsi
       mov      r8, rdi
       mov      r9, rbx
       call     Buffer:Memmove(byref,byref,long)
       nop      
G_M47339_IG04:
       add      rsp, 48
       pop      rbx
       pop      rsi
       pop      rdi
       ret      
G_M47339_IG05:
       call     ThrowHelper:ThrowArgumentException_DestinationTooShort()
       int3     
; Total bytes of code 99, prolog size 12 for method ReadOnlySpan`1:CopyTo(struct):this

Second occurrence in System.Private.CoreLib.dasm

; Assembly listing for method ReadOnlySpan`1:CopyTo(struct):this
; Lcl frame size = 40
G_M648_IG01:
       sub      rsp, 40
       nop      
G_M648_IG02:
       mov      r8d, dword ptr [rcx+8]
       mov      eax, r8d
       cmp      eax, dword ptr [rdx+8]
       ja       SHORT G_M648_IG04
       mov      rdx, bword ptr [rdx]
       mov      rax, rdx
       mov      rdx, bword ptr [rcx]
       movsxd   r8, r8d
       mov      rcx, rax
       shl      r8, 1
       call     Buffer:Memmove(struct,struct,long)
       nop      
G_M648_IG03:
       add      rsp, 40
       ret      
G_M648_IG04:
       call     ThrowHelper:ThrowArgumentException_DestinationTooShort()
       int3     
; Total bytes of code 52, prolog size 5 for method ReadOnlySpan`1:CopyTo(struct):this

Metadata

Metadata

Assignees

No one assigned

    Labels

    area-CodeGen-coreclrCLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMIoptimization

    Type

    No type

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions