Skip to content

JIT: Bounds check not elided for inlined function with safe arguments on Windows #112019

@BoyBaykiller

Description

@BoyBaykiller

JIT currently elides bounds check for for (int i = 0; i < arr.Length; i++) loops.
When ClearBase is inlined with the given function arguments it is equivalent to exactly that, however the bounds check is not removed when targeting windows. See: https://godbolt.org/z/PMx8oPrM9. With int[] the redundant check is gone.

static void Clear(Span<int> arr)
{
    ClearBase(arr, arr.Length);
}

[MethodImpl(MethodImplOptions.AggressiveInlining)]
static void ClearBase(Span<int> arr, int len)
{
    for (int i = 0; i < len; i++)
    {
        arr[i] = 0;
    }
}
Program:Clear(System.Span`1[int]) (FullOpts):
       sub      rsp, 40
       mov      rax, bword ptr [rcx]
       mov      ecx, dword ptr [rcx+0x08]
       mov      edx, ecx
       xor      r8d, r8d
       test     ecx, ecx
       jle      SHORT G_M46351_IG04
       align    [13 bytes for IG03]
G_M46351_IG03:  ;; offset=0x0020
       cmp      r8d, edx
       jae      SHORT G_M46351_IG05
       xor      r10d, r10d
       mov      dword ptr [rax+4*r8], r10d
       inc      r8d
       cmp      r8d, ecx
       jl       SHORT G_M46351_IG03
G_M46351_IG04:  ;; offset=0x0034
       add      rsp, 40
       ret      
G_M46351_IG05:  ;; offset=0x0039
       call     CORINFO_HELP_RNGCHKFAIL
       int3     

Metadata

Metadata

Assignees

Labels

area-CodeGen-coreclrCLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMIin-prThere is an active PR which will close this issue when it is mergedtenet-performancePerformance related issue

Type

No type

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions