MihuBot / runtime-utils

0 stars 0 forks source link

[JitDiff X64] [EgorBo] Optimize BOX+UNBOX for "T? -> T" and "T -> T?" #530

Open MihuBot opened 1 month ago

MihuBot commented 1 month ago

Job completed in 15 minutes. https://github.com/dotnet/runtime/pull/104931

Diffs

Found 265 files with textual diffs.

Summary of Code Size diffs:
(Lower is better)

Total bytes of base: 39181357
Total bytes of diff: 39181161
Total bytes of delta: -196 (-0.00 % of base)
Total relative delta: -2.14
    diff is an improvement.
    relative diff is an improvement.

Top file improvements (bytes):
        -123 : System.Linq.Parallel.dasm (-0.01 % of base)
         -45 : System.Text.Json.dasm (-0.00 % of base)
         -28 : System.Data.Common.dasm (-0.00 % of base)

3 total files with Code Size differences (3 improved, 0 regressed), 256 unchanged.

Top method improvements (bytes):
         -45 (-11.90 % of base) : System.Text.Json.dasm - System.Text.Json.Nodes.JsonValueOfElement:TryGetValue[System.Nullable`1[int]](byref):ubyte:this (FullOpts)
         -41 (-8.67 % of base) : System.Linq.Parallel.dasm - System.Linq.ParallelEnumerable:PerformSequentialAggregation[int,System.Nullable`1[int]](System.Linq.ParallelQuery`1[int],System.Nullable`1[int],ubyte,System.Func`3[System.Nullable`1[int],int,System.Nullable`1[int]]):System.Nullable`1[int] (FullOpts)
         -41 (-69.49 % of base) : System.Linq.Parallel.dasm - System.Linq.ParallelQuery`1+<>c__1`1[int,System.Nullable`1[int]]:<Cast>b__1_0(int):System.Nullable`1[int]:this (FullOpts)
         -41 (-69.49 % of base) : System.Linq.Parallel.dasm - System.Linq.ParallelQuery`1+<>c__2`1[int,System.Nullable`1[int]]:<OfType>b__2_1(int):System.Nullable`1[int]:this (FullOpts)
         -14 (-27.45 % of base) : System.Data.Common.dasm - System.Data.SortExpressionBuilder`1+<>c__DisplayClass10_0`1[int,System.Nullable`1[int]]:<CloneCast>b__0(System.Nullable`1[int]):System.Object:this (FullOpts)
         -14 (-27.45 % of base) : System.Data.Common.dasm - System.Data.SortExpressionBuilder`1+<>c__DisplayClass10_0`1[int,System.Nullable`1[int]]:<CloneCast>b__1(System.Nullable`1[int]):System.Object:this (FullOpts)

Top method improvements (percentages):
         -41 (-69.49 % of base) : System.Linq.Parallel.dasm - System.Linq.ParallelQuery`1+<>c__1`1[int,System.Nullable`1[int]]:<Cast>b__1_0(int):System.Nullable`1[int]:this (FullOpts)
         -41 (-69.49 % of base) : System.Linq.Parallel.dasm - System.Linq.ParallelQuery`1+<>c__2`1[int,System.Nullable`1[int]]:<OfType>b__2_1(int):System.Nullable`1[int]:this (FullOpts)
         -14 (-27.45 % of base) : System.Data.Common.dasm - System.Data.SortExpressionBuilder`1+<>c__DisplayClass10_0`1[int,System.Nullable`1[int]]:<CloneCast>b__0(System.Nullable`1[int]):System.Object:this (FullOpts)
         -14 (-27.45 % of base) : System.Data.Common.dasm - System.Data.SortExpressionBuilder`1+<>c__DisplayClass10_0`1[int,System.Nullable`1[int]]:<CloneCast>b__1(System.Nullable`1[int]):System.Object:this (FullOpts)
         -45 (-11.90 % of base) : System.Text.Json.dasm - System.Text.Json.Nodes.JsonValueOfElement:TryGetValue[System.Nullable`1[int]](byref):ubyte:this (FullOpts)
         -41 (-8.67 % of base) : System.Linq.Parallel.dasm - System.Linq.ParallelEnumerable:PerformSequentialAggregation[int,System.Nullable`1[int]](System.Linq.ParallelQuery`1[int],System.Nullable`1[int],ubyte,System.Func`3[System.Nullable`1[int],int,System.Nullable`1[int]]):System.Nullable`1[int] (FullOpts)

6 total methods with Code Size differences (6 improved, 0 regressed), 230510 unchanged.

--------------------------------------------------------------------------------

Artifacts:

MihuBot commented 1 month ago

Top method improvements

-45 (-11.90 % of base) - System.Text.Json.Nodes.JsonValueOfElement:TryGetValue[System.Nullable`1[int]](byref):ubyte:this ```diff ; Assembly listing for method System.Text.Json.Nodes.JsonValueOfElement:TryGetValue[System.Nullable`1[int]](byref):ubyte:this (FullOpts) ; Emitting BLENDED_CODE for X64 with AVX512 - Unix ; FullOpts code ; optimized code ; rbp based frame ; partially interruptible ; No PGO data ; 0 inlinees with PGO data; 9 single block inlinees; 5 inlinees without PGO data ; Final local variable assignments ; ; V00 this [V00,T00] ( 5, 4.50) ref -> rbx this class-hnd single-def ; V01 arg1 [V01,T04] ( 4, 3 ) byref -> r15 single-def ;* V02 loc0 [V02 ] ( 0, 0 ) struct ( 8) zero-ref do-not-enreg[XS] addr-exposed ;* V03 loc1 [V03 ] ( 0, 0 ) struct (16) zero-ref ;* V04 loc2 [V04 ] ( 0, 0 ) ubyte -> zero-ref ; V05 loc3 [V05 ] ( 2, 1 ) int -> [rbp-0x28] do-not-enreg[X] addr-exposed ld-addr-op ;* V06 loc4 [V06 ] ( 0, 0 ) long -> zero-ref ld-addr-op ;* V07 loc5 [V07 ] ( 0, 0 ) double -> zero-ref ld-addr-op ;* V08 loc6 [V08 ] ( 0, 0 ) short -> zero-ref ld-addr-op ;* V09 loc7 [V09 ] ( 0, 0 ) struct (16) zero-ref ld-addr-op ;* V10 loc8 [V10 ] ( 0, 0 ) ubyte -> zero-ref ld-addr-op ;* V11 loc9 [V11 ] ( 0, 0 ) float -> zero-ref ld-addr-op ;* V12 loc10 [V12 ] ( 0, 0 ) int -> zero-ref ld-addr-op ;* V13 loc11 [V13 ] ( 0, 0 ) ushort -> zero-ref ld-addr-op ;* V14 loc12 [V14 ] ( 0, 0 ) long -> zero-ref ld-addr-op ;* V15 loc13 [V15 ] ( 0, 0 ) byte -> zero-ref ld-addr-op ;* V16 loc14 [V16 ] ( 0, 0 ) ref -> zero-ref class-hnd ;* V17 loc15 [V17 ] ( 0, 0 ) struct ( 8) zero-ref ld-addr-op ;* V18 loc16 [V18 ] ( 0, 0 ) struct (16) zero-ref ld-addr-op ;* V19 loc17 [V19 ] ( 0, 0 ) struct (16) zero-ref ld-addr-op ;* V20 loc18 [V20 ] ( 0, 0 ) ref -> zero-ref class-hnd ;# V21 OutArgs [V21 ] ( 1, 1 ) struct ( 0) [rsp+0x00] do-not-enreg[XS] addr-exposed "OutgoingArgSpace" ;* V22 tmp1 [V22 ] ( 0, 0 ) long -> zero-ref class-hnd exact "Single-def Box Helper" ;* V23 tmp2 [V23 ] ( 0, 0 ) byref -> zero-ref "ISINST eval op1" ;* V24 tmp3 [V24 ] ( 0, 0 ) int -> zero-ref "spilling qmarkNull" -; V25 tmp4 [V25,T08] ( 3, 3 ) ref -> r14 class-hnd exact single-def "Single-def Box Helper" -; V26 tmp5 [V26,T11] ( 2, 2 ) int -> rbx "impImportAndPushBox" +; V25 tmp4 [V25 ] ( 3, 3 ) struct ( 8) [rbp-0x30] do-not-enreg[SF] "Nullable tmp" +; V26 tmp5 [V26,T11] ( 2, 2 ) int -> rax "impAppendStmt" ;* V27 tmp6 [V27 ] ( 0, 0 ) ref -> zero-ref class-hnd exact "Single-def Box Helper" ;* V28 tmp7 [V28 ] ( 0, 0 ) ref -> zero-ref "ISINST eval op1" ;* V29 tmp8 [V29 ] ( 0, 0 ) ref -> zero-ref class-hnd "spilling qmarkNull" ; V30 tmp9 [V30,T05] ( 3, 5 ) byref -> r14 single-def "Inlining Arg" ; V31 tmp10 [V31,T09] ( 3, 2 ) ubyte -> rdi "Inline return value spill temp" ; V32 tmp11 [V32,T01] ( 4, 6 ) ref -> r13 class-hnd exact single-def "dup spill" ;* V33 tmp12 [V33 ] ( 0, 0 ) ref -> zero-ref single-def ; V34 tmp13 [V34,T12] ( 2, 2 ) int -> rax "Inlining Arg" ;* V35 tmp14 [V35 ] ( 0, 0 ) byref -> zero-ref "Inlining Arg" ;* V36 tmp15 [V36 ] ( 0, 0 ) byref -> zero-ref "Inlining Arg" ;* V37 tmp16 [V37 ] ( 0, 0 ) struct (16) zero-ref "spilled call-like call argument" ;* V38 tmp17 [V38 ] ( 0, 0 ) struct (16) zero-ref "spilled call-like call argument" ;* V39 tmp18 [V39 ] ( 0, 0 ) struct (16) zero-ref "Inline return value spill temp" ; V40 tmp19 [V40,T06] ( 4, 4 ) ref -> rdi class-hnd single-def "Inlining Arg" ; V41 tmp20 [V41,T03] ( 5, 5 ) int -> rax "Inlining Arg" ;* V42 tmp21 [V42 ] ( 0, 0 ) struct (16) zero-ref ld-addr-op "NewObj constructor temp" ;* V43 tmp22 [V43 ] ( 0, 0 ) struct (16) zero-ref ld-addr-op "Inline ldloca(s) first use temp" ; V44 tmp23 [V44,T10] ( 2, 2 ) byref -> rdi single-def "Inlining Arg" -; V45 tmp24 [V45,T13] ( 2, 2 ) int -> rcx "Inlining Arg" +; V45 tmp24 [V45,T13] ( 2, 2 ) int -> rsi "Inlining Arg" ;* V46 tmp25 [V46 ] ( 0, 0 ) struct (16) zero-ref ld-addr-op "Inlining Arg" ;* V47 tmp26 [V47 ] ( 0, 0 ) struct (16) zero-ref ld-addr-op "NewObj constructor temp" ;* V48 tmp27 [V48 ] ( 0, 0 ) byref -> zero-ref single-def "Inlining Arg" ;* V49 tmp28 [V49 ] ( 0, 0 ) int -> zero-ref "Inlining Arg" ;* V50 tmp29 [V50 ] ( 0, 0 ) struct (16) zero-ref ld-addr-op "Inlining Arg" ;* V51 tmp30 [V51 ] ( 0, 0 ) struct (16) zero-ref ld-addr-op "Inlining Arg" -; V52 tmp31 [V52,T07] ( 4, 4 ) byref -> rbx single-def "Inlining Arg" -; V53 tmp32 [V53,T19] ( 3, 0 ) ref -> rbx class-hnd exact single-def "NewObj constructor temp" +; V52 tmp31 [V52,T07] ( 3, 3 ) byref -> rbx single-def "Inlining Arg" +; V53 tmp32 [V53,T21] ( 3, 0 ) ref -> rbx class-hnd exact single-def "NewObj constructor temp" ;* V54 tmp33 [V54 ] ( 0, 0 ) struct (24) zero-ref do-not-enreg[SF] "stack allocated boxed value class temp" ;* V55 tmp34 [V55 ] ( 0, 0 ) ref -> zero-ref single-def "field V03._parent (fldOffset=0x0)" P-INDEP ;* V56 tmp35 [V56 ] ( 0, 0 ) int -> zero-ref "field V03._idx (fldOffset=0x8)" P-INDEP ;* V57 tmp36 [V57 ] ( 0, 0 ) int -> zero-ref "field V09._flags (fldOffset=0x0)" P-INDEP ;* V58 tmp37 [V58 ] ( 0, 0 ) int -> zero-ref "field V09._hi32 (fldOffset=0x4)" P-INDEP ;* V59 tmp38 [V59 ] ( 0, 0 ) long -> zero-ref "field V09._lo64 (fldOffset=0x8)" P-INDEP ;* V60 tmp39 [V60 ] ( 0, 0 ) long -> zero-ref "field V17._dateData (fldOffset=0x0)" P-INDEP ;* V61 tmp40 [V61 ] ( 0, 0 ) short -> zero-ref "field V18._offsetMinutes (fldOffset=0x0)" P-INDEP ;* V62 tmp41 [V62 ] ( 0, 0 ) long -> zero-ref "field V18._dateTime (fldOffset=0x8)" P-INDEP -;* V63 tmp42 [V63 ] ( 0, 0 ) byref -> zero-ref "field V37._reference (fldOffset=0x0)" P-INDEP -;* V64 tmp43 [V64 ] ( 0, 0 ) int -> zero-ref "field V37._length (fldOffset=0x8)" P-INDEP -;* V65 tmp44 [V65 ] ( 0, 0 ) byref -> zero-ref "field V38._reference (fldOffset=0x0)" P-INDEP -;* V66 tmp45 [V66 ] ( 0, 0 ) int -> zero-ref "field V38._length (fldOffset=0x8)" P-INDEP -; V67 tmp46 [V67,T14] ( 3, 1.50) byref -> rdi "field V39._reference (fldOffset=0x0)" P-INDEP -; V68 tmp47 [V68,T15] ( 3, 1.50) int -> rcx "field V39._length (fldOffset=0x8)" P-INDEP -; V69 tmp48 [V69,T17] ( 2, 1 ) byref -> rdi single-def "field V42._reference (fldOffset=0x0)" P-INDEP -; V70 tmp49 [V70,T18] ( 2, 1 ) int -> rcx "field V42._length (fldOffset=0x8)" P-INDEP -;* V71 tmp50 [V71 ] ( 0, 0 ) byref -> zero-ref single-def "field V43._reference (fldOffset=0x0)" P-INDEP -;* V72 tmp51 [V72 ] ( 0, 0 ) int -> zero-ref "field V43._length (fldOffset=0x8)" P-INDEP -;* V73 tmp52 [V73 ] ( 0, 0 ) byref -> zero-ref single-def "field V46._reference (fldOffset=0x0)" P-INDEP -;* V74 tmp53 [V74 ] ( 0, 0 ) int -> zero-ref "field V46._length (fldOffset=0x8)" P-INDEP -;* V75 tmp54 [V75 ] ( 0, 0 ) byref -> zero-ref single-def "field V47._reference (fldOffset=0x0)" P-INDEP -;* V76 tmp55 [V76 ] ( 0, 0 ) int -> zero-ref "field V47._length (fldOffset=0x8)" P-INDEP -;* V77 tmp56 [V77 ] ( 0, 0 ) byref -> zero-ref single-def "field V50._reference (fldOffset=0x0)" P-INDEP -;* V78 tmp57 [V78 ] ( 0, 0 ) int -> zero-ref "field V50._length (fldOffset=0x8)" P-INDEP -;* V79 tmp58 [V79 ] ( 0, 0 ) byref -> zero-ref single-def "field V51._reference (fldOffset=0x0)" P-INDEP -;* V80 tmp59 [V80 ] ( 0, 0 ) int -> zero-ref "field V51._length (fldOffset=0x8)" P-INDEP -;* V81 tmp60 [V81 ] ( 0, 0 ) long -> zero-ref "V54.[000..008)" -;* V82 tmp61 [V82 ] ( 0, 0 ) ref -> zero-ref "V54.[008..016)" -;* V83 tmp62 [V83 ] ( 0, 0 ) int -> zero-ref "V54.[016..020)" -; V84 cse0 [V84,T16] ( 3, 1.50) int -> rcx "CSE #01: moderate" -; V85 rat0 [V85,T02] ( 3, 5.60) int -> rax "ReplaceWithLclVar is creating a new local variable" +; V63 tmp42 [V63,T08] ( 3, 2.50) ubyte -> [rbp-0x30] do-not-enreg[] "field V25.hasValue (fldOffset=0x0)" P-DEP +; V64 tmp43 [V64,T14] ( 2, 2 ) int -> [rbp-0x2C] do-not-enreg[] "field V25.value (fldOffset=0x4)" P-DEP +;* V65 tmp44 [V65 ] ( 0, 0 ) byref -> zero-ref "field V37._reference (fldOffset=0x0)" P-INDEP +;* V66 tmp45 [V66 ] ( 0, 0 ) int -> zero-ref "field V37._length (fldOffset=0x8)" P-INDEP +;* V67 tmp46 [V67 ] ( 0, 0 ) byref -> zero-ref "field V38._reference (fldOffset=0x0)" P-INDEP +;* V68 tmp47 [V68 ] ( 0, 0 ) int -> zero-ref "field V38._length (fldOffset=0x8)" P-INDEP +; V69 tmp48 [V69,T15] ( 3, 1.50) byref -> rdi "field V39._reference (fldOffset=0x0)" P-INDEP +; V70 tmp49 [V70,T17] ( 3, 1.50) int -> rsi "field V39._length (fldOffset=0x8)" P-INDEP +; V71 tmp50 [V71,T19] ( 2, 1 ) byref -> rdi single-def "field V42._reference (fldOffset=0x0)" P-INDEP +; V72 tmp51 [V72,T20] ( 2, 1 ) int -> rsi "field V42._length (fldOffset=0x8)" P-INDEP +;* V73 tmp52 [V73 ] ( 0, 0 ) byref -> zero-ref single-def "field V43._reference (fldOffset=0x0)" P-INDEP +;* V74 tmp53 [V74 ] ( 0, 0 ) int -> zero-ref "field V43._length (fldOffset=0x8)" P-INDEP +;* V75 tmp54 [V75 ] ( 0, 0 ) byref -> zero-ref single-def "field V46._reference (fldOffset=0x0)" P-INDEP +;* V76 tmp55 [V76 ] ( 0, 0 ) int -> zero-ref "field V46._length (fldOffset=0x8)" P-INDEP +;* V77 tmp56 [V77 ] ( 0, 0 ) byref -> zero-ref single-def "field V47._reference (fldOffset=0x0)" P-INDEP +;* V78 tmp57 [V78 ] ( 0, 0 ) int -> zero-ref "field V47._length (fldOffset=0x8)" P-INDEP +;* V79 tmp58 [V79 ] ( 0, 0 ) byref -> zero-ref single-def "field V50._reference (fldOffset=0x0)" P-INDEP +;* V80 tmp59 [V80 ] ( 0, 0 ) int -> zero-ref "field V50._length (fldOffset=0x8)" P-INDEP +;* V81 tmp60 [V81 ] ( 0, 0 ) byref -> zero-ref single-def "field V51._reference (fldOffset=0x0)" P-INDEP +;* V82 tmp61 [V82 ] ( 0, 0 ) int -> zero-ref "field V51._length (fldOffset=0x8)" P-INDEP +;* V83 tmp62 [V83 ] ( 0, 0 ) long -> zero-ref "V54.[000..008)" +;* V84 tmp63 [V84 ] ( 0, 0 ) ref -> zero-ref "V54.[008..016)" +;* V85 tmp64 [V85 ] ( 0, 0 ) int -> zero-ref "V54.[016..020)" +; V86 cse0 [V86,T18] ( 3, 1.50) int -> rsi "CSE #01: moderate" +; V87 cse1 [V87,T16] ( 3, 1.50) ref -> rdi "CSE #03: moderate" +; V88 rat0 [V88,T02] ( 3, 5.60) int -> rax "ReplaceWithLclVar is creating a new local variable" ; ; Lcl frame size = 16 G_M46591_IG01: push rbp push r15 push r14 push r13 push rbx sub rsp, 16 lea rbp, [rsp+0x30] mov rbx, rdi mov r15, rsi ;; size=23 bbWeight=1 PerfScore 6.25 G_M46591_IG02: mov edi, dword ptr [rbx+0x18] lea r14, bword ptr [rbx+0x18] mov r13, gword ptr [r14] test r13, r13 jne SHORT G_M46591_IG06 ;; size=15 bbWeight=1 PerfScore 5.75 G_M46591_IG03: xor edi, edi ;; size=2 bbWeight=0.50 PerfScore 0.12 G_M46591_IG04: mov rax, 0xD1FFAB1E ; code for System.Text.Json.JsonReaderHelper:ToValueKind(ubyte):ubyte call [rax]System.Text.Json.JsonReaderHelper:ToValueKind(ubyte):ubyte add eax, -3 cmp eax, 3 ja G_M46591_IG12 ;; size=24 bbWeight=1 PerfScore 4.75 G_M46591_IG05: mov edi, eax - lea rax, [reloc @RWD00] - mov eax, dword ptr [rax+4*rdi] - lea rcx, G_M46591_IG02 - add rax, rcx - jmp rax + lea rsi, [reloc @RWD00] + mov esi, dword ptr [rsi+4*rdi] + lea rdx, G_M46591_IG02 + add rsi, rdx + jmp rsi ;; size=24 bbWeight=0.80 PerfScore 4.80 G_M46591_IG06: mov eax, dword ptr [r14+0x08] cmp dword ptr [r13+0x2C], 0 je G_M46591_IG16 mov rdi, gword ptr [r13+0x30] add eax, 8 test rdi, rdi jne SHORT G_M46591_IG07 test eax, eax je SHORT G_M46591_IG08 jmp G_M46591_IG15 ;; size=36 bbWeight=0.50 PerfScore 6.38 G_M46591_IG07: - mov ecx, dword ptr [rdi+0x08] - cmp ecx, eax + mov esi, dword ptr [rdi+0x08] + cmp esi, eax jb G_M46591_IG15 mov edx, eax lea rdi, bword ptr [rdi+rdx+0x10] - sub ecx, eax + sub esi, eax jmp SHORT G_M46591_IG09 ;; size=22 bbWeight=0.50 PerfScore 3.38 G_M46591_IG08: xor rdi, rdi - xor ecx, ecx + xor esi, esi ;; size=4 bbWeight=0.50 PerfScore 0.25 G_M46591_IG09: - cmp ecx, 4 - jl G_M46591_IG14 + cmp esi, 4 + jl SHORT G_M46591_IG14 mov edi, dword ptr [rdi] shr edi, 28 movzx rdi, dil - jmp G_M46591_IG04 - ;; size=23 bbWeight=0.50 PerfScore 3.00 + jmp SHORT G_M46591_IG04 + ;; size=16 bbWeight=0.50 PerfScore 3.00 G_M46591_IG10: add rbx, 24 - cmp gword ptr [rbx], 0 - je G_M46591_IG17 - mov rdi, 0xD1FFAB1E ; System.Int32 - call CORINFO_HELP_NEWSFAST - mov r14, rax mov rdi, gword ptr [rbx] + test rdi, rdi + je SHORT G_M46591_IG17 mov esi, dword ptr [rbx+0x08] lea rdx, [rbp-0x28] mov rax, 0xD1FFAB1E ; code for System.Text.Json.JsonDocument:TryGetValue(int,byref):ubyte:this cmp dword ptr [rdi], edi call [rax]System.Text.Json.JsonDocument:TryGetValue(int,byref):ubyte:this - mov ebx, eax - mov edx, dword ptr [rbp-0x28] - mov dword ptr [r14+0x08], edx - mov rdx, r14 - mov rdi, r15 - mov rsi, 0xD1FFAB1E ; System.Nullable`1[int] - call CORINFO_HELP_UNBOX_NULLABLE - mov eax, ebx - ;; size=88 bbWeight=0.50 PerfScore 10.38 + mov byte ptr [rbp-0x30], 1 + mov edi, dword ptr [rbp-0x28] + mov dword ptr [rbp-0x2C], edi + mov rdi, qword ptr [rbp-0x30] + mov qword ptr [r15], rdi + ;; size=50 bbWeight=0.50 PerfScore 8.62 G_M46591_IG11: add rsp, 16 pop rbx pop r13 pop r14 pop r15 pop rbp ret ;; size=13 bbWeight=0.50 PerfScore 1.88 G_M46591_IG12: xor eax, eax mov qword ptr [r15], rax ;; size=5 bbWeight=0.50 PerfScore 0.62 G_M46591_IG13: add rsp, 16 pop rbx pop r13 pop r14 pop r15 pop rbp ret ;; size=13 bbWeight=0.50 PerfScore 1.88 G_M46591_IG14: mov edi, 40 mov rax, 0xD1FFAB1E ; code for System.ThrowHelper:ThrowArgumentOutOfRangeException(int) call [rax]System.ThrowHelper:ThrowArgumentOutOfRangeException(int) int3 ;; size=18 bbWeight=0 PerfScore 0.00 G_M46591_IG15: mov rax, 0xD1FFAB1E ; code for System.ThrowHelper:ThrowArgumentOutOfRangeException() call [rax]System.ThrowHelper:ThrowArgumentOutOfRangeException() int3 ;; size=13 bbWeight=0 PerfScore 0.00 G_M46591_IG16: mov rax, 0xD1FFAB1E ; code for System.Text.Json.ThrowHelper:ThrowObjectDisposedException_JsonDocument() call [rax]System.Text.Json.ThrowHelper:ThrowObjectDisposedException_JsonDocument() int3 ;; size=13 bbWeight=0 PerfScore 0.00 G_M46591_IG17: mov rdi, 0xD1FFAB1E ; System.InvalidOperationException call CORINFO_HELP_NEWSFAST mov rbx, rax mov rdi, rbx mov rax, 0xD1FFAB1E ; code for System.InvalidOperationException:.ctor():this call [rax]System.InvalidOperationException:.ctor():this mov rdi, rbx call CORINFO_HELP_THROW int3 ;; size=42 bbWeight=0 PerfScore 0.00 RWD00 dd G_M46591_IG12 - G_M46591_IG02 dd G_M46591_IG10 - G_M46591_IG02 dd G_M46591_IG12 - G_M46591_IG02 dd G_M46591_IG12 - G_M46591_IG02 -; Total bytes of code 378, prolog size 17, PerfScore 49.42, instruction count 106, allocated bytes for code 378 (MethodHash=992b4a00) for method System.Text.Json.Nodes.JsonValueOfElement:TryGetValue[System.Nullable`1[int]](byref):ubyte:this (FullOpts) +; Total bytes of code 333, prolog size 17, PerfScore 47.67, instruction count 100, allocated bytes for code 333 (MethodHash=992b4a00) for method System.Text.Json.Nodes.JsonValueOfElement:TryGetValue[System.Nullable`1[int]](byref):ubyte:this (FullOpts) ```
-41 (-8.67 % of base) - System.Linq.ParallelEnumerable:PerformSequentialAggregation[int,System.Nullable`1[int]](System.Linq.ParallelQuery`1[int],System.Nullable`1[int],ubyte,System.Func`3[System.Nullable`1[int],int,System.Nullable`1[int]]):System.Nullable`1[int] ```diff ; Assembly listing for method System.Linq.ParallelEnumerable:PerformSequentialAggregation[int,System.Nullable`1[int]](System.Linq.ParallelQuery`1[int],System.Nullable`1[int],ubyte,System.Func`3[System.Nullable`1[int],int,System.Nullable`1[int]]):System.Nullable`1[int] (FullOpts) ; Emitting BLENDED_CODE for X64 with AVX512 - Unix ; FullOpts code ; optimized code ; rbp based frame ; fully interruptible ; No PGO data ; Final local variable assignments ; -; V00 arg0 [V00,T03] ( 4, 4 ) ref -> rdi class-hnd single-def -; V01 arg1 [V01,T05] ( 3, 2.50) struct ( 8) r14 single-def -; V02 arg2 [V02,T04] ( 3, 3 ) ubyte -> r15 single-def +; V00 arg0 [V00,T04] ( 4, 4 ) ref -> rdi class-hnd single-def +; V01 arg1 [V01,T06] ( 3, 2.50) struct ( 8) r14 single-def +; V02 arg2 [V02,T05] ( 3, 3 ) ubyte -> r15 single-def ; V03 arg3 [V03,T00] ( 4, 10 ) ref -> rbx class-hnd single-def ; V04 loc0 [V04,T01] ( 9, 11 ) ref -> [rbp-0x30] class-hnd EH-live spill-single-def -; V05 loc1 [V05 ] ( 5, 10 ) struct ( 8) [rbp-0x20] do-not-enreg[XSR] multireg-ret addr-exposed -; V06 loc2 [V06,T02] ( 2, 8 ) int -> rax +; V05 loc1 [V05,T02] ( 5, 10 ) struct ( 8) [rbp-0x20] do-not-enreg[SR] multireg-ret +; V06 loc2 [V06,T03] ( 2, 8 ) int -> rax ;* V07 loc3 [V07 ] ( 0, 0 ) ref -> zero-ref class-hnd -; V08 loc4 [V08 ] ( 2, 2 ) struct ( 8) [rbp-0x28] do-not-enreg[S] +;* V08 loc4 [V08 ] ( 0, 0 ) struct ( 8) zero-ref do-not-enreg[S] ;# V09 OutArgs [V09 ] ( 1, 1 ) struct ( 0) [rsp+0x00] do-not-enreg[XS] addr-exposed "OutgoingArgSpace" -; V10 tmp1 [V10,T06] ( 3, 3 ) ref -> r15 class-hnd exact single-def "Single-def Box Helper" +; V10 tmp1 [V10 ] ( 3, 3 ) struct ( 8) [rbp-0x28] do-not-enreg[SF] "Nullable tmp" ; V11 tmp2 [V11,T13] ( 2, 0 ) ref -> rbx class-hnd "impSpillSpecialSideEff" ; V12 tmp3 [V12,T10] ( 3, 0 ) ref -> r15 class-hnd exact "dup spill" ; V13 tmp4 [V13,T11] ( 3, 0 ) ref -> rbx class-hnd exact "NewObj constructor temp" ; V14 tmp5 [V14,T12] ( 3, 0 ) ref -> rbx class-hnd exact single-def "NewObj constructor temp" -; V15 tmp6 [V15,T07] ( 2, 2 ) ubyte -> [rbp-0x28] do-not-enreg[] "field V08.hasValue (fldOffset=0x0)" P-DEP -; V16 tmp7 [V16,T08] ( 2, 2 ) int -> [rbp-0x24] do-not-enreg[] "field V08.value (fldOffset=0x4)" P-DEP -; V17 tmp8 [V17,T14] ( 2, 0 ) ref -> rsi single-def "argument with side effect" -; V18 PSPSym [V18,T09] ( 1, 1 ) long -> [rbp-0x40] do-not-enreg[V] "PSPSym" +;* V15 tmp6 [V15 ] ( 0, 0 ) ubyte -> zero-ref do-not-enreg[] "field V08.hasValue (fldOffset=0x0)" P-DEP +;* V16 tmp7 [V16 ] ( 0, 0 ) int -> zero-ref do-not-enreg[] "field V08.value (fldOffset=0x4)" P-DEP +; V17 tmp8 [V17,T07] ( 3, 2.50) ubyte -> [rbp-0x28] do-not-enreg[] "field V10.hasValue (fldOffset=0x0)" P-DEP +; V18 tmp9 [V18,T08] ( 2, 2 ) int -> [rbp-0x24] do-not-enreg[] "field V10.value (fldOffset=0x4)" P-DEP +; V19 tmp10 [V19,T14] ( 2, 0 ) ref -> rsi single-def "argument with side effect" +; V20 PSPSym [V20,T09] ( 1, 1 ) long -> [rbp-0x40] do-not-enreg[V] "PSPSym" ; ; Lcl frame size = 40 G_M34696_IG01: push rbp push r15 push r14 push rbx sub rsp, 40 lea rbp, [rsp+0x40] mov qword ptr [rbp-0x40], rsp mov r14, rsi mov r15d, edx mov rbx, rcx ;; size=28 bbWeight=1 PerfScore 6.50 G_M34696_IG02: mov rax, qword ptr [rdi] mov rax, qword ptr [rax+0x48] call [rax]System.Linq.ParallelQuery`1[int]:GetEnumerator():System.Collections.Generic.IEnumerator`1[int]:this mov rdi, rax mov gword ptr [rbp-0x30], rdi ;; size=16 bbWeight=1 PerfScore 8.25 G_M34696_IG03: test r15b, r15b je SHORT G_M34696_IG07 ;; size=5 bbWeight=1 PerfScore 1.25 G_M34696_IG04: mov qword ptr [rbp-0x20], r14 ;; size=4 bbWeight=0.50 PerfScore 0.50 G_M34696_IG05: mov r11, 0xD1FFAB1E ; function address call [r11]System.Collections.IEnumerator:MoveNext():ubyte:this test eax, eax - je G_M34696_IG10 + je G_M34696_IG11 ;; size=21 bbWeight=1 PerfScore 4.50 G_M34696_IG06: mov rdi, gword ptr [rbp-0x30] mov r11, 0xD1FFAB1E ; code for System.Collections.Generic.IEnumerator`1[int]:get_Current():int:this call [r11]System.Collections.Generic.IEnumerator`1[int]:get_Current():int:this jmp SHORT G_M34696_IG08 ;; size=19 bbWeight=4 PerfScore 25.00 G_M34696_IG07: mov r11, 0xD1FFAB1E ; code for System.Collections.IEnumerator:MoveNext():ubyte:this call [r11]System.Collections.IEnumerator:MoveNext():ubyte:this test eax, eax - je SHORT G_M34696_IG11 - mov rdi, 0xD1FFAB1E ; System.Int32 - call CORINFO_HELP_NEWSFAST - mov r15, rax + je SHORT G_M34696_IG10 + mov byte ptr [rbp-0x28], 1 mov rdi, gword ptr [rbp-0x30] mov r11, 0xD1FFAB1E ; code for System.Collections.Generic.IEnumerator`1[int]:get_Current():int:this call [r11]System.Collections.Generic.IEnumerator`1[int]:get_Current():int:this - mov dword ptr [r15+0x08], eax - mov rdx, r15 - lea rdi, [rbp-0x20] - mov rsi, 0xD1FFAB1E ; System.Nullable`1[int] - call CORINFO_HELP_UNBOX_NULLABLE + mov dword ptr [rbp-0x24], eax + mov rsi, qword ptr [rbp-0x28] + mov qword ptr [rbp-0x20], rsi mov rdi, gword ptr [rbp-0x30] jmp SHORT G_M34696_IG05 - ;; size=84 bbWeight=0.50 PerfScore 8.12 + ;; size=55 bbWeight=0.50 PerfScore 7.88 G_M34696_IG08: mov rsi, qword ptr [rbp-0x20] mov edx, eax mov rdi, gword ptr [rbx+0x08] call [rbx+0x18]System.Func`3[System.Nullable`1[int],int,System.Nullable`1[int]]:Invoke(System.Nullable`1[int],int):System.Nullable`1[int]:this mov qword ptr [rbp-0x20], rax ;; size=17 bbWeight=4 PerfScore 29.00 G_M34696_IG09: mov rdi, gword ptr [rbp-0x30] mov r11, 0xD1FFAB1E ; code for System.Collections.IEnumerator:MoveNext():ubyte:this call [r11]System.Collections.IEnumerator:MoveNext():ubyte:this test eax, eax - jne G_M34696_IG06 - ;; size=25 bbWeight=4 PerfScore 22.00 + jne SHORT G_M34696_IG06 + jmp SHORT G_M34696_IG11 + ;; size=23 bbWeight=4 PerfScore 30.00 G_M34696_IG10: - mov rdi, qword ptr [rbp-0x20] - mov qword ptr [rbp-0x28], rdi - jmp SHORT G_M34696_IG12 - ;; size=10 bbWeight=1 PerfScore 4.00 -G_M34696_IG11: mov rdi, 0xD1FFAB1E ; System.InvalidOperationException call CORINFO_HELP_NEWSFAST mov rbx, rax mov rax, 0xD1FFAB1E ; code for System.SR:get_NoElements():System.String call [rax]System.SR:get_NoElements():System.String mov rsi, rax mov rdi, rbx mov rax, 0xD1FFAB1E ; code for System.InvalidOperationException:.ctor(System.String):this call [rax]System.InvalidOperationException:.ctor(System.String):this mov rdi, rbx call CORINFO_HELP_THROW int3 ;; size=57 bbWeight=0 PerfScore 0.00 -G_M34696_IG12: +G_M34696_IG11: mov rdi, gword ptr [rbp-0x30] mov r11, 0xD1FFAB1E ; code for System.IDisposable:Dispose():this call [r11]System.IDisposable:Dispose():this - mov rax, qword ptr [rbp-0x28] + mov rax, qword ptr [rbp-0x20] ;; size=21 bbWeight=1 PerfScore 5.25 -G_M34696_IG13: +G_M34696_IG12: add rsp, 40 pop rbx pop r14 pop r15 pop rbp ret ;; size=11 bbWeight=1 PerfScore 3.25 -G_M34696_IG14: +G_M34696_IG13: push rbp push r15 push r14 push rbx push rax mov rbp, qword ptr [rdi] mov qword ptr [rsp], rbp lea rbp, [rbp+0x40] ;; size=18 bbWeight=0 PerfScore 0.00 -G_M34696_IG15: +G_M34696_IG14: mov rbx, rsi mov rdi, 0xD1FFAB1E ; System.Exception[] mov esi, 1 call CORINFO_HELP_NEWARR_1_OBJ mov r15, rax lea rdi, bword ptr [r15+0x10] mov rsi, rbx call CORINFO_HELP_ASSIGN_REF mov rdi, 0xD1FFAB1E ; System.AggregateException call CORINFO_HELP_NEWSFAST mov rbx, rax mov rdi, rbx mov rsi, r15 mov rax, 0xD1FFAB1E ; code for System.AggregateException:.ctor(System.Exception[]):this call [rax]System.AggregateException:.ctor(System.Exception[]):this mov rdi, rbx call CORINFO_HELP_THROW int3 ;; size=83 bbWeight=0 PerfScore 0.00 -G_M34696_IG16: +G_M34696_IG15: push rbp push r15 push r14 push rbx push rax mov rbp, qword ptr [rdi] mov qword ptr [rsp], rbp lea rbp, [rbp+0x40] ;; size=18 bbWeight=0 PerfScore 0.00 -G_M34696_IG17: +G_M34696_IG16: cmp gword ptr [rbp-0x30], 0 - je SHORT G_M34696_IG18 + je SHORT G_M34696_IG17 mov rdi, gword ptr [rbp-0x30] mov r11, 0xD1FFAB1E ; code for System.IDisposable:Dispose():this call [r11]System.IDisposable:Dispose():this ;; size=24 bbWeight=0 PerfScore 0.00 -G_M34696_IG18: +G_M34696_IG17: nop ;; size=1 bbWeight=0 PerfScore 0.00 -G_M34696_IG19: +G_M34696_IG18: add rsp, 8 pop rbx pop r14 pop r15 pop rbp ret ;; size=11 bbWeight=0 PerfScore 0.00 -; Total bytes of code 473, prolog size 28, PerfScore 117.62, instruction count 124, allocated bytes for code 473 (MethodHash=3f127877) for method System.Linq.ParallelEnumerable:PerformSequentialAggregation[int,System.Nullable`1[int]](System.Linq.ParallelQuery`1[int],System.Nullable`1[int],ubyte,System.Func`3[System.Nullable`1[int],int,System.Nullable`1[int]]):System.Nullable`1[int] (FullOpts) +; Total bytes of code 432, prolog size 28, PerfScore 121.38, instruction count 118, allocated bytes for code 432 (MethodHash=3f127877) for method System.Linq.ParallelEnumerable:PerformSequentialAggregation[int,System.Nullable`1[int]](System.Linq.ParallelQuery`1[int],System.Nullable`1[int],ubyte,System.Func`3[System.Nullable`1[int],int,System.Nullable`1[int]]):System.Nullable`1[int] (FullOpts) ```
-41 (-69.49 % of base) - System.Linq.ParallelQuery`1+<>c__1`1[int,System.Nullable`1[int]]:b__1_0(int):System.Nullable`1[int]:this ```diff ; Assembly listing for method System.Linq.ParallelQuery`1+<>c__1`1[int,System.Nullable`1[int]]:b__1_0(int):System.Nullable`1[int]:this (FullOpts) ; Emitting BLENDED_CODE for X64 with AVX512 - Unix ; FullOpts code ; optimized code ; rsp based frame ; partially interruptible ; No PGO data ; Final local variable assignments ; ;* V00 this [V00 ] ( 0, 0 ) ref -> zero-ref this class-hnd single-def c__1`1[int,System.Nullable`1[int]]> -; V01 arg1 [V01,T01] ( 3, 3 ) int -> rbx single-def +; V01 arg1 [V01,T00] ( 3, 3 ) int -> rsi single-def ;# V02 OutArgs [V02 ] ( 1, 1 ) struct ( 0) [rsp+0x00] do-not-enreg[XS] addr-exposed "OutgoingArgSpace" -; V03 tmp1 [V03,T00] ( 3, 6 ) ref -> rax class-hnd exact single-def "Single-def Box Helper" -; V04 tmp2 [V04 ] ( 2, 4 ) struct ( 8) [rsp+0x08] do-not-enreg[XS] addr-exposed "pseudo return buffer" +; V03 tmp1 [V03 ] ( 3, 6 ) struct ( 8) [rsp+0x00] do-not-enreg[SF] "Nullable tmp" +; V04 tmp2 [V04,T01] ( 3, 5 ) ubyte -> [rsp+0x00] do-not-enreg[] "field V03.hasValue (fldOffset=0x0)" P-DEP +; V05 tmp3 [V05,T02] ( 2, 4 ) int -> [rsp+0x04] do-not-enreg[] "field V03.value (fldOffset=0x4)" P-DEP ; -; Lcl frame size = 16 +; Lcl frame size = 8 G_M62803_IG01: - push rbx - sub rsp, 16 - mov ebx, esi - ;; size=7 bbWeight=1 PerfScore 1.50 + push rax + ;; size=1 bbWeight=1 PerfScore 1.00 G_M62803_IG02: - mov rdi, 0xD1FFAB1E ; System.Int32 - call CORINFO_HELP_NEWSFAST - mov dword ptr [rax+0x08], ebx - mov rdx, rax - lea rdi, [rsp+0x08] - mov rsi, 0xD1FFAB1E ; System.Nullable`1[int] - call CORINFO_HELP_UNBOX_NULLABLE - mov rax, qword ptr [rsp+0x08] - ;; size=46 bbWeight=1 PerfScore 5.25 + mov byte ptr [rsp], 1 + mov dword ptr [rsp+0x04], esi + mov rax, qword ptr [rsp] + ;; size=12 bbWeight=1 PerfScore 3.00 G_M62803_IG03: - add rsp, 16 - pop rbx + add rsp, 8 ret - ;; size=6 bbWeight=1 PerfScore 1.75 + ;; size=5 bbWeight=1 PerfScore 1.25 -; Total bytes of code 59, prolog size 5, PerfScore 8.50, instruction count 14, allocated bytes for code 59 (MethodHash=b7b90aac) for method System.Linq.ParallelQuery`1+<>c__1`1[int,System.Nullable`1[int]]:b__1_0(int):System.Nullable`1[int]:this (FullOpts) +; Total bytes of code 18, prolog size 1, PerfScore 5.25, instruction count 6, allocated bytes for code 18 (MethodHash=b7b90aac) for method System.Linq.ParallelQuery`1+<>c__1`1[int,System.Nullable`1[int]]:b__1_0(int):System.Nullable`1[int]:this (FullOpts) ```
-41 (-69.49 % of base) - System.Linq.ParallelQuery`1+<>c__2`1[int,System.Nullable`1[int]]:b__2_1(int):System.Nullable`1[int]:this ```diff ; Assembly listing for method System.Linq.ParallelQuery`1+<>c__2`1[int,System.Nullable`1[int]]:b__2_1(int):System.Nullable`1[int]:this (FullOpts) ; Emitting BLENDED_CODE for X64 with AVX512 - Unix ; FullOpts code ; optimized code ; rsp based frame ; partially interruptible ; No PGO data ; Final local variable assignments ; ;* V00 this [V00 ] ( 0, 0 ) ref -> zero-ref this class-hnd single-def c__2`1[int,System.Nullable`1[int]]> -; V01 arg1 [V01,T01] ( 3, 3 ) int -> rbx single-def +; V01 arg1 [V01,T00] ( 3, 3 ) int -> rsi single-def ;# V02 OutArgs [V02 ] ( 1, 1 ) struct ( 0) [rsp+0x00] do-not-enreg[XS] addr-exposed "OutgoingArgSpace" -; V03 tmp1 [V03,T00] ( 3, 6 ) ref -> rax class-hnd exact single-def "Single-def Box Helper" -; V04 tmp2 [V04 ] ( 2, 4 ) struct ( 8) [rsp+0x08] do-not-enreg[XS] addr-exposed "pseudo return buffer" +; V03 tmp1 [V03 ] ( 3, 6 ) struct ( 8) [rsp+0x00] do-not-enreg[SF] "Nullable tmp" +; V04 tmp2 [V04,T01] ( 3, 5 ) ubyte -> [rsp+0x00] do-not-enreg[] "field V03.hasValue (fldOffset=0x0)" P-DEP +; V05 tmp3 [V05,T02] ( 2, 4 ) int -> [rsp+0x04] do-not-enreg[] "field V03.value (fldOffset=0x4)" P-DEP ; -; Lcl frame size = 16 +; Lcl frame size = 8 G_M34502_IG01: - push rbx - sub rsp, 16 - mov ebx, esi - ;; size=7 bbWeight=1 PerfScore 1.50 + push rax + ;; size=1 bbWeight=1 PerfScore 1.00 G_M34502_IG02: - mov rdi, 0xD1FFAB1E ; System.Int32 - call CORINFO_HELP_NEWSFAST - mov dword ptr [rax+0x08], ebx - mov rdx, rax - lea rdi, [rsp+0x08] - mov rsi, 0xD1FFAB1E ; System.Nullable`1[int] - call CORINFO_HELP_UNBOX_NULLABLE - mov rax, qword ptr [rsp+0x08] - ;; size=46 bbWeight=1 PerfScore 5.25 + mov byte ptr [rsp], 1 + mov dword ptr [rsp+0x04], esi + mov rax, qword ptr [rsp] + ;; size=12 bbWeight=1 PerfScore 3.00 G_M34502_IG03: - add rsp, 16 - pop rbx + add rsp, 8 ret - ;; size=6 bbWeight=1 PerfScore 1.75 + ;; size=5 bbWeight=1 PerfScore 1.25 -; Total bytes of code 59, prolog size 5, PerfScore 8.50, instruction count 14, allocated bytes for code 59 (MethodHash=eae17939) for method System.Linq.ParallelQuery`1+<>c__2`1[int,System.Nullable`1[int]]:b__2_1(int):System.Nullable`1[int]:this (FullOpts) +; Total bytes of code 18, prolog size 1, PerfScore 5.25, instruction count 6, allocated bytes for code 18 (MethodHash=eae17939) for method System.Linq.ParallelQuery`1+<>c__2`1[int,System.Nullable`1[int]]:b__2_1(int):System.Nullable`1[int]:this (FullOpts) ```
-14 (-27.45 % of base) - System.Data.SortExpressionBuilder`1+<>c__DisplayClass10_0`1[int,System.Nullable`1[int]]:b__0(System.Nullable`1[int]):System.Object:this ```diff ; Assembly listing for method System.Data.SortExpressionBuilder`1+<>c__DisplayClass10_0`1[int,System.Nullable`1[int]]:b__0(System.Nullable`1[int]):System.Object:this (FullOpts) ; Emitting BLENDED_CODE for X64 with AVX512 - Unix ; FullOpts code ; optimized code ; rsp based frame -; partially interruptible +; fully interruptible ; No PGO data ; Final local variable assignments ; -; V00 this [V00,T01] ( 3, 3 ) ref -> rdi this class-hnd single-def c__DisplayClass10_0`1[int,System.Nullable`1[int]]> -; V01 arg1 [V01 ] ( 3, 3 ) struct ( 8) [rsp+0x08] do-not-enreg[XS] addr-exposed single-def +; V00 this [V00,T02] ( 3, 3 ) ref -> rdi this class-hnd single-def c__DisplayClass10_0`1[int,System.Nullable`1[int]]> +; V01 arg1 [V01,T00] ( 4, 4 ) struct ( 8) [rsp+0x00] do-not-enreg[SF] single-def ;# V02 OutArgs [V02 ] ( 1, 1 ) struct ( 0) [rsp+0x00] do-not-enreg[XS] addr-exposed "OutgoingArgSpace" -; V03 tmp1 [V03,T02] ( 2, 4 ) int -> rsi "argument with side effect" -; V04 tmp2 [V04,T00] ( 3, 6 ) ref -> rbx single-def "argument with side effect" +; V03 tmp1 [V03,T01] ( 3, 6 ) ref -> rax class-hnd single-def "impAppendStmt" ; -; Lcl frame size = 16 +; Lcl frame size = 8 G_M23122_IG01: - push rbx - sub rsp, 16 - mov qword ptr [rsp+0x08], rsi - ;; size=10 bbWeight=1 PerfScore 2.25 + push rax + mov qword ptr [rsp], rsi + ;; size=5 bbWeight=1 PerfScore 2.00 G_M23122_IG02: - mov rbx, gword ptr [rdi+0x08] - lea rsi, [rsp+0x08] - mov rdi, 0xD1FFAB1E ; System.Nullable`1[int] - call CORINFO_HELP_BOX_NULLABLE - mov esi, dword ptr [rax+0x08] - mov rdi, gword ptr [rbx+0x08] - call [rbx+0x18]System.Func`2[int,System.__Canon]:Invoke(int):System.__Canon:this - nop - ;; size=35 bbWeight=1 PerfScore 11.00 + mov rax, gword ptr [rdi+0x08] + cmp byte ptr [rsp], 0 + je SHORT G_M23122_IG04 + mov esi, dword ptr [rsp+0x04] + mov rdi, gword ptr [rax+0x08] + ;; size=18 bbWeight=1 PerfScore 8.00 G_M23122_IG03: - add rsp, 16 - pop rbx - ret - ;; size=6 bbWeight=1 PerfScore 1.75 + add rsp, 8 + tail.jmp [rax+0x18]System.Func`2[int,System.__Canon]:Invoke(int):System.__Canon:this + ;; size=8 bbWeight=1 PerfScore 2.25 +G_M23122_IG04: + call CORINFO_HELP_THROWNULLREF + int3 + ;; size=6 bbWeight=0 PerfScore 0.00 -; Total bytes of code 51, prolog size 5, PerfScore 15.00, instruction count 14, allocated bytes for code 51 (MethodHash=4128a5ad) for method System.Data.SortExpressionBuilder`1+<>c__DisplayClass10_0`1[int,System.Nullable`1[int]]:b__0(System.Nullable`1[int]):System.Object:this (FullOpts) +; Total bytes of code 37, prolog size 5, PerfScore 12.25, instruction count 11, allocated bytes for code 37 (MethodHash=4128a5ad) for method System.Data.SortExpressionBuilder`1+<>c__DisplayClass10_0`1[int,System.Nullable`1[int]]:b__0(System.Nullable`1[int]):System.Object:this (FullOpts) ```
-14 (-27.45 % of base) - System.Data.SortExpressionBuilder`1+<>c__DisplayClass10_0`1[int,System.Nullable`1[int]]:b__1(System.Nullable`1[int]):System.Object:this ```diff ; Assembly listing for method System.Data.SortExpressionBuilder`1+<>c__DisplayClass10_0`1[int,System.Nullable`1[int]]:b__1(System.Nullable`1[int]):System.Object:this (FullOpts) ; Emitting BLENDED_CODE for X64 with AVX512 - Unix ; FullOpts code ; optimized code ; rsp based frame -; partially interruptible +; fully interruptible ; No PGO data ; Final local variable assignments ; -; V00 this [V00,T01] ( 3, 3 ) ref -> rdi this class-hnd single-def c__DisplayClass10_0`1[int,System.Nullable`1[int]]> -; V01 arg1 [V01 ] ( 3, 3 ) struct ( 8) [rsp+0x08] do-not-enreg[XS] addr-exposed single-def +; V00 this [V00,T02] ( 3, 3 ) ref -> rdi this class-hnd single-def c__DisplayClass10_0`1[int,System.Nullable`1[int]]> +; V01 arg1 [V01,T00] ( 4, 4 ) struct ( 8) [rsp+0x00] do-not-enreg[SF] single-def ;# V02 OutArgs [V02 ] ( 1, 1 ) struct ( 0) [rsp+0x00] do-not-enreg[XS] addr-exposed "OutgoingArgSpace" -; V03 tmp1 [V03,T02] ( 2, 4 ) int -> rsi "argument with side effect" -; V04 tmp2 [V04,T00] ( 3, 6 ) ref -> rbx single-def "argument with side effect" +; V03 tmp1 [V03,T01] ( 3, 6 ) ref -> rax class-hnd single-def "impAppendStmt" ; -; Lcl frame size = 16 +; Lcl frame size = 8 G_M9395_IG01: - push rbx - sub rsp, 16 - mov qword ptr [rsp+0x08], rsi - ;; size=10 bbWeight=1 PerfScore 2.25 + push rax + mov qword ptr [rsp], rsi + ;; size=5 bbWeight=1 PerfScore 2.00 G_M9395_IG02: - mov rbx, gword ptr [rdi+0x08] - lea rsi, [rsp+0x08] - mov rdi, 0xD1FFAB1E ; System.Nullable`1[int] - call CORINFO_HELP_BOX_NULLABLE - mov esi, dword ptr [rax+0x08] - mov rdi, gword ptr [rbx+0x08] - call [rbx+0x18]System.Func`2[int,System.__Canon]:Invoke(int):System.__Canon:this - nop - ;; size=35 bbWeight=1 PerfScore 11.00 + mov rax, gword ptr [rdi+0x08] + cmp byte ptr [rsp], 0 + je SHORT G_M9395_IG04 + mov esi, dword ptr [rsp+0x04] + mov rdi, gword ptr [rax+0x08] + ;; size=18 bbWeight=1 PerfScore 8.00 G_M9395_IG03: - add rsp, 16 - pop rbx - ret - ;; size=6 bbWeight=1 PerfScore 1.75 + add rsp, 8 + tail.jmp [rax+0x18]System.Func`2[int,System.__Canon]:Invoke(int):System.__Canon:this + ;; size=8 bbWeight=1 PerfScore 2.25 +G_M9395_IG04: + call CORINFO_HELP_THROWNULLREF + int3 + ;; size=6 bbWeight=0 PerfScore 0.00 -; Total bytes of code 51, prolog size 5, PerfScore 15.00, instruction count 14, allocated bytes for code 51 (MethodHash=70cfdb4c) for method System.Data.SortExpressionBuilder`1+<>c__DisplayClass10_0`1[int,System.Nullable`1[int]]:b__1(System.Nullable`1[int]):System.Object:this (FullOpts) +; Total bytes of code 37, prolog size 5, PerfScore 12.25, instruction count 11, allocated bytes for code 37 (MethodHash=70cfdb4c) for method System.Data.SortExpressionBuilder`1+<>c__DisplayClass10_0`1[int,System.Nullable`1[int]]:b__1(System.Nullable`1[int]):System.Object:this (FullOpts) ```
MihuBot commented 1 month ago

@EgorBo