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
; 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
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
Code
Asm produced
category:cq
theme:ref-counts
skill-level:expert
cost:medium