Skip to content

[RyuJit] Declaring many vars causes stackspace spilling #7281

@benaadams

Description

@benaadams

Optimized code reserves stack space for pre-optimized stack

e.g. The following code reserves 136 bytes of stack, and zeros out 24 bytes (which it uses) even though I'd reason its output and output from https://github.com/dotnet/coreclr/issues/9066 should be identical

; Lcl frame size = 136

G_M2227_IG01:
       57                   push     rdi
       56                   push     rsi
       4881EC88000000       sub      rsp, 136          // 136 bytes reserved
       488BF1               mov      rsi, rcx
       488D7C2428           lea      rdi, [rsp+28H]
       B918000000           mov      ecx, 24           // 24 bytes zero'd
       33C0                 xor      rax, rax
       F3AB                 rep stosd 

Code

[MethodImpl(MethodImplOptions.NoInlining)]
private static byte LotsOfSpans(byte[] array)
{
    var span00 = new Span<byte>(array);
    var span01 = span00.Slice(1);
    var span02 = span01.Slice(1);
    var span03 = span02.Slice(1);
    var span04 = span03.Slice(1);
    var span05 = span04.Slice(1);
    var span06 = span05.Slice(1);
    var span07 = span06.Slice(1);
    var span08 = span07.Slice(1);
    var span09 = span08.Slice(1);
    var span10 = span09.Slice(1);
    var span11 = span10.Slice(1);
    var span12 = span11.Slice(1);
    var span13 = span12.Slice(1);
    var span14 = span13.Slice(1);
    var span15 = span14.Slice(1);
    var span16 = span15.Slice(1);
    var span17 = span16.Slice(1);
    var span18 = span17.Slice(1);
    var span19 = span18.Slice(1);
    var span20 = span19.Slice(1);
    var span21 = span20.Slice(1);
    var span22 = span21.Slice(1);
    var span23 = span22.Slice(1);
    var span24 = span23.Slice(1);
    var span25 = span24.Slice(1);
    var span26 = span25.Slice(1);
    var span27 = span26.Slice(1);
    var span28 = span27.Slice(1);
    var span29 = span28.Slice(1);
    var span30 = span29.Slice(1);
    return span30[0];
}

Asm produced

; Lcl frame size = 136

G_M2227_IG01:
       57                   push     rdi
       56                   push     rsi
       4881EC88000000       sub      rsp, 136
       488BF1               mov      rsi, rcx
       488D7C2428           lea      rdi, [rsp+28H]
       B918000000           mov      ecx, 24
       33C0                 xor      rax, rax
       F3AB                 rep stosd 
       488BCE               mov      rcx, rsi

G_M2227_IG02:
       4885C9               test     rcx, rcx
       0F844D030000         je       G_M2227_IG45

G_M2227_IG03:
       8B7108               mov      esi, dword ptr [rcx+8]
       488BF9               mov      rdi, rcx
       48B9D07C960FF87F0000 mov      rcx, 0x7FF80F967CD0
       33D2                 xor      edx, edx
       E8B397AD5F           call     CORINFO_HELP_CLASSINIT_SHARED_DYNAMICCLASS
       488B052485EAFF       mov      rax, qword ptr [reloc classVar[0xf9693a8]]
       83FE01               cmp      esi, 1
       0F822D030000         jb       G_M2227_IG46

G_M2227_IG04:
       48FFC0               inc      rax
       8D4EFF               lea      ecx, [rsi-1]
       488BD7               mov      rdx, rdi
       488BFA               mov      rdi, rdx
       83F901               cmp      ecx, 1
       0F8222030000         jb       G_M2227_IG47

G_M2227_IG05:
       48FFC0               inc      rax
       FFC9                 dec      ecx
       488BD7               mov      rdx, rdi
       488BFA               mov      rdi, rdx
       83F901               cmp      ecx, 1
       0F8218030000         jb       G_M2227_IG48

G_M2227_IG06:
       48FFC0               inc      rax
       FFC9                 dec      ecx
       488BD7               mov      rdx, rdi
       488BFA               mov      rdi, rdx
       83F901               cmp      ecx, 1
       0F820E030000         jb       G_M2227_IG49

G_M2227_IG07:
       48FFC0               inc      rax
       FFC9                 dec      ecx
       488BD7               mov      rdx, rdi
       488BFA               mov      rdi, rdx
       83F901               cmp      ecx, 1
       0F8204030000         jb       G_M2227_IG50

G_M2227_IG08:
       48FFC0               inc      rax
       FFC9                 dec      ecx
       488BD7               mov      rdx, rdi
       488BFA               mov      rdi, rdx
       83F901               cmp      ecx, 1
       0F82FA020000         jb       G_M2227_IG51

G_M2227_IG09:
       48FFC0               inc      rax
       FFC9                 dec      ecx
       488BD7               mov      rdx, rdi
       488BFA               mov      rdi, rdx
       83F901               cmp      ecx, 1
       0F82F0020000         jb       G_M2227_IG52

G_M2227_IG10:
       48FFC0               inc      rax
       FFC9                 dec      ecx
       488BD7               mov      rdx, rdi
       488BFA               mov      rdi, rdx
       83F901               cmp      ecx, 1
       0F82E6020000         jb       G_M2227_IG53

G_M2227_IG11:
       48FFC0               inc      rax
       FFC9                 dec      ecx
       488BD7               mov      rdx, rdi
       488BFA               mov      rdi, rdx
       83F901               cmp      ecx, 1
       0F82DC020000         jb       G_M2227_IG54

G_M2227_IG12:
       48FFC0               inc      rax
       FFC9                 dec      ecx
       488BD7               mov      rdx, rdi
       488BFA               mov      rdi, rdx
       83F901               cmp      ecx, 1
       0F82D2020000         jb       G_M2227_IG55

G_M2227_IG13:
       48FFC0               inc      rax
       FFC9                 dec      ecx
       488BD7               mov      rdx, rdi
       488BFA               mov      rdi, rdx
       83F901               cmp      ecx, 1
       0F82C8020000         jb       G_M2227_IG56

G_M2227_IG14:
       48FFC0               inc      rax
       FFC9                 dec      ecx
       488BD7               mov      rdx, rdi
       488BFA               mov      rdi, rdx
       83F901               cmp      ecx, 1
       0F82BE020000         jb       G_M2227_IG57

G_M2227_IG15:
       48FFC0               inc      rax
       FFC9                 dec      ecx
       488BD7               mov      rdx, rdi
       488BFA               mov      rdi, rdx
       83F901               cmp      ecx, 1
       0F82B4020000         jb       G_M2227_IG58

G_M2227_IG16:
       48FFC0               inc      rax
       FFC9                 dec      ecx
       488BD7               mov      rdx, rdi
       488BFA               mov      rdi, rdx
       83F901               cmp      ecx, 1
       0F82AA020000         jb       G_M2227_IG59

G_M2227_IG17:
       48FFC0               inc      rax
       FFC9                 dec      ecx
       488BD7               mov      rdx, rdi
       488BFA               mov      rdi, rdx
       83F901               cmp      ecx, 1
       0F82A0020000         jb       G_M2227_IG60

G_M2227_IG18:
       48FFC0               inc      rax
       FFC9                 dec      ecx
       488BD7               mov      rdx, rdi
       488BFA               mov      rdi, rdx
       83F901               cmp      ecx, 1
       0F8296020000         jb       G_M2227_IG61

G_M2227_IG19:
       48FFC0               inc      rax
       FFC9                 dec      ecx
       488BD7               mov      rdx, rdi
       488BFA               mov      rdi, rdx
       83F901               cmp      ecx, 1
       0F828C020000         jb       G_M2227_IG62

G_M2227_IG20:
       48FFC0               inc      rax
       FFC9                 dec      ecx
       488BD7               mov      rdx, rdi
       488BFA               mov      rdi, rdx
       83F901               cmp      ecx, 1
       0F8282020000         jb       G_M2227_IG63

G_M2227_IG21:
       48FFC0               inc      rax
       FFC9                 dec      ecx
       488BD7               mov      rdx, rdi
       488BFA               mov      rdi, rdx
       83F901               cmp      ecx, 1
       0F8278020000         jb       G_M2227_IG64

G_M2227_IG22:
       48FFC0               inc      rax
       FFC9                 dec      ecx
       488BD7               mov      rdx, rdi
       488BFA               mov      rdi, rdx
       83F901               cmp      ecx, 1
       0F826E020000         jb       G_M2227_IG65

G_M2227_IG23:
       48FFC0               inc      rax
       FFC9                 dec      ecx
       488BD7               mov      rdx, rdi
       488BFA               mov      rdi, rdx
       83F901               cmp      ecx, 1
       0F8264020000         jb       G_M2227_IG66

G_M2227_IG24:
       48FFC0               inc      rax
       FFC9                 dec      ecx
       488BD7               mov      rdx, rdi
       488BFA               mov      rdi, rdx
       83F901               cmp      ecx, 1
       0F825A020000         jb       G_M2227_IG67

G_M2227_IG25:
       48FFC0               inc      rax
       FFC9                 dec      ecx
       488BD7               mov      rdx, rdi
       488BFA               mov      rdi, rdx
       83F901               cmp      ecx, 1
       0F8250020000         jb       G_M2227_IG68

G_M2227_IG26:
       48FFC0               inc      rax
       FFC9                 dec      ecx
       488BD7               mov      rdx, rdi
       488BFA               mov      rdi, rdx
       83F901               cmp      ecx, 1
       0F8246020000         jb       G_M2227_IG69

G_M2227_IG27:
       48FFC0               inc      rax
       FFC9                 dec      ecx
       488BD7               mov      rdx, rdi
       488BFA               mov      rdi, rdx
       83F901               cmp      ecx, 1
       0F823C020000         jb       G_M2227_IG70

G_M2227_IG28:
       48FFC0               inc      rax
       FFC9                 dec      ecx
       488BD7               mov      rdx, rdi
       488BFA               mov      rdi, rdx
       83F901               cmp      ecx, 1
       0F8232020000         jb       G_M2227_IG71

G_M2227_IG29:
       48FFC0               inc      rax
       FFC9                 dec      ecx
       488BD7               mov      rdx, rdi
       83F901               cmp      ecx, 1
       0F822B020000         jb       G_M2227_IG72

G_M2227_IG30:
       48FFC0               inc      rax
       FFC9                 dec      ecx
       4533C0               xor      r8, r8
       4C8D4C2470           lea      r9, bword ptr [rsp+70H]

G_M2227_IG31:
       660F57C0             xorpd    xmm0, xmm0
       F3410F7F01           movdqu   qword ptr [r9], xmm0
       4D894110             mov      qword ptr [r9+16], r8

G_M2227_IG32:
       898C2480000000       mov      dword ptr [rsp+80H], ecx
       4889542470           mov      gword ptr [rsp+70H], rdx
       4889442478           mov      qword ptr [rsp+78H], rax
       488D442470           lea      rax, bword ptr [rsp+70H]
       488B08               mov      rcx, gword ptr [rax]
       488B5008             mov      rdx, qword ptr [rax+8]
       8B4010               mov      eax, dword ptr [rax+16]
       83F801               cmp      eax, 1
       0F82F2010000         jb       G_M2227_IG73

G_M2227_IG33:
       48FFC2               inc      rdx
       FFC8                 dec      eax
       4533C0               xor      r8, r8
       4C8D4C2458           lea      r9, bword ptr [rsp+58H]

G_M2227_IG34:
       660F57C0             xorpd    xmm0, xmm0
       F3410F7F01           movdqu   qword ptr [r9], xmm0
       4D894110             mov      qword ptr [r9+16], r8

G_M2227_IG35:
       89442468             mov      dword ptr [rsp+68H], eax
       48894C2458           mov      gword ptr [rsp+58H], rcx
       4889542460           mov      qword ptr [rsp+60H], rdx
       488D442458           lea      rax, bword ptr [rsp+58H]
       488B08               mov      rcx, gword ptr [rax]
       488B5008             mov      rdx, qword ptr [rax+8]
       8B4010               mov      eax, dword ptr [rax+16]
       83F801               cmp      eax, 1
       0F82BC010000         jb       G_M2227_IG74

G_M2227_IG36:
       48FFC2               inc      rdx
       FFC8                 dec      eax
       4533C0               xor      r8, r8
       4C8D4C2440           lea      r9, bword ptr [rsp+40H]

G_M2227_IG37:
       660F57C0             xorpd    xmm0, xmm0
       F3410F7F01           movdqu   qword ptr [r9], xmm0
       4D894110             mov      qword ptr [r9+16], r8

G_M2227_IG38:
       89442450             mov      dword ptr [rsp+50H], eax
       48894C2440           mov      gword ptr [rsp+40H], rcx
       4889542448           mov      qword ptr [rsp+48H], rdx
       488D442440           lea      rax, bword ptr [rsp+40H]
       488B08               mov      rcx, gword ptr [rax]
       488B5008             mov      rdx, qword ptr [rax+8]
       8B4010               mov      eax, dword ptr [rax+16]
       83F801               cmp      eax, 1
       0F8286010000         jb       G_M2227_IG75

G_M2227_IG39:
       48FFC2               inc      rdx
       FFC8                 dec      eax
       4533C0               xor      r8, r8
       4C8D4C2428           lea      r9, bword ptr [rsp+28H]

G_M2227_IG40:
       660F57C0             xorpd    xmm0, xmm0
       F3410F7F01           movdqu   qword ptr [r9], xmm0
       4D894110             mov      qword ptr [r9+16], r8

G_M2227_IG41:
       89442438             mov      dword ptr [rsp+38H], eax
       48894C2428           mov      gword ptr [rsp+28H], rcx
       4889542430           mov      qword ptr [rsp+30H], rdx
       488D442428           lea      rax, bword ptr [rsp+28H]
       488B08               mov      rcx, gword ptr [rax]
       488B5008             mov      rdx, qword ptr [rax+8]
       8B4010               mov      eax, dword ptr [rax+16]
       85C0                 test     eax, eax
       0F8651010000         jbe      G_M2227_IG76

G_M2227_IG42:
       4885C9               test     rcx, rcx
       7505                 jne      SHORT G_M2227_IG43
       0FB602               movzx    rax, byte  ptr [rdx]
       EB0A                 jmp      SHORT G_M2227_IG44

G_M2227_IG43:
       488D4108             lea      rax, bword ptr [rcx+8]
       4803C2               add      rax, rdx
       0FB600               movzx    rax, byte  ptr [rax]

G_M2227_IG44:
       4881C488000000       add      rsp, 136
       5E                   pop      rsi
       5F                   pop      rdi
       C3                   ret      

G_M2227_IG45:
       33C9                 xor      ecx, ecx
       E876F8FFFF           call     ThrowHelper:ThrowArgumentNullException(int)

G_M2227_IG46:
       B902000000           mov      ecx, 2
       E8BCF8FFFF           call     ThrowHelper:ThrowArgumentOutOfRangeException(int)

G_M2227_IG47:
       B902000000           mov      ecx, 2
       E8B2F8FFFF           call     ThrowHelper:ThrowArgumentOutOfRangeException(int)

G_M2227_IG48:
       B902000000           mov      ecx, 2
       E8A8F8FFFF           call     ThrowHelper:ThrowArgumentOutOfRangeException(int)

G_M2227_IG49:
       B902000000           mov      ecx, 2
       E89EF8FFFF           call     ThrowHelper:ThrowArgumentOutOfRangeException(int)

G_M2227_IG50:
       B902000000           mov      ecx, 2
       E894F8FFFF           call     ThrowHelper:ThrowArgumentOutOfRangeException(int)

G_M2227_IG51:
       B902000000           mov      ecx, 2
       E88AF8FFFF           call     ThrowHelper:ThrowArgumentOutOfRangeException(int)

G_M2227_IG52:
       B902000000           mov      ecx, 2
       E880F8FFFF           call     ThrowHelper:ThrowArgumentOutOfRangeException(int)

G_M2227_IG53:
       B902000000           mov      ecx, 2
       E876F8FFFF           call     ThrowHelper:ThrowArgumentOutOfRangeException(int)

G_M2227_IG54:
       B902000000           mov      ecx, 2
       E86CF8FFFF           call     ThrowHelper:ThrowArgumentOutOfRangeException(int)

G_M2227_IG55:
       B902000000           mov      ecx, 2
       E862F8FFFF           call     ThrowHelper:ThrowArgumentOutOfRangeException(int)

G_M2227_IG56:
       B902000000           mov      ecx, 2
       E858F8FFFF           call     ThrowHelper:ThrowArgumentOutOfRangeException(int)

G_M2227_IG57:
       B902000000           mov      ecx, 2
       E84EF8FFFF           call     ThrowHelper:ThrowArgumentOutOfRangeException(int)

G_M2227_IG58:
       B902000000           mov      ecx, 2
       E844F8FFFF           call     ThrowHelper:ThrowArgumentOutOfRangeException(int)

G_M2227_IG59:
       B902000000           mov      ecx, 2
       E83AF8FFFF           call     ThrowHelper:ThrowArgumentOutOfRangeException(int)

G_M2227_IG60:
       B902000000           mov      ecx, 2
       E830F8FFFF           call     ThrowHelper:ThrowArgumentOutOfRangeException(int)

G_M2227_IG61:
       B902000000           mov      ecx, 2
       E826F8FFFF           call     ThrowHelper:ThrowArgumentOutOfRangeException(int)

G_M2227_IG62:
       B902000000           mov      ecx, 2
       E81CF8FFFF           call     ThrowHelper:ThrowArgumentOutOfRangeException(int)

G_M2227_IG63:
       B902000000           mov      ecx, 2
       E812F8FFFF           call     ThrowHelper:ThrowArgumentOutOfRangeException(int)

G_M2227_IG64:
       B902000000           mov      ecx, 2
       E808F8FFFF           call     ThrowHelper:ThrowArgumentOutOfRangeException(int)

G_M2227_IG65:
       B902000000           mov      ecx, 2
       E8FEF7FFFF           call     ThrowHelper:ThrowArgumentOutOfRangeException(int)

G_M2227_IG66:
       B902000000           mov      ecx, 2
       E8F4F7FFFF           call     ThrowHelper:ThrowArgumentOutOfRangeException(int)

G_M2227_IG67:
       B902000000           mov      ecx, 2
       E8EAF7FFFF           call     ThrowHelper:ThrowArgumentOutOfRangeException(int)

G_M2227_IG68:
       B902000000           mov      ecx, 2
       E8E0F7FFFF           call     ThrowHelper:ThrowArgumentOutOfRangeException(int)

G_M2227_IG69:
       B902000000           mov      ecx, 2
       E8D6F7FFFF           call     ThrowHelper:ThrowArgumentOutOfRangeException(int)

G_M2227_IG70:
       B902000000           mov      ecx, 2
       E8CCF7FFFF           call     ThrowHelper:ThrowArgumentOutOfRangeException(int)

G_M2227_IG71:
       B902000000           mov      ecx, 2
       E8C2F7FFFF           call     ThrowHelper:ThrowArgumentOutOfRangeException(int)

G_M2227_IG72:
       B902000000           mov      ecx, 2
       E8B8F7FFFF           call     ThrowHelper:ThrowArgumentOutOfRangeException(int)

G_M2227_IG73:
       B902000000           mov      ecx, 2
       E8AEF7FFFF           call     ThrowHelper:ThrowArgumentOutOfRangeException(int)

G_M2227_IG74:
       B902000000           mov      ecx, 2
       E8A4F7FFFF           call     ThrowHelper:ThrowArgumentOutOfRangeException(int)

G_M2227_IG75:
       B902000000           mov      ecx, 2
       E89AF7FFFF           call     ThrowHelper:ThrowArgumentOutOfRangeException(int)

G_M2227_IG76:
       E885F7FFFF           call     ThrowHelper:ThrowIndexOutOfRangeException()
       CC                   int3     

; Total bytes of code 1196, prolog size 29 for method Program:LotsOfSpans(ref):ubyte

category:cq
theme:ref-counts
skill-level:expert
cost:medium

Metadata

Metadata

Assignees

No one assigned

    Labels

    JitUntriagedCLR JIT issues needing additional triagearea-CodeGen-coreclrCLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMIenhancementProduct code improvement that does NOT require public API changes/additionsoptimizationtenet-performancePerformance related issue

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions