Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[JitDiff X64] MihaZupan/runtime/multiab #753

Open
MihuBot opened this issue Oct 24, 2024 · 3 comments
Open

[JitDiff X64] MihaZupan/runtime/multiab #753

MihuBot opened this issue Oct 24, 2024 · 3 comments

Comments

@MihuBot
Copy link
Owner

MihuBot commented Oct 24, 2024

Job completed in 19 minutes 5 seconds.
https://github.com/MihaZupan/runtime/tree/multiab

Diffs

Found 264 files with textual diffs.

Summary of Code Size diffs:
(Lower is better)

Total bytes of base: 39563404
Total bytes of diff: 39563418
Total bytes of delta: 14 (0.00 % of base)
Total relative delta: -0.99
    diff is a regression.
    relative diff is an improvement.


Total byte diff includes 28 bytes from reconciling methods
	Base had    0 unique methods,        0 unique bytes
	Diff had    4 unique methods,       28 unique bytes

Top file regressions (bytes):
          21 : System.Net.Quic.dasm (0.01 % of base)

Top file improvements (bytes):
          -7 : System.Net.Http.dasm (-0.00 % of base)

2 total files with Code Size differences (1 improved, 1 regressed), 257 unchanged.

Top method regressions (bytes):
          53 (12.41 % of base) : System.Net.Http.dasm - System.Net.Http.Http2Connection+Http2Stream:TryReadFromBuffer(System.Span`1[ubyte],ubyte):System.ValueTuple`2[ubyte,int]:this (FullOpts)
          52 (10.77 % of base) : System.Net.Quic.dasm - System.Net.Quic.ReceiveBuffers:CopyTo(System.Memory`1[ubyte],byref,byref):int:this (FullOpts)
           7 (Infinity of base) : System.Net.Quic.dasm - System.Net.MultiArrayBuffer:get_ActiveLength():int:this (FullOpts) (0 base, 1 diff methods)
           7 (Infinity of base) : System.Net.Http.dasm - System.Net.MultiArrayBuffer:get_ActiveLength():int:this (FullOpts) (0 base, 1 diff methods)
           7 (Infinity of base) : System.Net.Quic.dasm - System.Net.MultiArrayBuffer:get_AvailableLength():int:this (FullOpts) (0 base, 1 diff methods)
           7 (Infinity of base) : System.Net.Http.dasm - System.Net.MultiArrayBuffer:get_AvailableLength():int:this (FullOpts) (0 base, 1 diff methods)

Top method improvements (bytes):
         -38 (-8.10 % of base) : System.Net.Http.dasm - System.Net.Http.Http2Connection+Http2Stream:OnResponseData(System.ReadOnlySpan`1[ubyte],ubyte):this (FullOpts)
         -16 (-40.00 % of base) : System.Net.Quic.dasm - System.Net.MultiArrayBuffer:EnsureAvailableSpace(int):this (FullOpts)
         -16 (-40.00 % of base) : System.Net.Http.dasm - System.Net.MultiArrayBuffer:EnsureAvailableSpace(int):this (FullOpts)
         -11 (-15.07 % of base) : System.Net.Quic.dasm - System.Net.MultiArrayBuffer:Discard(int):this (FullOpts)
         -11 (-15.07 % of base) : System.Net.Http.dasm - System.Net.MultiArrayBuffer:Discard(int):this (FullOpts)
          -9 (-1.24 % of base) : System.Net.Quic.dasm - System.Net.MultiArrayBuffer:GrowAvailableSpace(int):this (FullOpts)
          -9 (-1.24 % of base) : System.Net.Http.dasm - System.Net.MultiArrayBuffer:GrowAvailableSpace(int):this (FullOpts)
          -9 (-1.85 % of base) : System.Net.Quic.dasm - System.Net.Quic.ReceiveBuffers:CopyFrom(System.ReadOnlySpan`1[Microsoft.Quic.QUIC_BUFFER],int,ubyte):int:this (FullOpts)

Top method regressions (percentages):
           7 (Infinity of base) : System.Net.Quic.dasm - System.Net.MultiArrayBuffer:get_ActiveLength():int:this (FullOpts) (0 base, 1 diff methods)
           7 (Infinity of base) : System.Net.Http.dasm - System.Net.MultiArrayBuffer:get_ActiveLength():int:this (FullOpts) (0 base, 1 diff methods)
           7 (Infinity of base) : System.Net.Quic.dasm - System.Net.MultiArrayBuffer:get_AvailableLength():int:this (FullOpts) (0 base, 1 diff methods)
           7 (Infinity of base) : System.Net.Http.dasm - System.Net.MultiArrayBuffer:get_AvailableLength():int:this (FullOpts) (0 base, 1 diff methods)
          53 (12.41 % of base) : System.Net.Http.dasm - System.Net.Http.Http2Connection+Http2Stream:TryReadFromBuffer(System.Span`1[ubyte],ubyte):System.ValueTuple`2[ubyte,int]:this (FullOpts)
          52 (10.77 % of base) : System.Net.Quic.dasm - System.Net.Quic.ReceiveBuffers:CopyTo(System.Memory`1[ubyte],byref,byref):int:this (FullOpts)

Top method improvements (percentages):
         -16 (-40.00 % of base) : System.Net.Quic.dasm - System.Net.MultiArrayBuffer:EnsureAvailableSpace(int):this (FullOpts)
         -16 (-40.00 % of base) : System.Net.Http.dasm - System.Net.MultiArrayBuffer:EnsureAvailableSpace(int):this (FullOpts)
         -11 (-15.07 % of base) : System.Net.Quic.dasm - System.Net.MultiArrayBuffer:Discard(int):this (FullOpts)
         -11 (-15.07 % of base) : System.Net.Http.dasm - System.Net.MultiArrayBuffer:Discard(int):this (FullOpts)
         -38 (-8.10 % of base) : System.Net.Http.dasm - System.Net.Http.Http2Connection+Http2Stream:OnResponseData(System.ReadOnlySpan`1[ubyte],ubyte):this (FullOpts)
          -9 (-1.85 % of base) : System.Net.Quic.dasm - System.Net.Quic.ReceiveBuffers:CopyFrom(System.ReadOnlySpan`1[Microsoft.Quic.QUIC_BUFFER],int,ubyte):int:this (FullOpts)
          -9 (-1.24 % of base) : System.Net.Quic.dasm - System.Net.MultiArrayBuffer:GrowAvailableSpace(int):this (FullOpts)
          -9 (-1.24 % of base) : System.Net.Http.dasm - System.Net.MultiArrayBuffer:GrowAvailableSpace(int):this (FullOpts)

14 total methods with Code Size differences (8 improved, 6 regressed), 232649 unchanged.

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

Artifacts:

@MihuBot
Copy link
Owner Author

MihuBot commented Oct 24, 2024

Top method regressions

53 (12.41 % of base) - System.Net.Http.Http2Connection+Http2Stream:TryReadFromBuffer(System.Span`1[ubyte],ubyte):System.ValueTuple`2[ubyte,int]:this
 ; Assembly listing for method System.Net.Http.Http2Connection+Http2Stream:TryReadFromBuffer(System.Span`1[ubyte],ubyte):System.ValueTuple`2[ubyte,int]:this (FullOpts)
 ; Emitting BLENDED_CODE for X64 with AVX - Unix
 ; FullOpts code
 ; optimized code
 ; rbp based frame
 ; fully interruptible
 ; No PGO data
-; 0 inlinees with PGO data; 9 single block inlinees; 5 inlinees without PGO data
+; 0 inlinees with PGO data; 11 single block inlinees; 6 inlinees without PGO data
 ; Final local variable assignments
 ;
 ;  V00 this         [V00,T00] ( 13,  8.50)     ref  ->  [rbp-0x40]  this class-hnd EH-live single-def <System.Net.Http.Http2Connection+Http2Stream>
 ;* V01 arg1         [V01    ] (  0,  0   )  struct (16) zero-ref    multireg-arg ld-addr-op single-def <System.Span`1[ubyte]>
-;  V02 arg2         [V02,T04] (  3,  2.50)   ubyte  ->  r15         single-def
-;* V03 loc0         [V03,T28] (  0,  0   )     ref  ->  zero-ref    class-hnd exact EH-live single-def <System.Net.Http.Http2Connection+Http2Stream>
+;  V02 arg2         [V02,T05] (  3,  2.50)   ubyte  ->  r15         single-def
+;* V03 loc0         [V03,T31] (  0,  0   )     ref  ->  zero-ref    class-hnd exact EH-live single-def <System.Net.Http.Http2Connection+Http2Stream>
 ;  V04 loc1         [V04    ] (  5,  4   )   ubyte  ->  [rbp-0x20]  do-not-enreg[X] addr-exposed ld-addr-op
 ;* V05 loc2         [V05    ] (  0,  0   )  struct (16) zero-ref    ld-addr-op <System.Net.MultiMemory>
 ;* V06 loc3         [V06    ] (  0,  0   )     int  ->  zero-ref   
 ;  V07 loc4         [V07    ] (  4,  2   )  struct (16) [rbp-0x30]  do-not-enreg[XS] must-init addr-exposed ld-addr-op <System.Net.MultiMemory>
 ;  V08 loc5         [V08    ] (  7,  4   )  struct ( 8) [rbp-0x38]  do-not-enreg[S] <System.ValueTuple`2[ubyte,int]>
 ;# V09 OutArgs      [V09    ] (  1,  1   )  struct ( 0) [rsp+0x00]  do-not-enreg[XS] addr-exposed "OutgoingArgSpace"
 ;* V10 tmp1         [V10    ] (  0,  0   )  struct ( 8) zero-ref    ld-addr-op "NewObj constructor temp" <System.ValueTuple`2[ubyte,int]>
 ;* V11 tmp2         [V11    ] (  0,  0   )  struct ( 8) zero-ref    ld-addr-op "NewObj constructor temp" <System.ValueTuple`2[ubyte,int]>
 ;* V12 tmp3         [V12    ] (  0,  0   )     int  ->  zero-ref    "impAppendStmt"
 ;* V13 tmp4         [V13    ] (  0,  0   )  struct ( 8) zero-ref    ld-addr-op "NewObj constructor temp" <System.ValueTuple`2[ubyte,int]>
-;  V14 tmp5         [V14,T02] (  3,  6   )   byref  ->  rsi         single-def "Inlining Arg"
-;  V15 tmp6         [V15,T08] (  3,  3   )   byref  ->  rsi         single-def "Inlining Arg"
-;* V16 tmp7         [V16    ] (  0,  0   )  struct (16) zero-ref    ld-addr-op "NewObj constructor temp" <System.Net.MultiMemory>
-;  V17 tmp8         [V17,T09] (  3,  3   )     int  ->  rsi         "Inlining Arg"
-;  V18 tmp9         [V18,T13] (  2,  2   )     ref  ->  rax         class-hnd single-def "Inlining Arg" <ubyte[][]>
-;  V19 tmp10        [V19,T14] (  2,  2   )     int  ->  rcx         "Inlining Arg"
-;  V20 tmp11        [V20,T06] (  6,  3   )     int  ->  r15         "Inline return value spill temp"
+;  V14 tmp5         [V14,T03] (  3,  6   )   byref  ->  rsi         single-def "Inlining Arg"
+;  V15 tmp6         [V15,T09] (  3,  3   )   byref  ->  rsi         single-def "Inlining Arg"
+;  V16 tmp7         [V16,T15] (  2,  2   )     ref  ->  rax         class-hnd single-def "impAppendStmt" <ubyte[][]>
+;  V17 tmp8         [V17,T16] (  2,  2   )     int  ->  rcx         "impAppendStmt"
+;* V18 tmp9         [V18    ] (  0,  0   )  struct (16) zero-ref    ld-addr-op "NewObj constructor temp" <System.Net.MultiMemory>
+;  V19 tmp10        [V19,T10] (  3,  3   )     int  ->  rsi         "Inlining Arg"
+;  V20 tmp11        [V20,T06] (  7,  3.50)     int  ->  r15         "Inline return value spill temp"
 ;* V21 tmp12        [V21    ] (  0,  0   )     int  ->  zero-ref    "Inlining Arg"
 ;* V22 tmp13        [V22    ] (  0,  0   )     int  ->  zero-ref    "Inline stloc first use temp"
 ;* V23 tmp14        [V23    ] (  0,  0   )     int  ->  zero-ref    "Inline stloc first use temp"
-;  V24 tmp15        [V24,T27] (  3,  0   )     ref  ->  rbx         class-hnd exact single-def "NewObj constructor temp" <System.IndexOutOfRangeException>
+;  V24 tmp15        [V24,T30] (  3,  0   )     ref  ->  rbx         class-hnd exact single-def "NewObj constructor temp" <System.IndexOutOfRangeException>
 ;* V25 tmp16        [V25    ] (  0,  0   )  struct (16) zero-ref    ld-addr-op "NewObj constructor temp" <System.Net.MultiMemory>
 ;* V26 tmp17        [V26    ] (  0,  0   )     ref  ->  zero-ref    class-hnd single-def "Inlining Arg" <ubyte[][]>
 ;* V27 tmp18        [V27    ] (  0,  0   )     int  ->  zero-ref    "Inlining Arg"
-;  V28 tmp19        [V28,T01] (  8,  8   )   byref  ->  rdx         single-def "Inlining Arg"
-;* V29 tmp20        [V29    ] (  0,  0   )   byref  ->  zero-ref    "Inlining Arg"
-;* V30 tmp21        [V30    ] (  0,  0   )   ubyte  ->  zero-ref    "Inlining Arg"
-;  V31 tmp22        [V31,T05] (  2,  1.50)   byref  ->  r14         single-def "field V01._reference (fldOffset=0x0)" P-INDEP
-;  V32 tmp23        [V32,T03] (  4,  2.50)     int  ->  rbx         single-def "field V01._length (fldOffset=0x8)" P-INDEP
-;* V33 tmp24        [V33    ] (  0,  0   )     ref  ->  zero-ref    single-def "field V05._blocks (fldOffset=0x0)" P-INDEP
-;* V34 tmp25        [V34    ] (  0,  0   )     int  ->  zero-ref    "field V05._start (fldOffset=0x8)" P-INDEP
-;* V35 tmp26        [V35    ] (  0,  0   )     int  ->  zero-ref    "field V05._length (fldOffset=0xc)" P-INDEP
-;  V36 tmp27        [V36    ] (  2,  1   )     ref  ->  [rbp-0x30]  do-not-enreg[X] addr-exposed "field V07._blocks (fldOffset=0x0)" P-DEP
-;  V37 tmp28        [V37    ] (  2,  1   )     int  ->  [rbp-0x28]  do-not-enreg[X] addr-exposed "field V07._start (fldOffset=0x8)" P-DEP
-;  V38 tmp29        [V38    ] (  2,  1   )     int  ->  [rbp-0x24]  do-not-enreg[X] addr-exposed "field V07._length (fldOffset=0xc)" P-DEP
-;  V39 tmp30        [V39,T11] (  4,  2.50)     int  ->  [rbp-0x38]  do-not-enreg[] "field V08.Item2 (fldOffset=0x0)" P-DEP
-;  V40 tmp31        [V40,T12] (  4,  2.50)   ubyte  ->  [rbp-0x34]  do-not-enreg[] "field V08.Item1 (fldOffset=0x4)" P-DEP
-;* V41 tmp32        [V41,T22] (  0,  0   )     int  ->  zero-ref    "field V10.Item2 (fldOffset=0x0)" P-INDEP
-;* V42 tmp33        [V42,T23] (  0,  0   )   ubyte  ->  zero-ref    "field V10.Item1 (fldOffset=0x4)" P-INDEP
-;* V43 tmp34        [V43,T24] (  0,  0   )     int  ->  zero-ref    "field V11.Item2 (fldOffset=0x0)" P-INDEP
-;* V44 tmp35        [V44,T25] (  0,  0   )   ubyte  ->  zero-ref    "field V11.Item1 (fldOffset=0x4)" P-INDEP
-;  V45 tmp36        [V45,T20] (  2,  1   )     int  ->  r15         "field V13.Item2 (fldOffset=0x0)" P-INDEP
-;* V46 tmp37        [V46,T26] (  0,  0   )   ubyte  ->  zero-ref    "field V13.Item1 (fldOffset=0x4)" P-INDEP
-;  V47 tmp38        [V47,T15] (  3,  1.50)     ref  ->  rax         "field V16._blocks (fldOffset=0x0)" P-INDEP
-;  V48 tmp39        [V48,T17] (  3,  1.50)     int  ->  rcx         "field V16._start (fldOffset=0x8)" P-INDEP
-;  V49 tmp40        [V49,T10] (  5,  2.50)     int  ->  rsi         "field V16._length (fldOffset=0xc)" P-INDEP
-;  V50 tmp41        [V50,T16] (  3,  1.50)     ref  ->  rax         "field V25._blocks (fldOffset=0x0)" P-INDEP
-;  V51 tmp42        [V51,T18] (  3,  1.50)     int  ->  rcx         "field V25._start (fldOffset=0x8)" P-INDEP
-;  V52 tmp43        [V52,T19] (  3,  1.50)     int  ->  rsi         "field V25._length (fldOffset=0xc)" P-INDEP
-;  V53 PSPSym       [V53,T21] (  1,  1   )    long  ->  [rbp-0x50]  do-not-enreg[V] "PSPSym"
-;  V54 cse0         [V54,T07] (  4,  3   )     int  ->  rdx         "CSE #02: moderate"
+;  V28 tmp19        [V28,T02] (  7,  7   )   byref  ->  rax         single-def "Inlining Arg"
+;* V29 tmp20        [V29    ] (  0,  0   )     int  ->  zero-ref    "Inline stloc first use temp"
+;  V30 tmp21        [V30,T22] (  2,  1   )     int  ->  rcx         "Inline stloc first use temp"
+;* V31 tmp22        [V31    ] (  0,  0   )     int  ->  zero-ref    "Inline stloc first use temp"
+;  V32 tmp23        [V32,T01] (  8,  8   )   byref  ->  rdx         single-def "Inlining Arg"
+;* V33 tmp24        [V33    ] (  0,  0   )   byref  ->  zero-ref    "Inlining Arg"
+;* V34 tmp25        [V34    ] (  0,  0   )   ubyte  ->  zero-ref    "Inlining Arg"
+;  V35 tmp26        [V35,T07] (  2,  1.50)   byref  ->  r14         single-def "field V01._reference (fldOffset=0x0)" P-INDEP
+;  V36 tmp27        [V36,T04] (  4,  2.50)     int  ->  rbx         single-def "field V01._length (fldOffset=0x8)" P-INDEP
+;* V37 tmp28        [V37    ] (  0,  0   )     ref  ->  zero-ref    single-def "field V05._blocks (fldOffset=0x0)" P-INDEP
+;* V38 tmp29        [V38    ] (  0,  0   )     int  ->  zero-ref    "field V05._start (fldOffset=0x8)" P-INDEP
+;* V39 tmp30        [V39    ] (  0,  0   )     int  ->  zero-ref    "field V05._length (fldOffset=0xc)" P-INDEP
+;  V40 tmp31        [V40    ] (  2,  1   )     ref  ->  [rbp-0x30]  do-not-enreg[X] addr-exposed "field V07._blocks (fldOffset=0x0)" P-DEP
+;  V41 tmp32        [V41    ] (  2,  1   )     int  ->  [rbp-0x28]  do-not-enreg[X] addr-exposed "field V07._start (fldOffset=0x8)" P-DEP
+;  V42 tmp33        [V42    ] (  2,  1   )     int  ->  [rbp-0x24]  do-not-enreg[X] addr-exposed "field V07._length (fldOffset=0xc)" P-DEP
+;  V43 tmp34        [V43,T12] (  4,  2.50)     int  ->  [rbp-0x38]  do-not-enreg[] "field V08.Item2 (fldOffset=0x0)" P-DEP
+;  V44 tmp35        [V44,T13] (  4,  2.50)   ubyte  ->  [rbp-0x34]  do-not-enreg[] "field V08.Item1 (fldOffset=0x4)" P-DEP
+;* V45 tmp36        [V45,T25] (  0,  0   )     int  ->  zero-ref    "field V10.Item2 (fldOffset=0x0)" P-INDEP
+;* V46 tmp37        [V46,T26] (  0,  0   )   ubyte  ->  zero-ref    "field V10.Item1 (fldOffset=0x4)" P-INDEP
+;* V47 tmp38        [V47,T27] (  0,  0   )     int  ->  zero-ref    "field V11.Item2 (fldOffset=0x0)" P-INDEP
+;* V48 tmp39        [V48,T28] (  0,  0   )   ubyte  ->  zero-ref    "field V11.Item1 (fldOffset=0x4)" P-INDEP
+;  V49 tmp40        [V49,T23] (  2,  1   )     int  ->  r15         "field V13.Item2 (fldOffset=0x0)" P-INDEP
+;* V50 tmp41        [V50,T29] (  0,  0   )   ubyte  ->  zero-ref    "field V13.Item1 (fldOffset=0x4)" P-INDEP
+;  V51 tmp42        [V51,T17] (  3,  1.50)     ref  ->  rax         "field V18._blocks (fldOffset=0x0)" P-INDEP
+;  V52 tmp43        [V52,T19] (  3,  1.50)     int  ->  rcx         "field V18._start (fldOffset=0x8)" P-INDEP
+;  V53 tmp44        [V53,T11] (  5,  2.50)     int  ->  rsi         "field V18._length (fldOffset=0xc)" P-INDEP
+;  V54 tmp45        [V54,T18] (  3,  1.50)     ref  ->  rax         "field V25._blocks (fldOffset=0x0)" P-INDEP
+;  V55 tmp46        [V55,T20] (  3,  1.50)     int  ->  rcx         "field V25._start (fldOffset=0x8)" P-INDEP
+;  V56 tmp47        [V56,T21] (  3,  1.50)     int  ->  rsi         "field V25._length (fldOffset=0xc)" P-INDEP
+;  V57 PSPSym       [V57,T24] (  1,  1   )    long  ->  [rbp-0x50]  do-not-enreg[V] "PSPSym"
+;  V58 cse0         [V58,T14] (  4,  2   )     int  ->  rsi         "CSE #04: moderate"
+;  V59 cse1         [V59,T08] (  4,  3   )     int  ->  rdx         "CSE #02: moderate"
 ;
 ; Lcl frame size = 56
 
 G_M513_IG01:
        push     rbp
        push     r15
        push     r14
        push     rbx
        sub      rsp, 56
        lea      rbp, [rsp+0x50]
        xor      eax, eax
        mov      qword ptr [rbp-0x30], rax
        mov      qword ptr [rbp-0x50], rsp
        mov      gword ptr [rbp-0x40], rdi
        mov      r14, rsi
        mov      ebx, edx
        mov      r15d, ecx
 						;; size=37 bbWeight=1 PerfScore 8.75
 G_M513_IG02:
        xor      esi, esi
        mov      dword ptr [rbp-0x20], esi
 						;; size=5 bbWeight=1 PerfScore 1.25
 G_M513_IG03:
        cmp      byte  ptr [rbp-0x20], 0
-       jne      G_M513_IG15
+       jne      G_M513_IG17
        lea      rsi, [rbp-0x20]
        call     System.Threading.Monitor:ReliableEnter(System.Object,byref)
        mov      rdi, gword ptr [rbp-0x40]
        mov      rax, 0xD1FFAB1E      ; code for System.Net.Http.Http2Connection+Http2Stream:CheckResponseBodyState():this
        call     [rax]System.Net.Http.Http2Connection+Http2Stream:CheckResponseBodyState():this
        mov      rdi, gword ptr [rbp-0x40]
        lea      rsi, bword ptr [rdi+0x68]
        mov      edx, dword ptr [rsi+0x0C]
        cmp      edx, dword ptr [rsi+0x10]
        jne      SHORT G_M513_IG09
 						;; size=51 bbWeight=1 PerfScore 16.25
 G_M513_IG04:
        cmp      byte  ptr [rdi+0x5E], 5
        je       SHORT G_M513_IG08
        mov      byte  ptr [rdi+0x62], 1
        lea      rdx, bword ptr [rdi+0x90]
        inc      word  ptr [rdx+0x20]
        xor      rsi, rsi
        mov      gword ptr [rdx], rsi
 						;; size=26 bbWeight=0.50 PerfScore 4.88
 G_M513_IG05:
        mov      gword ptr [rdx+0x08], rsi
 						;; size=4 bbWeight=0.50 PerfScore 0.50
 G_M513_IG06:
        mov      gword ptr [rdx+0x10], rsi
 						;; size=4 bbWeight=0.50 PerfScore 0.50
 G_M513_IG07:
        mov      gword ptr [rdx+0x18], rsi
        mov      word  ptr [rdx+0x22], 0
        test     r15b, r15b
        sete     sil
        mov      byte  ptr [rdi+0xB4], sil
        xor      esi, esi
        mov      dword ptr [rbp-0x38], esi
        mov      byte  ptr [rbp-0x34], 1
-       jmp      G_M513_IG16
+       jmp      G_M513_IG18
 						;; size=38 bbWeight=0.50 PerfScore 4.25
 G_M513_IG08:
        xor      esi, esi
        mov      dword ptr [rbp-0x38], esi
        mov      byte  ptr [rbp-0x34], 0
-       jmp      G_M513_IG16
+       jmp      G_M513_IG18
 						;; size=14 bbWeight=0.50 PerfScore 2.12
 G_M513_IG09:
        lea      rsi, bword ptr [rdi+0x68]
        mov      rax, gword ptr [rsi]
        mov      ecx, edx
        mov      esi, dword ptr [rsi+0x10]
        sub      esi, edx
        je       SHORT G_M513_IG10
        jmp      SHORT G_M513_IG11
 						;; size=18 bbWeight=0.50 PerfScore 4.00
 G_M513_IG10:
        xor      rax, rax
        xor      ecx, ecx
        xor      esi, esi
 						;; size=6 bbWeight=0.50 PerfScore 0.38
 G_M513_IG11:
        cmp      ebx, esi
        mov      r15d, esi
        cmovle   r15d, ebx
        cmp      r15d, esi
-       ja       SHORT G_M513_IG14
+       ja       G_M513_IG16
        test     r15d, r15d
        je       SHORT G_M513_IG12
        mov      esi, r15d
        jmp      SHORT G_M513_IG13
-						;; size=24 bbWeight=0.50 PerfScore 2.75
+						;; size=28 bbWeight=0.50 PerfScore 2.75
 G_M513_IG12:
        xor      rax, rax
        xor      ecx, ecx
        xor      esi, esi
 						;; size=6 bbWeight=0.50 PerfScore 0.38
 G_M513_IG13:
        mov      gword ptr [rbp-0x30], rax
        mov      dword ptr [rbp-0x28], ecx
        mov      dword ptr [rbp-0x24], esi
        mov      rsi, r14
        mov      edx, ebx
        lea      rdi, [rbp-0x30]
        mov      rax, 0xD1FFAB1E      ; code for System.Net.MultiMemory:CopyTo(System.Span`1[ubyte]):this
        call     [rax]System.Net.MultiMemory:CopyTo(System.Span`1[ubyte]):this
        mov      rdi, gword ptr [rbp-0x40]
-       add      rdi, 104
-       mov      esi, r15d
-       mov      rax, 0xD1FFAB1E      ; code for System.Net.MultiArrayBuffer:Discard(int):this
-       call     [rax]System.Net.MultiArrayBuffer:Discard(int):this
+       lea      rax, bword ptr [rdi+0x68]
+       mov      edx, dword ptr [rax+0x10]
+       mov      esi, dword ptr [rax+0x0C]
+       sub      edx, esi
+       cmp      edx, r15d
+       je       SHORT G_M513_IG14
+       mov      ecx, esi
+       shr      ecx, 14
+       add      esi, r15d
+       mov      dword ptr [rax+0x0C], esi
+       mov      edx, dword ptr [rax+0x0C]
+       shr      edx, 14
+       mov      rdi, rax
+       mov      esi, ecx
+       mov      rax, 0xD1FFAB1E      ; code for System.Net.MultiArrayBuffer:FreeBlocks(uint,uint):this
+       call     [rax]System.Net.MultiArrayBuffer:FreeBlocks(uint,uint):this
+       jmp      SHORT G_M513_IG15
+						;; size=88 bbWeight=0.50 PerfScore 12.25
+G_M513_IG14:
+       mov      rdi, rax
+       mov      rax, 0xD1FFAB1E      ; code for System.Net.MultiArrayBuffer:DiscardAll():this
+       call     [rax]System.Net.MultiArrayBuffer:DiscardAll():this
+						;; size=15 bbWeight=0.50 PerfScore 1.75
+G_M513_IG15:
        mov      dword ptr [rbp-0x38], r15d
        mov      byte  ptr [rbp-0x34], 0
        mov      rdi, gword ptr [rbp-0x40]
-       jmp      SHORT G_M513_IG16
-						;; size=68 bbWeight=0.50 PerfScore 8.50
-G_M513_IG14:
+       jmp      SHORT G_M513_IG18
+						;; size=14 bbWeight=0.50 PerfScore 2.50
+G_M513_IG16:
        mov      rdi, 0xD1FFAB1E      ; System.IndexOutOfRangeException
        call     CORINFO_HELP_NEWSFAST
        mov      rbx, rax
        mov      rdi, rbx
        mov      rax, 0xD1FFAB1E      ; code for System.IndexOutOfRangeException:.ctor():this
        call     [rax]System.IndexOutOfRangeException:.ctor():this
        mov      rdi, rbx
        call     CORINFO_HELP_THROW
        int3     
 						;; size=42 bbWeight=0 PerfScore 0.00
-G_M513_IG15:
+G_M513_IG17:
        mov      rax, 0xD1FFAB1E      ; code for System.Threading.Monitor:ThrowLockTakenException()
        call     [rax]System.Threading.Monitor:ThrowLockTakenException()
        int3     
 						;; size=13 bbWeight=0 PerfScore 0.00
-G_M513_IG16:
+G_M513_IG18:
        cmp      byte  ptr [rbp-0x20], 0
-       je       SHORT G_M513_IG18
+       je       SHORT G_M513_IG20
 						;; size=6 bbWeight=1 PerfScore 3.00
-G_M513_IG17:
+G_M513_IG19:
        call     System.Threading.Monitor:Exit(System.Object)
 						;; size=5 bbWeight=0.50 PerfScore 0.50
-G_M513_IG18:
+G_M513_IG20:
        mov      rax, qword ptr [rbp-0x38]
 						;; size=4 bbWeight=1 PerfScore 1.00
-G_M513_IG19:
+G_M513_IG21:
        add      rsp, 56
        pop      rbx
        pop      r14
        pop      r15
        pop      rbp
        ret      
 						;; size=11 bbWeight=1 PerfScore 3.25
-G_M513_IG20:
+G_M513_IG22:
        push     rbp
        push     r15
        push     r14
        push     rbx
        push     rax
        mov      rbp, qword ptr [rdi]
        mov      qword ptr [rsp], rbp
        lea      rbp, [rbp+0x50]
 						;; size=18 bbWeight=0 PerfScore 0.00
-G_M513_IG21:
+G_M513_IG23:
        cmp      byte  ptr [rbp-0x20], 0
-       je       SHORT G_M513_IG22
+       je       SHORT G_M513_IG24
        mov      rdi, gword ptr [rbp-0x40]
        call     System.Threading.Monitor:Exit(System.Object)
 						;; size=15 bbWeight=0 PerfScore 0.00
-G_M513_IG22:
+G_M513_IG24:
        nop      
 						;; size=1 bbWeight=0 PerfScore 0.00
-G_M513_IG23:
+G_M513_IG25:
        add      rsp, 8
        pop      rbx
        pop      r14
        pop      r15
        pop      rbp
        ret      
 						;; size=11 bbWeight=0 PerfScore 0.00
 
-; Total bytes of code 427, prolog size 37, PerfScore 62.25, instruction count 129, allocated bytes for code 427 (MethodHash=a249fdfe) for method System.Net.Http.Http2Connection+Http2Stream:TryReadFromBuffer(System.Span`1[ubyte],ubyte):System.ValueTuple`2[ubyte,int]:this (FullOpts)
+; Total bytes of code 480, prolog size 37, PerfScore 70.25, instruction count 145, allocated bytes for code 480 (MethodHash=a249fdfe) for method System.Net.Http.Http2Connection+Http2Stream:TryReadFromBuffer(System.Span`1[ubyte],ubyte):System.ValueTuple`2[ubyte,int]:this (FullOpts)
 ; ============================================================
52 (10.77 % of base) - System.Net.Quic.ReceiveBuffers:CopyTo(System.Memory`1[ubyte],byref,byref):int:this
 ; Assembly listing for method System.Net.Quic.ReceiveBuffers:CopyTo(System.Memory`1[ubyte],byref,byref):int:this (FullOpts)
 ; Emitting BLENDED_CODE for X64 with AVX - Unix
 ; FullOpts code
 ; optimized code
 ; rbp based frame
 ; fully interruptible
 ; No PGO data
-; 0 inlinees with PGO data; 10 single block inlinees; 6 inlinees without PGO data
+; 0 inlinees with PGO data; 12 single block inlinees; 7 inlinees without PGO data
 ; Final local variable assignments
 ;
-;  V00 this         [V00,T00] (  5,  4.50)   byref  ->  rbx         this single-def
-;  V01 arg1         [V01,T01] (  5,  4   )  struct (16) [rbp-0x38]  do-not-enreg[SFA] multireg-arg ld-addr-op single-def <System.Memory`1[ubyte]>
-;  V02 arg2         [V02,T06] (  3,  3   )   byref  ->  r15         single-def
-;  V03 arg3         [V03,T07] (  3,  3   )   byref  ->  r14         single-def
-;  V04 loc0         [V04,T21] (  4,  1.50)     ref  ->  [rbp-0x58]  class-hnd EH-live spill-single-def <System.Object>
+;  V00 this         [V00,T01] (  5,  4.50)   byref  ->  rbx         this single-def
+;  V01 arg1         [V01,T02] (  5,  4   )  struct (16) [rbp-0x38]  do-not-enreg[SFA] multireg-arg ld-addr-op single-def <System.Memory`1[ubyte]>
+;  V02 arg2         [V02,T08] (  3,  3   )   byref  ->  r15         single-def
+;  V03 arg3         [V03,T09] (  3,  3   )   byref  ->  r14         single-def
+;  V04 loc0         [V04,T23] (  4,  1.50)     ref  ->  [rbp-0x58]  class-hnd EH-live spill-single-def <System.Object>
 ;  V05 loc1         [V05    ] (  5,  4   )   ubyte  ->  [rbp-0x40]  do-not-enreg[X] addr-exposed ld-addr-op
-;  V06 loc2         [V06,T08] (  7,  4.50)     int  ->  r12        
+;  V06 loc2         [V06,T06] (  8,  5   )     int  ->  r12        
 ;* V07 loc3         [V07    ] (  0,  0   )  struct (16) zero-ref    ld-addr-op <System.Net.MultiMemory>
 ;  V08 loc4         [V08    ] (  4,  2   )  struct (16) [rbp-0x50]  do-not-enreg[XS] must-init addr-exposed ld-addr-op <System.Net.MultiMemory>
 ;* V09 loc5         [V09    ] (  0,  0   )     int  ->  zero-ref   
 ;# V10 OutArgs      [V10    ] (  1,  1   )  struct ( 0) [rsp+0x00]  do-not-enreg[XS] addr-exposed "OutgoingArgSpace"
 ;* V11 tmp1         [V11    ] (  0,  0   )   byref  ->  zero-ref    single-def
 ;* V12 tmp2         [V12    ] (  0,  0   )   byref  ->  zero-ref   
-;  V13 tmp3         [V13,T17] (  3,  2   )     int  ->  rdi        
+;  V13 tmp3         [V13,T19] (  3,  2   )     int  ->  rdi        
 ;* V14 tmp4         [V14    ] (  0,  0   )     int  ->  zero-ref    "impAppendStmt"
 ;* V15 tmp5         [V15    ] (  0,  0   )  struct (16) zero-ref    "spilled call-like call argument" <System.Span`1[ubyte]>
-;  V16 tmp6         [V16,T02] (  3,  6   )   byref  ->  rdi         single-def "Inlining Arg"
-;  V17 tmp7         [V17,T14] (  3,  3   )   byref  ->  rdi         single-def "Inlining Arg"
-;* V18 tmp8         [V18    ] (  0,  0   )  struct (16) zero-ref    ld-addr-op "NewObj constructor temp" <System.Net.MultiMemory>
-;  V19 tmp9         [V19,T15] (  3,  3   )     int  ->  rdi         "Inlining Arg"
-;  V20 tmp10        [V20,T18] (  2,  2   )     ref  ->  rdx         class-hnd single-def "Inlining Arg" <ubyte[][]>
-;  V21 tmp11        [V21,T20] (  2,  2   )     int  ->  rsi         "Inlining Arg"
-;  V22 tmp12        [V22,T30] (  2,  1   )     int  ->  r12         "Inline return value spill temp"
+;  V16 tmp6         [V16,T03] (  3,  6   )   byref  ->  rdi         single-def "Inlining Arg"
+;  V17 tmp7         [V17,T15] (  3,  3   )   byref  ->  rdi         single-def "Inlining Arg"
+;  V18 tmp8         [V18,T20] (  2,  2   )     ref  ->  rdx         class-hnd single-def "impAppendStmt" <ubyte[][]>
+;  V19 tmp9         [V19,T22] (  2,  2   )     int  ->  rsi         "impAppendStmt"
+;* V20 tmp10        [V20    ] (  0,  0   )  struct (16) zero-ref    ld-addr-op "NewObj constructor temp" <System.Net.MultiMemory>
+;  V21 tmp11        [V21,T16] (  3,  3   )     int  ->  rdi         "Inlining Arg"
+;  V22 tmp12        [V22,T32] (  2,  1   )     int  ->  r12         "Inline return value spill temp"
 ;* V23 tmp13        [V23    ] (  0,  0   )     int  ->  zero-ref    "Inlining Arg"
 ;* V24 tmp14        [V24    ] (  0,  0   )     int  ->  zero-ref    "Inline stloc first use temp"
 ;* V25 tmp15        [V25    ] (  0,  0   )     int  ->  zero-ref    "Inline stloc first use temp"
-;  V26 tmp16        [V26,T34] (  3,  0   )     ref  ->  rbx         class-hnd exact single-def "NewObj constructor temp" <System.IndexOutOfRangeException>
+;  V26 tmp16        [V26,T37] (  3,  0   )     ref  ->  rbx         class-hnd exact single-def "NewObj constructor temp" <System.IndexOutOfRangeException>
 ;* V27 tmp17        [V27    ] (  0,  0   )  struct (16) zero-ref    ld-addr-op "NewObj constructor temp" <System.Net.MultiMemory>
 ;* V28 tmp18        [V28    ] (  0,  0   )     ref  ->  zero-ref    class-hnd single-def "Inlining Arg" <ubyte[][]>
 ;* V29 tmp19        [V29    ] (  0,  0   )     int  ->  zero-ref    "Inlining Arg"
 ;* V30 tmp20        [V30    ] (  0,  0   )  struct (16) zero-ref    "Inline return value spill temp" <System.Span`1[ubyte]>
-;  V31 tmp21        [V31,T10] (  6,  3   )   byref  ->  rcx         "Inline stloc first use temp"
-;  V32 tmp22        [V32,T11] (  6,  3   )     int  ->  rdx         "Inline stloc first use temp"
-;  V33 tmp23        [V33,T09] (  7,  3.50)     ref  ->  rdi         class-hnd single-def "Inline stloc first use temp" <System.Object>
+;  V31 tmp21        [V31,T11] (  6,  3   )   byref  ->  rcx         "Inline stloc first use temp"
+;  V32 tmp22        [V32,T12] (  6,  3   )     int  ->  rdx         "Inline stloc first use temp"
+;  V33 tmp23        [V33,T10] (  7,  3.50)     ref  ->  rdi         class-hnd single-def "Inline stloc first use temp" <System.Object>
 ;* V34 tmp24        [V34    ] (  0,  0   )  struct (16) zero-ref    multireg-arg ld-addr-op "NewObj constructor temp" <System.Span`1[ubyte]>
 ;* V35 tmp25        [V35    ] (  0,  0   )     ref  ->  zero-ref    class-hnd "updating class info" <System.Buffers.MemoryManager`1[ubyte]>
 ;* V36 tmp26        [V36    ] (  0,  0   )  struct (16) zero-ref    do-not-enreg[SBR] multireg-ret "Return value temp for multireg return" <System.Span`1[ubyte]>
 ;* V37 tmp27        [V37    ] (  0,  0   )  struct (16) zero-ref    multireg-ret ld-addr-op "Inline stloc first use temp" <System.Span`1[ubyte]>
-;  V38 tmp28        [V38,T24] (  3,  1.50)    long  ->  rsi         "Inline stloc first use temp"
+;  V38 tmp28        [V38,T26] (  3,  1.50)    long  ->  rsi         "Inline stloc first use temp"
 ;* V39 tmp29        [V39    ] (  0,  0   )     int  ->  zero-ref    "Inline stloc first use temp"
 ;* V40 tmp30        [V40    ] (  0,  0   )     ref  ->  zero-ref    class-hnd single-def "updating class info" <ubyte[]>
 ;* V41 tmp31        [V41    ] (  0,  0   )     ref  ->  zero-ref    class-hnd "updating class info" <ubyte[]>
-;  V42 tmp32        [V42,T19] (  2,  2   )   byref  ->  rcx         single-def "Inlining Arg"
+;  V42 tmp32        [V42,T21] (  2,  2   )   byref  ->  rcx         single-def "Inlining Arg"
 ;* V43 tmp33        [V43    ] (  0,  0   )  struct (16) zero-ref    ld-addr-op "Inlining Arg" <System.Span`1[ubyte]>
-;  V44 tmp34        [V44,T03] (  3,  6   )   byref  ->  rdi         single-def "Inlining Arg"
-;  V45 tmp35        [V45,T04] (  3,  6   )   byref  ->  rax         single-def "Inlining Arg"
-;* V46 tmp36        [V46    ] (  0,  0   )     ref  ->  zero-ref    single-def "field V07._blocks (fldOffset=0x0)" P-INDEP
-;* V47 tmp37        [V47    ] (  0,  0   )     int  ->  zero-ref    "field V07._start (fldOffset=0x8)" P-INDEP
-;* V48 tmp38        [V48    ] (  0,  0   )     int  ->  zero-ref    "field V07._length (fldOffset=0xc)" P-INDEP
-;  V49 tmp39        [V49    ] (  2,  1   )     ref  ->  [rbp-0x50]  do-not-enreg[X] addr-exposed "field V08._blocks (fldOffset=0x0)" P-DEP
-;  V50 tmp40        [V50    ] (  2,  1   )     int  ->  [rbp-0x48]  do-not-enreg[X] addr-exposed "field V08._start (fldOffset=0x8)" P-DEP
-;  V51 tmp41        [V51    ] (  2,  1   )     int  ->  [rbp-0x44]  do-not-enreg[X] addr-exposed "field V08._length (fldOffset=0xc)" P-DEP
-;* V52 tmp42        [V52    ] (  0,  0   )   byref  ->  zero-ref    "field V15._reference (fldOffset=0x0)" P-INDEP
-;* V53 tmp43        [V53    ] (  0,  0   )     int  ->  zero-ref    "field V15._length (fldOffset=0x8)" P-INDEP
-;  V54 tmp44        [V54,T22] (  3,  1.50)     ref  ->  rdx         "field V18._blocks (fldOffset=0x0)" P-INDEP
-;  V55 tmp45        [V55,T25] (  3,  1.50)     int  ->  rsi         "field V18._start (fldOffset=0x8)" P-INDEP
-;  V56 tmp46        [V56,T16] (  5,  2.50)     int  ->  rdi         "field V18._length (fldOffset=0xc)" P-INDEP
-;  V57 tmp47        [V57,T23] (  3,  1.50)     ref  ->  rdx         "field V27._blocks (fldOffset=0x0)" P-INDEP
-;  V58 tmp48        [V58,T26] (  3,  1.50)     int  ->  rsi         "field V27._start (fldOffset=0x8)" P-INDEP
-;  V59 tmp49        [V59,T27] (  3,  1.50)     int  ->  rdi         "field V27._length (fldOffset=0xc)" P-INDEP
-;* V60 tmp50        [V60    ] (  0,  0   )   byref  ->  zero-ref    "field V30._reference (fldOffset=0x0)" P-INDEP
-;* V61 tmp51        [V61    ] (  0,  0   )     int  ->  zero-ref    "field V30._length (fldOffset=0x8)" P-INDEP
-;  V62 tmp52        [V62,T28] (  2,  1   )   byref  ->  rsi         single-def "field V34._reference (fldOffset=0x0)" P-INDEP
-;  V63 tmp53        [V63,T31] (  2,  1   )     int  ->  rdx         "field V34._length (fldOffset=0x8)" P-INDEP
-;* V64 tmp54        [V64    ] (  0,  0   )   byref  ->  zero-ref    "field V36._reference (fldOffset=0x0)" P-DEP
-;* V65 tmp55        [V65    ] (  0,  0   )     int  ->  zero-ref    "field V36._length (fldOffset=0x8)" P-DEP
-;  V66 tmp56        [V66,T29] (  2,  1   )   byref  ->  rcx         "field V37._reference (fldOffset=0x0)" P-INDEP
-;  V67 tmp57        [V67,T32] (  2,  1   )     int  ->  rdx         "field V37._length (fldOffset=0x8)" P-INDEP
-;* V68 tmp58        [V68    ] (  0,  0   )   byref  ->  zero-ref    single-def "field V43._reference (fldOffset=0x0)" P-INDEP
-;* V69 tmp59        [V69    ] (  0,  0   )     int  ->  zero-ref    "field V43._length (fldOffset=0x8)" P-INDEP
-;  V70 tmp60        [V70,T12] (  5,  3   )     int  ->  r13         "V01.[012..016)"
-;  V71 PSPSym       [V71,T33] (  1,  1   )    long  ->  [rbp-0x70]  do-not-enreg[V] "PSPSym"
-;  V72 cse0         [V72,T13] (  4,  3   )     int  ->  rcx         "CSE #02: moderate"
-;  V73 cse1         [V73,T05] (  6,  5   )   byref  ->  [rbp-0x60]  spill-single-def "CSE #01: moderate"
+;  V44 tmp34        [V44,T00] (  7,  7   )   byref  ->  rdi         single-def "Inlining Arg"
+;* V45 tmp35        [V45    ] (  0,  0   )     int  ->  zero-ref    "Inline stloc first use temp"
+;  V46 tmp36        [V46,T33] (  2,  1   )     int  ->  rax         "Inline stloc first use temp"
+;* V47 tmp37        [V47    ] (  0,  0   )     int  ->  zero-ref    "Inline stloc first use temp"
+;  V48 tmp38        [V48,T04] (  3,  6   )   byref  ->  rdi         single-def "Inlining Arg"
+;  V49 tmp39        [V49,T05] (  3,  6   )   byref  ->  rax         single-def "Inlining Arg"
+;* V50 tmp40        [V50    ] (  0,  0   )     ref  ->  zero-ref    single-def "field V07._blocks (fldOffset=0x0)" P-INDEP
+;* V51 tmp41        [V51    ] (  0,  0   )     int  ->  zero-ref    "field V07._start (fldOffset=0x8)" P-INDEP
+;* V52 tmp42        [V52    ] (  0,  0   )     int  ->  zero-ref    "field V07._length (fldOffset=0xc)" P-INDEP
+;  V53 tmp43        [V53    ] (  2,  1   )     ref  ->  [rbp-0x50]  do-not-enreg[X] addr-exposed "field V08._blocks (fldOffset=0x0)" P-DEP
+;  V54 tmp44        [V54    ] (  2,  1   )     int  ->  [rbp-0x48]  do-not-enreg[X] addr-exposed "field V08._start (fldOffset=0x8)" P-DEP
+;  V55 tmp45        [V55    ] (  2,  1   )     int  ->  [rbp-0x44]  do-not-enreg[X] addr-exposed "field V08._length (fldOffset=0xc)" P-DEP
+;* V56 tmp46        [V56    ] (  0,  0   )   byref  ->  zero-ref    "field V15._reference (fldOffset=0x0)" P-INDEP
+;* V57 tmp47        [V57    ] (  0,  0   )     int  ->  zero-ref    "field V15._length (fldOffset=0x8)" P-INDEP
+;  V58 tmp48        [V58,T24] (  3,  1.50)     ref  ->  rdx         "field V20._blocks (fldOffset=0x0)" P-INDEP
+;  V59 tmp49        [V59,T27] (  3,  1.50)     int  ->  rsi         "field V20._start (fldOffset=0x8)" P-INDEP
+;  V60 tmp50        [V60,T17] (  5,  2.50)     int  ->  rdi         "field V20._length (fldOffset=0xc)" P-INDEP
+;  V61 tmp51        [V61,T25] (  3,  1.50)     ref  ->  rdx         "field V27._blocks (fldOffset=0x0)" P-INDEP
+;  V62 tmp52        [V62,T28] (  3,  1.50)     int  ->  rsi         "field V27._start (fldOffset=0x8)" P-INDEP
+;  V63 tmp53        [V63,T29] (  3,  1.50)     int  ->  rdi         "field V27._length (fldOffset=0xc)" P-INDEP
+;* V64 tmp54        [V64    ] (  0,  0   )   byref  ->  zero-ref    "field V30._reference (fldOffset=0x0)" P-INDEP
+;* V65 tmp55        [V65    ] (  0,  0   )     int  ->  zero-ref    "field V30._length (fldOffset=0x8)" P-INDEP
+;  V66 tmp56        [V66,T30] (  2,  1   )   byref  ->  rsi         single-def "field V34._reference (fldOffset=0x0)" P-INDEP
+;  V67 tmp57        [V67,T34] (  2,  1   )     int  ->  rdx         "field V34._length (fldOffset=0x8)" P-INDEP
+;* V68 tmp58        [V68    ] (  0,  0   )   byref  ->  zero-ref    "field V36._reference (fldOffset=0x0)" P-DEP
+;* V69 tmp59        [V69    ] (  0,  0   )     int  ->  zero-ref    "field V36._length (fldOffset=0x8)" P-DEP
+;  V70 tmp60        [V70,T31] (  2,  1   )   byref  ->  rcx         "field V37._reference (fldOffset=0x0)" P-INDEP
+;  V71 tmp61        [V71,T35] (  2,  1   )     int  ->  rdx         "field V37._length (fldOffset=0x8)" P-INDEP
+;* V72 tmp62        [V72    ] (  0,  0   )   byref  ->  zero-ref    single-def "field V43._reference (fldOffset=0x0)" P-INDEP
+;* V73 tmp63        [V73    ] (  0,  0   )     int  ->  zero-ref    "field V43._length (fldOffset=0x8)" P-INDEP
+;  V74 tmp64        [V74,T13] (  5,  3   )     int  ->  r13         "V01.[012..016)"
+;  V75 PSPSym       [V75,T36] (  1,  1   )    long  ->  [rbp-0x70]  do-not-enreg[V] "PSPSym"
+;  V76 cse0         [V76,T18] (  4,  2   )     int  ->  rsi         "CSE #05: moderate"
+;  V77 cse1         [V77,T14] (  4,  3   )     int  ->  rcx         "CSE #02: moderate"
+;  V78 cse2         [V78,T07] (  6,  5   )   byref  ->  [rbp-0x60]  spill-single-def "CSE #01: moderate"
 ;
 ; Lcl frame size = 72
 
 G_M35338_IG01:
        push     rbp
        push     r15
        push     r14
        push     r13
        push     r12
        push     rbx
        sub      rsp, 72
        lea      rbp, [rsp+0x70]
        xor      eax, eax
        mov      qword ptr [rbp-0x50], rax
        mov      qword ptr [rbp-0x70], rsp
        mov      gword ptr [rbp-0x38], rsi
        mov      qword ptr [rbp-0x30], rdx
        mov      rbx, rdi
        mov      r15, rcx
        mov      r14, r8
 						;; size=46 bbWeight=1 PerfScore 11.75
 G_M35338_IG02:
        mov      rdi, gword ptr [rbx]
        mov      gword ptr [rbp-0x58], rdi
        xor      esi, esi
        mov      dword ptr [rbp-0x40], esi
        mov      r13d, dword ptr [rbp-0x2C]
 						;; size=16 bbWeight=1 PerfScore 5.25
 G_M35338_IG03:
        cmp      byte  ptr [rbp-0x40], 0
-       jne      G_M35338_IG18
+       jne      G_M35338_IG19
        lea      rsi, [rbp-0x40]
        call     System.Threading.Monitor:ReliableEnter(System.Object,byref)
        xor      r12d, r12d
        lea      rax, bword ptr [rbx+0x10]
        mov      bword ptr [rbp-0x60], rax
        mov      rdi, rax
        mov      ecx, dword ptr [rdi+0x0C]
        cmp      ecx, dword ptr [rdi+0x10]
-       je       G_M35338_IG12
+       je       G_M35338_IG13
 						;; size=45 bbWeight=1 PerfScore 12.50
 G_M35338_IG04:
        mov      rdi, rax
        mov      rdx, gword ptr [rdi]
        mov      esi, ecx
        mov      edi, dword ptr [rdi+0x10]
        sub      edi, ecx
        je       SHORT G_M35338_IG05
        jmp      SHORT G_M35338_IG06
 						;; size=17 bbWeight=0.50 PerfScore 3.88
 G_M35338_IG05:
        xor      rdx, rdx
        xor      esi, esi
        xor      edi, edi
 						;; size=6 bbWeight=0.50 PerfScore 0.38
 G_M35338_IG06:
        cmp      r13d, edi
        mov      r12d, edi
        cmovle   r12d, r13d
        cmp      r12d, edi
-       ja       G_M35338_IG17
+       ja       G_M35338_IG18
        test     r12d, r12d
        je       SHORT G_M35338_IG07
        mov      edi, r12d
        jmp      SHORT G_M35338_IG08
 						;; size=29 bbWeight=0.50 PerfScore 2.75
 G_M35338_IG07:
        xor      rdx, rdx
        xor      esi, esi
        xor      edi, edi
 						;; size=6 bbWeight=0.50 PerfScore 0.38
 G_M35338_IG08:
        mov      gword ptr [rbp-0x50], rdx
        mov      dword ptr [rbp-0x48], esi
        mov      dword ptr [rbp-0x44], edi
        xor      rcx, rcx
        xor      edx, edx
        mov      rdi, gword ptr [rbp-0x38]
        test     rdi, rdi
        je       SHORT G_M35338_IG11
        mov      rcx, qword ptr [rdi]
        test     dword ptr [rcx], 0xD1FFAB1E
        jne      SHORT G_M35338_IG09
        mov      rcx, qword ptr [rdi]
        mov      rcx, qword ptr [rcx+0x40]
        call     [rcx+0x28]System.Buffers.MemoryManager`1[ubyte]:GetSpan():System.Span`1[ubyte]:this
        mov      rcx, rax
        jmp      SHORT G_M35338_IG10
 						;; size=49 bbWeight=0.50 PerfScore 10.50
 G_M35338_IG09:
        lea      rcx, bword ptr [rdi+0x10]
        mov      edx, dword ptr [rdi+0x08]
 						;; size=7 bbWeight=0.50 PerfScore 1.25
 G_M35338_IG10:
        mov      esi, dword ptr [rbp-0x30]
        and      esi, 0xD1FFAB1E
        mov      edi, r13d
        add      rdi, rsi
        mov      edx, edx
        cmp      rdi, rdx
-       ja       SHORT G_M35338_IG16
+       ja       G_M35338_IG17
        add      rcx, rsi
        mov      edx, r13d
-						;; size=28 bbWeight=0.50 PerfScore 1.88
+						;; size=32 bbWeight=0.50 PerfScore 1.88
 G_M35338_IG11:
        mov      rsi, rcx
        lea      rdi, [rbp-0x50]
        mov      rcx, 0xD1FFAB1E      ; code for System.Net.MultiMemory:CopyTo(System.Span`1[ubyte]):this
        call     [rcx]System.Net.MultiMemory:CopyTo(System.Span`1[ubyte]):this
-       mov      rdi, bword ptr [rbp-0x60]
-       mov      esi, r12d
-       mov      rax, 0xD1FFAB1E      ; code for System.Net.MultiArrayBuffer:Discard(int):this
-       call     [rax]System.Net.MultiArrayBuffer:Discard(int):this
-       mov      rax, bword ptr [rbp-0x60]
-						;; size=42 bbWeight=0.50 PerfScore 4.75
+       mov      r13, bword ptr [rbp-0x60]
+       mov      rdi, r13
+       mov      edx, dword ptr [rdi+0x10]
+       mov      esi, dword ptr [rdi+0x0C]
+       sub      edx, esi
+       cmp      edx, r12d
+       je       SHORT G_M35338_IG12
+       mov      eax, esi
+       shr      eax, 14
+       add      esi, r12d
+       mov      dword ptr [rdi+0x0C], esi
+       mov      edx, dword ptr [rdi+0x0C]
+       shr      edx, 14
+       mov      esi, eax
+       mov      rax, 0xD1FFAB1E      ; code for System.Net.MultiArrayBuffer:FreeBlocks(uint,uint):this
+       call     [rax]System.Net.MultiArrayBuffer:FreeBlocks(uint,uint):this
+       mov      rax, r13
+       jmp      SHORT G_M35338_IG13
+						;; size=75 bbWeight=0.50 PerfScore 10.50
 G_M35338_IG12:
+       mov      rax, 0xD1FFAB1E      ; code for System.Net.MultiArrayBuffer:DiscardAll():this
+       call     [rax]System.Net.MultiArrayBuffer:DiscardAll():this
+       mov      rax, r13
+						;; size=15 bbWeight=0.50 PerfScore 1.75
+G_M35338_IG13:
        mov      rdi, rax
        mov      ecx, dword ptr [rdi+0x0C]
        cmp      ecx, dword ptr [rdi+0x10]
-       je       SHORT G_M35338_IG14
+       je       SHORT G_M35338_IG15
 						;; size=11 bbWeight=1 PerfScore 6.25
-G_M35338_IG13:
-       xor      edi, edi
-       jmp      SHORT G_M35338_IG15
-						;; size=4 bbWeight=0.50 PerfScore 1.12
 G_M35338_IG14:
+       xor      edi, edi
+       jmp      SHORT G_M35338_IG16
+						;; size=4 bbWeight=0.50 PerfScore 1.12
+G_M35338_IG15:
        movzx    rdi, byte  ptr [rbx+0x08]
 						;; size=5 bbWeight=0.50 PerfScore 1.00
-G_M35338_IG15:
+G_M35338_IG16:
        mov      byte  ptr [r15], dil
        mov      edi, dword ptr [rax+0x0C]
        cmp      edi, dword ptr [rax+0x10]
        sete     dil
        mov      byte  ptr [r14], dil
-       jmp      SHORT G_M35338_IG19
+       jmp      SHORT G_M35338_IG20
 						;; size=18 bbWeight=1 PerfScore 10.00
-G_M35338_IG16:
+G_M35338_IG17:
        mov      rax, 0xD1FFAB1E      ; code for System.ThrowHelper:ThrowArgumentOutOfRangeException()
        call     [rax]System.ThrowHelper:ThrowArgumentOutOfRangeException()
        int3     
 						;; size=13 bbWeight=0 PerfScore 0.00
-G_M35338_IG17:
+G_M35338_IG18:
        mov      rdi, 0xD1FFAB1E      ; System.IndexOutOfRangeException
        call     CORINFO_HELP_NEWSFAST
        mov      rbx, rax
        mov      rdi, rbx
        mov      rax, 0xD1FFAB1E      ; code for System.IndexOutOfRangeException:.ctor():this
        call     [rax]System.IndexOutOfRangeException:.ctor():this
        mov      rdi, rbx
        call     CORINFO_HELP_THROW
        int3     
 						;; size=42 bbWeight=0 PerfScore 0.00
-G_M35338_IG18:
+G_M35338_IG19:
        mov      rax, 0xD1FFAB1E      ; code for System.Threading.Monitor:ThrowLockTakenException()
        call     [rax]System.Threading.Monitor:ThrowLockTakenException()
        int3     
 						;; size=13 bbWeight=0 PerfScore 0.00
-G_M35338_IG19:
-       cmp      byte  ptr [rbp-0x40], 0
-       je       SHORT G_M35338_IG21
-						;; size=6 bbWeight=1 PerfScore 3.00
 G_M35338_IG20:
+       cmp      byte  ptr [rbp-0x40], 0
+       je       SHORT G_M35338_IG22
+						;; size=6 bbWeight=1 PerfScore 3.00
+G_M35338_IG21:
        mov      rdi, gword ptr [rbp-0x58]
        call     System.Threading.Monitor:Exit(System.Object)
 						;; size=9 bbWeight=0.50 PerfScore 1.00
-G_M35338_IG21:
+G_M35338_IG22:
        mov      eax, r12d
 						;; size=3 bbWeight=1 PerfScore 0.25
-G_M35338_IG22:
+G_M35338_IG23:
        add      rsp, 72
        pop      rbx
        pop      r12
        pop      r13
        pop      r14
        pop      r15
        pop      rbp
        ret      
 						;; size=15 bbWeight=1 PerfScore 4.25
-G_M35338_IG23:
+G_M35338_IG24:
        push     rbp
        push     r15
        push     r14
        push     r13
        push     r12
        push     rbx
        push     rax
        mov      rbp, qword ptr [rdi]
        mov      qword ptr [rsp], rbp
        lea      rbp, [rbp+0x70]
 						;; size=22 bbWeight=0 PerfScore 0.00
-G_M35338_IG24:
+G_M35338_IG25:
        cmp      byte  ptr [rbp-0x40], 0
-       je       SHORT G_M35338_IG25
+       je       SHORT G_M35338_IG26
        mov      rdi, gword ptr [rbp-0x58]
        call     System.Threading.Monitor:Exit(System.Object)
 						;; size=15 bbWeight=0 PerfScore 0.00
-G_M35338_IG25:
+G_M35338_IG26:
        nop      
 						;; size=1 bbWeight=0 PerfScore 0.00
-G_M35338_IG26:
+G_M35338_IG27:
        add      rsp, 8
        pop      rbx
        pop      r12
        pop      r13
        pop      r14
        pop      r15
        pop      rbp
        ret      
 						;; size=15 bbWeight=0 PerfScore 0.00
 
-; Total bytes of code 483, prolog size 46, PerfScore 82.12, instruction count 154, allocated bytes for code 483 (MethodHash=1f0175f5) for method System.Net.Quic.ReceiveBuffers:CopyTo(System.Memory`1[ubyte],byref,byref):int:this (FullOpts)
+; Total bytes of code 535, prolog size 46, PerfScore 89.62, instruction count 170, allocated bytes for code 535 (MethodHash=1f0175f5) for method System.Net.Quic.ReceiveBuffers:CopyTo(System.Memory`1[ubyte],byref,byref):int:this (FullOpts)
 ; ============================================================

@MihuBot
Copy link
Owner Author

MihuBot commented Oct 24, 2024

Top method improvements

-38 (-8.10 % of base) - System.Net.Http.Http2Connection+Http2Stream:OnResponseData(System.ReadOnlySpan`1[ubyte],ubyte):this
 ; Assembly listing for method System.Net.Http.Http2Connection+Http2Stream:OnResponseData(System.ReadOnlySpan`1[ubyte],ubyte):this (FullOpts)
 ; Emitting BLENDED_CODE for X64 with AVX - Unix
 ; FullOpts code
 ; optimized code
 ; rbp based frame
 ; fully interruptible
 ; No PGO data
-; 0 inlinees with PGO data; 11 single block inlinees; 5 inlinees without PGO data
+; 0 inlinees with PGO data; 10 single block inlinees; 3 inlinees without PGO data
 ; Final local variable assignments
 ;
 ;  V00 this         [V00,T00] ( 15, 15   )     ref  ->  [rbp-0x40]  this class-hnd EH-live single-def <System.Net.Http.Http2Connection+Http2Stream>
 ;* V01 arg1         [V01    ] (  0,  0   )  struct (16) zero-ref    multireg-arg ld-addr-op single-def <System.ReadOnlySpan`1[ubyte]>
-;  V02 arg2         [V02,T11] (  3,  3   )   ubyte  ->  r15         single-def
-;  V03 loc0         [V03,T26] (  2,  2   )   ubyte  ->  rbx        
-;* V04 loc1         [V04,T30] (  0,  0   )     ref  ->  zero-ref    class-hnd exact EH-live single-def <System.Net.Http.Http2Connection+Http2Stream>
+;  V02 arg2         [V02,T09] (  3,  3   )   ubyte  ->  r15         single-def
+;  V03 loc0         [V03,T19] (  2,  2   )   ubyte  ->  rbx        
+;* V04 loc1         [V04,T21] (  0,  0   )     ref  ->  zero-ref    class-hnd exact EH-live single-def <System.Net.Http.Http2Connection+Http2Stream>
 ;  V05 loc2         [V05    ] (  5,  5   )   ubyte  ->  [rbp-0x28]  do-not-enreg[X] addr-exposed ld-addr-op
-;  V06 loc3         [V06,T19] (  3,  3   )   ubyte  ->  r13        
-;  V07 loc4         [V07    ] (  8,  8   )  struct (16) [rbp-0x38]  do-not-enreg[XS] must-init addr-exposed ld-addr-op <System.Net.MultiMemory>
+;  V06 loc3         [V06,T14] (  3,  3   )   ubyte  ->  r13        
+;  V07 loc4         [V07    ] (  4,  4   )  struct (16) [rbp-0x38]  do-not-enreg[XS] must-init addr-exposed ld-addr-op <System.Net.MultiMemory>
 ;# V08 OutArgs      [V08    ] (  1,  1   )  struct ( 0) [rsp+0x00]  do-not-enreg[XS] addr-exposed "OutgoingArgSpace"
 ;* V09 tmp1         [V09    ] (  0,  0   )     int  ->  zero-ref    "impAppendStmt"
-;  V10 tmp2         [V10,T02] (  4,  8   )   byref  ->  rsi         single-def "Inlining Arg"
-;* V11 tmp3         [V11    ] (  0,  0   )  struct (16) zero-ref    ld-addr-op "NewObj constructor temp" <System.Net.MultiMemory>
-;  V12 tmp4         [V12,T07] (  3,  6   )     int  ->  rsi         "Inlining Arg"
-;  V13 tmp5         [V13,T12] (  2,  4   )     ref  ->  rax         class-hnd single-def "Inlining Arg" <ubyte[][]>
-;  V14 tmp6         [V14,T15] (  2,  4   )     int  ->  rdx         "Inlining Arg"
-;* V15 tmp7         [V15    ] (  0,  0   )   byref  ->  zero-ref    "Inlining Arg"
-;* V16 tmp8         [V16    ] (  0,  0   )     int  ->  zero-ref    "Inlining Arg"
-;  V17 tmp9         [V17,T03] (  4,  8   )   byref  ->  rsi         single-def "Inlining Arg"
-;* V18 tmp10        [V18    ] (  0,  0   )  struct (16) zero-ref    ld-addr-op "Inline stloc first use temp" <System.Net.MultiMemory>
-;* V19 tmp11        [V19    ] (  0,  0   )  struct (16) zero-ref    ld-addr-op "NewObj constructor temp" <System.Net.MultiMemory>
-;  V20 tmp12        [V20,T08] (  3,  6   )     int  ->  rcx         "Inlining Arg"
-;* V21 tmp13        [V21    ] (  0,  0   )     ref  ->  zero-ref    class-hnd single-def "Inlining Arg" <ubyte[][]>
-;* V22 tmp14        [V22    ] (  0,  0   )     int  ->  zero-ref    "Inlining Arg"
-;  V23 tmp15        [V23,T04] (  4,  8   )   byref  ->  rsi         single-def "Inlining Arg"
-;* V24 tmp16        [V24    ] (  0,  0   )  struct (16) zero-ref    ld-addr-op "NewObj constructor temp" <System.Net.MultiMemory>
-;  V25 tmp17        [V25,T09] (  3,  6   )     int  ->  rsi         "Inlining Arg"
-;  V26 tmp18        [V26,T13] (  2,  4   )     ref  ->  rdx         class-hnd single-def "Inlining Arg" <ubyte[][]>
-;  V27 tmp19        [V27,T16] (  2,  4   )     int  ->  rcx         "Inlining Arg"
-;* V28 tmp20        [V28    ] (  0,  0   )     int  ->  zero-ref    "Inlining Arg"
-;* V29 tmp21        [V29    ] (  0,  0   )     int  ->  zero-ref    "Inline stloc first use temp"
-;  V30 tmp22        [V30,T05] (  3,  6   )   byref  ->  r13         single-def "Inlining Arg"
-;  V31 tmp23        [V31,T06] (  3,  6   )   byref  ->  rdi         single-def "Inlining Arg"
-;  V32 tmp24        [V32,T14] (  2,  2   )   byref  ->  r14         single-def "field V01._reference (fldOffset=0x0)" P-INDEP
-;  V33 tmp25        [V33,T01] (  6,  6   )     int  ->  rbx         single-def "field V01._length (fldOffset=0x8)" P-INDEP
-;  V34 tmp26        [V34    ] (  3,  3   )     ref  ->  [rbp-0x38]  do-not-enreg[X] addr-exposed "field V07._blocks (fldOffset=0x0)" P-DEP
-;  V35 tmp27        [V35    ] (  3,  3   )     int  ->  [rbp-0x30]  do-not-enreg[X] addr-exposed "field V07._start (fldOffset=0x8)" P-DEP
-;  V36 tmp28        [V36    ] (  4,  4   )     int  ->  [rbp-0x2C]  do-not-enreg[X] addr-exposed "field V07._length (fldOffset=0xc)" P-DEP
-;  V37 tmp29        [V37,T17] (  3,  3   )     ref  ->  rax         "field V11._blocks (fldOffset=0x0)" P-INDEP
-;  V38 tmp30        [V38,T20] (  3,  3   )     int  ->  rdx         "field V11._start (fldOffset=0x8)" P-INDEP
-;  V39 tmp31        [V39,T21] (  3,  3   )     int  ->  rsi         "field V11._length (fldOffset=0xc)" P-INDEP
-;* V40 tmp32        [V40    ] (  0,  0   )     ref  ->  zero-ref    "field V18._blocks (fldOffset=0x0)" P-INDEP
-;* V41 tmp33        [V41    ] (  0,  0   )     int  ->  zero-ref    "field V18._start (fldOffset=0x8)" P-INDEP
-;* V42 tmp34        [V42    ] (  0,  0   )     int  ->  zero-ref    "field V18._length (fldOffset=0xc)" P-INDEP
-;* V43 tmp35        [V43    ] (  0,  0   )     ref  ->  zero-ref    "field V19._blocks (fldOffset=0x0)" P-INDEP
-;* V44 tmp36        [V44    ] (  0,  0   )     int  ->  zero-ref    "field V19._start (fldOffset=0x8)" P-INDEP
-;  V45 tmp37        [V45,T27] (  2,  2   )     int  ->  rcx         "field V19._length (fldOffset=0xc)" P-INDEP
-;  V46 tmp38        [V46,T18] (  3,  3   )     ref  ->  rdx         "field V24._blocks (fldOffset=0x0)" P-INDEP
-;  V47 tmp39        [V47,T22] (  3,  3   )     int  ->  rcx         "field V24._start (fldOffset=0x8)" P-INDEP
-;  V48 tmp40        [V48,T23] (  3,  3   )     int  ->  rsi         "field V24._length (fldOffset=0xc)" P-INDEP
-;  V49 PSPSym       [V49,T29] (  1,  1   )    long  ->  [rbp-0x50]  do-not-enreg[V] "PSPSym"
-;  V50 cse0         [V50,T24] (  3,  3   )     int  ->  rcx         "CSE #01: moderate"
-;  V51 cse1         [V51,T28] (  2,  2   )     int  ->  rax         "CSE #03: moderate"
-;  V52 cse2         [V52,T25] (  3,  3   )     int  ->  rax         "CSE #04: moderate"
-;  V53 cse3         [V53,T10] (  5,  5   )   byref  ->  r13         "CSE #02: moderate"
+;  V10 tmp2         [V10,T03] (  3,  6   )   byref  ->  rsi         single-def "Inlining Arg"
+;* V11 tmp3         [V11    ] (  0,  0   )   byref  ->  zero-ref    "Inlining Arg"
+;* V12 tmp4         [V12    ] (  0,  0   )     int  ->  zero-ref    "Inlining Arg"
+;  V13 tmp5         [V13,T04] (  3,  6   )   byref  ->  rsi         single-def "Inlining Arg"
+;  V14 tmp6         [V14,T02] (  4,  8   )   byref  ->  rsi         single-def "Inlining Arg"
+;  V15 tmp7         [V15,T10] (  2,  4   )     ref  ->  rdx         class-hnd single-def "impAppendStmt" <ubyte[][]>
+;  V16 tmp8         [V16,T12] (  2,  4   )     int  ->  rcx         "impAppendStmt"
+;* V17 tmp9         [V17    ] (  0,  0   )  struct (16) zero-ref    ld-addr-op "NewObj constructor temp" <System.Net.MultiMemory>
+;  V18 tmp10        [V18,T07] (  3,  6   )     int  ->  rsi         "Inlining Arg"
+;* V19 tmp11        [V19    ] (  0,  0   )     int  ->  zero-ref    "Inlining Arg"
+;* V20 tmp12        [V20    ] (  0,  0   )     int  ->  zero-ref    "Inline stloc first use temp"
+;  V21 tmp13        [V21,T05] (  3,  6   )   byref  ->  r13         single-def "Inlining Arg"
+;  V22 tmp14        [V22,T06] (  3,  6   )   byref  ->  rdi         single-def "Inlining Arg"
+;  V23 tmp15        [V23,T11] (  2,  2   )   byref  ->  r14         single-def "field V01._reference (fldOffset=0x0)" P-INDEP
+;  V24 tmp16        [V24,T01] (  6,  6   )     int  ->  rbx         single-def "field V01._length (fldOffset=0x8)" P-INDEP
+;  V25 tmp17        [V25    ] (  2,  2   )     ref  ->  [rbp-0x38]  do-not-enreg[X] addr-exposed "field V07._blocks (fldOffset=0x0)" P-DEP
+;  V26 tmp18        [V26    ] (  2,  2   )     int  ->  [rbp-0x30]  do-not-enreg[X] addr-exposed "field V07._start (fldOffset=0x8)" P-DEP
+;  V27 tmp19        [V27    ] (  2,  2   )     int  ->  [rbp-0x2C]  do-not-enreg[X] addr-exposed "field V07._length (fldOffset=0xc)" P-DEP
+;  V28 tmp20        [V28,T13] (  3,  3   )     ref  ->  rdx         "field V17._blocks (fldOffset=0x0)" P-INDEP
+;  V29 tmp21        [V29,T15] (  3,  3   )     int  ->  rcx         "field V17._start (fldOffset=0x8)" P-INDEP
+;  V30 tmp22        [V30,T16] (  3,  3   )     int  ->  rsi         "field V17._length (fldOffset=0xc)" P-INDEP
+;  V31 PSPSym       [V31,T20] (  1,  1   )    long  ->  [rbp-0x50]  do-not-enreg[V] "PSPSym"
+;  V32 cse0         [V32,T17] (  3,  3   )     int  ->  rax         "CSE #02: moderate"
+;  V33 cse1         [V33,T18] (  3,  3   )     int  ->  rax         "CSE #03: moderate"
+;  V34 cse2         [V34,T08] (  5,  5   )   byref  ->  r13         "CSE #01: moderate"
 ;
 ; Lcl frame size = 48
 
 G_M34456_IG01:
        push     rbp
        push     r15
        push     r14
        push     r13
        push     rbx
        sub      rsp, 48
        lea      rbp, [rsp+0x50]
        xor      eax, eax
        mov      qword ptr [rbp-0x38], rax
        mov      qword ptr [rbp-0x50], rsp
        mov      gword ptr [rbp-0x40], rdi
        mov      r14, rsi
        mov      ebx, edx
        mov      r15d, ecx
 						;; size=39 bbWeight=1 PerfScore 9.75
 G_M34456_IG02:
        xor      esi, esi
        mov      dword ptr [rbp-0x28], esi
 						;; size=5 bbWeight=1 PerfScore 1.25
 G_M34456_IG03:
        cmp      byte  ptr [rbp-0x28], 0
-       jne      G_M34456_IG12
+       jne      G_M34456_IG10
        lea      rsi, [rbp-0x28]
        call     System.Threading.Monitor:ReliableEnter(System.Object,byref)
        mov      rdi, gword ptr [rbp-0x40]
        movzx    r13, byte  ptr [rdi+0x5E]
        cmp      r13d, 3
-       jne      G_M34456_IG10
+       jne      G_M34456_IG08
        lea      r13, bword ptr [rdi+0x68]
        mov      rsi, r13
-       mov      rax, gword ptr [rsi]
-       mov      ecx, dword ptr [rsi+0x0C]
-       mov      edx, ecx
-       mov      esi, dword ptr [rsi+0x10]
-       sub      esi, ecx
-       je       SHORT G_M34456_IG04
-       jmp      SHORT G_M34456_IG05
-						;; size=62 bbWeight=1 PerfScore 19.00
-G_M34456_IG04:
-       xor      rax, rax
-       xor      edx, edx
-       xor      esi, esi
-						;; size=6 bbWeight=1 PerfScore 0.75
-G_M34456_IG05:
-       mov      gword ptr [rbp-0x38], rax
-       mov      dword ptr [rbp-0x30], edx
-       mov      dword ptr [rbp-0x2C], esi
-       mov      esi, ebx
-       add      esi, dword ptr [rbp-0x2C]
-       cmp      esi, dword ptr [rdi+0x84]
-       jg       G_M34456_IG13
-       mov      rsi, r13
        mov      eax, dword ptr [rsi+0x10]
+       mov      ecx, eax
+       sub      ecx, dword ptr [rsi+0x0C]
+       add      ecx, ebx
+       cmp      ecx, dword ptr [rdi+0x84]
+       jg       G_M34456_IG11
+       mov      rsi, r13
        mov      ecx, dword ptr [rsi+0x08]
        sub      ecx, eax
-       xor      eax, eax
-       test     ecx, ecx
-       cmove    ecx, eax
-       cmp      ebx, ecx
-       jle      SHORT G_M34456_IG06
+       cmp      ecx, ebx
+       jge      SHORT G_M34456_IG04
        mov      rdi, rsi
        mov      esi, ebx
        mov      rax, 0xD1FFAB1E      ; code for System.Net.MultiArrayBuffer:GrowAvailableSpace(int):this
        call     [rax]System.Net.MultiArrayBuffer:GrowAvailableSpace(int):this
-						;; size=66 bbWeight=1 PerfScore 19.50
-G_M34456_IG06:
+						;; size=96 bbWeight=1 PerfScore 26.50
+G_M34456_IG04:
        mov      rsi, r13
        mov      rdx, gword ptr [rsi]
        mov      eax, dword ptr [rsi+0x10]
        mov      ecx, eax
        mov      esi, dword ptr [rsi+0x08]
        sub      esi, eax
-       je       SHORT G_M34456_IG07
-       jmp      SHORT G_M34456_IG08
+       je       SHORT G_M34456_IG05
+       jmp      SHORT G_M34456_IG06
 						;; size=20 bbWeight=1 PerfScore 9.75
-G_M34456_IG07:
+G_M34456_IG05:
        xor      rdx, rdx
        xor      ecx, ecx
        xor      esi, esi
 						;; size=6 bbWeight=1 PerfScore 0.75
-G_M34456_IG08:
+G_M34456_IG06:
        mov      gword ptr [rbp-0x38], rdx
        mov      dword ptr [rbp-0x30], ecx
        mov      dword ptr [rbp-0x2C], esi
        mov      rsi, r14
        mov      edx, ebx
        lea      rdi, [rbp-0x38]
        mov      rax, 0xD1FFAB1E      ; code for System.Net.MultiMemory:CopyFrom(System.ReadOnlySpan`1[ubyte]):this
        call     [rax]System.Net.MultiMemory:CopyFrom(System.ReadOnlySpan`1[ubyte]):this
        add      dword ptr [r13+0x10], ebx
        test     r15b, r15b
-       je       SHORT G_M34456_IG09
+       je       SHORT G_M34456_IG07
        mov      rdi, gword ptr [rbp-0x40]
        mov      word  ptr [rdi+0x5D], 0x501
        cmp      byte  ptr [rdi+0x5C], 1
-       jne      SHORT G_M34456_IG09
+       jne      SHORT G_M34456_IG07
        cmp      byte  ptr [rdi+0x64], 0
-       jne      SHORT G_M34456_IG09
+       jne      SHORT G_M34456_IG07
        mov      rax, 0xD1FFAB1E      ; code for System.Net.Http.Http2Connection+Http2Stream:Complete():this
        call     [rax]System.Net.Http.Http2Connection+Http2Stream:Complete():this
 						;; size=74 bbWeight=1 PerfScore 24.75
-G_M34456_IG09:
+G_M34456_IG07:
        mov      rdi, gword ptr [rbp-0x40]
        movzx    rbx, byte  ptr [rdi+0x62]
        mov      byte  ptr [rdi+0x62], 0
-       jmp      SHORT G_M34456_IG14
+       jmp      SHORT G_M34456_IG12
 						;; size=14 bbWeight=1 PerfScore 6.00
-G_M34456_IG10:
+G_M34456_IG08:
        cmp      r13d, 6
-       je       SHORT G_M34456_IG16
+       je       SHORT G_M34456_IG14
 						;; size=6 bbWeight=1 PerfScore 1.25
-G_M34456_IG11:
+G_M34456_IG09:
        mov      edi, 1
        xor      rsi, rsi
        mov      rax, 0xD1FFAB1E      ; code for System.Net.Http.Http2Connection:ThrowProtocolError(int,System.String)
        call     [rax]System.Net.Http.Http2Connection:ThrowProtocolError(int,System.String)
        int3     
 						;; size=20 bbWeight=0 PerfScore 0.00
-G_M34456_IG12:
+G_M34456_IG10:
        mov      rax, 0xD1FFAB1E      ; code for System.Threading.Monitor:ThrowLockTakenException()
        call     [rax]System.Threading.Monitor:ThrowLockTakenException()
        int3     
 						;; size=13 bbWeight=0 PerfScore 0.00
-G_M34456_IG13:
+G_M34456_IG11:
        mov      edi, 3
        xor      rsi, rsi
        mov      rax, 0xD1FFAB1E      ; code for System.Net.Http.Http2Connection:ThrowProtocolError(int,System.String)
        call     [rax]System.Net.Http.Http2Connection:ThrowProtocolError(int,System.String)
        int3     
 						;; size=20 bbWeight=0 PerfScore 0.00
-G_M34456_IG14:
+G_M34456_IG12:
        cmp      byte  ptr [rbp-0x28], 0
-       je       SHORT G_M34456_IG15
+       je       SHORT G_M34456_IG13
        call     System.Threading.Monitor:Exit(System.Object)
        mov      rdi, gword ptr [rbp-0x40]
 						;; size=15 bbWeight=1 PerfScore 5.00
-G_M34456_IG15:
+G_M34456_IG13:
        test     ebx, ebx
-       je       SHORT G_M34456_IG18
+       je       SHORT G_M34456_IG16
        add      rdi, 144
        mov      byte  ptr [rdi+0x22], 1
        mov      rax, 0xD1FFAB1E      ; code for System.Threading.Tasks.Sources.ManualResetValueTaskSourceCore`1[ubyte]:SignalCompletion():this
        call     [rax]System.Threading.Tasks.Sources.ManualResetValueTaskSourceCore`1[ubyte]:SignalCompletion():this
-       jmp      SHORT G_M34456_IG18
+       jmp      SHORT G_M34456_IG16
 						;; size=29 bbWeight=1 PerfScore 7.75
-G_M34456_IG16:
+G_M34456_IG14:
        mov      rdi, rsp
 						;; size=3 bbWeight=1 PerfScore 0.25
-G_M34456_IG17:
-       call     G_M34456_IG19
+G_M34456_IG15:
+       call     G_M34456_IG17
        nop      
 						;; size=6 bbWeight=1 PerfScore 1.25
-G_M34456_IG18:
+G_M34456_IG16:
        add      rsp, 48
        pop      rbx
        pop      r13
        pop      r14
        pop      r15
        pop      rbp
        ret      
 						;; size=13 bbWeight=1 PerfScore 3.75
-G_M34456_IG19:
+G_M34456_IG17:
        push     rbp
        push     r15
        push     r14
        push     r13
        push     rbx
        sub      rsp, 16
        mov      rbp, qword ptr [rdi]
        mov      qword ptr [rsp], rbp
        lea      rbp, [rbp+0x50]
 						;; size=23 bbWeight=1 PerfScore 8.75
-G_M34456_IG20:
+G_M34456_IG18:
        cmp      byte  ptr [rbp-0x28], 0
-       je       SHORT G_M34456_IG21
+       je       SHORT G_M34456_IG19
        mov      rdi, gword ptr [rbp-0x40]
        call     System.Threading.Monitor:Exit(System.Object)
 						;; size=15 bbWeight=1 PerfScore 5.00
-G_M34456_IG21:
+G_M34456_IG19:
        nop      
 						;; size=1 bbWeight=1 PerfScore 0.25
-G_M34456_IG22:
+G_M34456_IG20:
        add      rsp, 16
        pop      rbx
        pop      r13
        pop      r14
        pop      r15
        pop      rbp
        ret      
 						;; size=13 bbWeight=1 PerfScore 3.75
 
-; Total bytes of code 469, prolog size 39, PerfScore 128.50, instruction count 147, allocated bytes for code 469 (MethodHash=ecb17967) for method System.Net.Http.Http2Connection+Http2Stream:OnResponseData(System.ReadOnlySpan`1[ubyte],ubyte):this (FullOpts)
+; Total bytes of code 431, prolog size 39, PerfScore 115.75, instruction count 132, allocated bytes for code 431 (MethodHash=ecb17967) for method System.Net.Http.Http2Connection+Http2Stream:OnResponseData(System.ReadOnlySpan`1[ubyte],ubyte):this (FullOpts)
 ; ============================================================
-16 (-40.00 % of base) - System.Net.MultiArrayBuffer:EnsureAvailableSpace(int):this
 ; Assembly listing for method System.Net.MultiArrayBuffer:EnsureAvailableSpace(int):this (FullOpts)
 ; Emitting BLENDED_CODE for X64 with AVX - Unix
 ; FullOpts code
 ; optimized code
 ; rsp based frame
-; partially interruptible
+; fully interruptible
 ; No PGO data
-; 0 inlinees with PGO data; 2 single block inlinees; 1 inlinees without PGO data
+; 0 inlinees with PGO data; 1 single block inlinees; 0 inlinees without PGO data
 ; Final local variable assignments
 ;
-;  V00 this         [V00,T00] (  6,  5.50)   byref  ->  rdi         this single-def
-;  V01 arg1         [V01,T02] (  4,  3.50)     int  ->  rsi         single-def
-;* V02 loc0         [V02    ] (  0,  0   )  struct (16) zero-ref    ld-addr-op <System.Net.MultiMemory>
-;# V03 OutArgs      [V03    ] (  1,  1   )  struct ( 0) [rsp+0x00]  do-not-enreg[XS] addr-exposed "OutgoingArgSpace"
-;* V04 tmp1         [V04    ] (  0,  0   )  struct (16) zero-ref    ld-addr-op "NewObj constructor temp" <System.Net.MultiMemory>
-;  V05 tmp2         [V05,T01] (  3,  6   )     int  ->  rcx         "Inlining Arg"
-;* V06 tmp3         [V06    ] (  0,  0   )     ref  ->  zero-ref    class-hnd single-def "Inlining Arg" <ubyte[][]>
-;* V07 tmp4         [V07    ] (  0,  0   )     int  ->  zero-ref    "Inlining Arg"
-;* V08 tmp5         [V08    ] (  0,  0   )     ref  ->  zero-ref    "field V02._blocks (fldOffset=0x0)" P-INDEP
-;* V09 tmp6         [V09    ] (  0,  0   )     int  ->  zero-ref    "field V02._start (fldOffset=0x8)" P-INDEP
-;* V10 tmp7         [V10    ] (  0,  0   )     int  ->  zero-ref    "field V02._length (fldOffset=0xc)" P-INDEP
-;* V11 tmp8         [V11    ] (  0,  0   )     ref  ->  zero-ref    "field V04._blocks (fldOffset=0x0)" P-INDEP
-;* V12 tmp9         [V12    ] (  0,  0   )     int  ->  zero-ref    "field V04._start (fldOffset=0x8)" P-INDEP
-;  V13 tmp10        [V13,T03] (  2,  2   )     int  ->  rcx         "field V04._length (fldOffset=0xc)" P-INDEP
-;  V14 cse0         [V14,T04] (  2,  2   )     int  ->  rax         "CSE #01: aggressive"
+;  V00 this         [V00,T00] (  5,  4.50)   byref  ->  rdi         this single-def
+;  V01 arg1         [V01,T01] (  4,  3.50)     int  ->  rsi         single-def
+;# V02 OutArgs      [V02    ] (  1,  1   )  struct ( 0) [rsp+0x00]  do-not-enreg[XS] addr-exposed "OutgoingArgSpace"
 ;
-; Lcl frame size = 8
+; Lcl frame size = 0
 
 G_M36835_IG01:
-       push     rax
-						;; size=1 bbWeight=1 PerfScore 1.00
+						;; size=0 bbWeight=1 PerfScore 0.00
 G_M36835_IG02:
-       cmp      dword ptr [rdi], edi
-       mov      eax, dword ptr [rdi+0x10]
-       mov      ecx, dword ptr [rdi+0x08]
-       sub      ecx, eax
-       xor      eax, eax
-       test     ecx, ecx
-       cmove    ecx, eax
-       cmp      esi, ecx
-       jle      SHORT G_M36835_IG04
-						;; size=21 bbWeight=1 PerfScore 9.25
+       mov      eax, dword ptr [rdi+0x08]
+       sub      eax, dword ptr [rdi+0x10]
+       cmp      eax, esi
+       jl       SHORT G_M36835_IG04
+						;; size=10 bbWeight=1 PerfScore 6.25
 G_M36835_IG03:
-       mov      rax, 0xD1FFAB1E      ; code for System.Net.MultiArrayBuffer:GrowAvailableSpace(int):this
-       call     [rax]System.Net.MultiArrayBuffer:GrowAvailableSpace(int):this
-						;; size=12 bbWeight=0.50 PerfScore 1.62
-G_M36835_IG04:
-       nop      
-						;; size=1 bbWeight=1 PerfScore 0.25
-G_M36835_IG05:
-       add      rsp, 8
        ret      
-						;; size=5 bbWeight=1 PerfScore 1.25
+						;; size=1 bbWeight=0.50 PerfScore 0.50
+G_M36835_IG04:
+       mov      rax, 0xD1FFAB1E      ; code for System.Net.MultiArrayBuffer:GrowAvailableSpace(int):this
+						;; size=10 bbWeight=0.50 PerfScore 0.12
+G_M36835_IG05:
+       tail.jmp [rax]System.Net.MultiArrayBuffer:GrowAvailableSpace(int):this
+						;; size=3 bbWeight=0.50 PerfScore 1.00
 
-; Total bytes of code 40, prolog size 1, PerfScore 13.38, instruction count 15, allocated bytes for code 40 (MethodHash=172f701c) for method System.Net.MultiArrayBuffer:EnsureAvailableSpace(int):this (FullOpts)
+; Total bytes of code 24, prolog size 0, PerfScore 7.88, instruction count 7, allocated bytes for code 24 (MethodHash=172f701c) for method System.Net.MultiArrayBuffer:EnsureAvailableSpace(int):this (FullOpts)
 ; ============================================================
-16 (-40.00 % of base) - System.Net.MultiArrayBuffer:EnsureAvailableSpace(int):this
 ; Assembly listing for method System.Net.MultiArrayBuffer:EnsureAvailableSpace(int):this (FullOpts)
 ; Emitting BLENDED_CODE for X64 with AVX - Unix
 ; FullOpts code
 ; optimized code
 ; rsp based frame
-; partially interruptible
+; fully interruptible
 ; No PGO data
-; 0 inlinees with PGO data; 2 single block inlinees; 1 inlinees without PGO data
+; 0 inlinees with PGO data; 1 single block inlinees; 0 inlinees without PGO data
 ; Final local variable assignments
 ;
-;  V00 this         [V00,T00] (  6,  5.50)   byref  ->  rdi         this single-def
-;  V01 arg1         [V01,T02] (  4,  3.50)     int  ->  rsi         single-def
-;* V02 loc0         [V02    ] (  0,  0   )  struct (16) zero-ref    ld-addr-op <System.Net.MultiMemory>
-;# V03 OutArgs      [V03    ] (  1,  1   )  struct ( 0) [rsp+0x00]  do-not-enreg[XS] addr-exposed "OutgoingArgSpace"
-;* V04 tmp1         [V04    ] (  0,  0   )  struct (16) zero-ref    ld-addr-op "NewObj constructor temp" <System.Net.MultiMemory>
-;  V05 tmp2         [V05,T01] (  3,  6   )     int  ->  rcx         "Inlining Arg"
-;* V06 tmp3         [V06    ] (  0,  0   )     ref  ->  zero-ref    class-hnd single-def "Inlining Arg" <ubyte[][]>
-;* V07 tmp4         [V07    ] (  0,  0   )     int  ->  zero-ref    "Inlining Arg"
-;* V08 tmp5         [V08    ] (  0,  0   )     ref  ->  zero-ref    "field V02._blocks (fldOffset=0x0)" P-INDEP
-;* V09 tmp6         [V09    ] (  0,  0   )     int  ->  zero-ref    "field V02._start (fldOffset=0x8)" P-INDEP
-;* V10 tmp7         [V10    ] (  0,  0   )     int  ->  zero-ref    "field V02._length (fldOffset=0xc)" P-INDEP
-;* V11 tmp8         [V11    ] (  0,  0   )     ref  ->  zero-ref    "field V04._blocks (fldOffset=0x0)" P-INDEP
-;* V12 tmp9         [V12    ] (  0,  0   )     int  ->  zero-ref    "field V04._start (fldOffset=0x8)" P-INDEP
-;  V13 tmp10        [V13,T03] (  2,  2   )     int  ->  rcx         "field V04._length (fldOffset=0xc)" P-INDEP
-;  V14 cse0         [V14,T04] (  2,  2   )     int  ->  rax         "CSE #01: aggressive"
+;  V00 this         [V00,T00] (  5,  4.50)   byref  ->  rdi         this single-def
+;  V01 arg1         [V01,T01] (  4,  3.50)     int  ->  rsi         single-def
+;# V02 OutArgs      [V02    ] (  1,  1   )  struct ( 0) [rsp+0x00]  do-not-enreg[XS] addr-exposed "OutgoingArgSpace"
 ;
-; Lcl frame size = 8
+; Lcl frame size = 0
 
 G_M36835_IG01:
-       push     rax
-						;; size=1 bbWeight=1 PerfScore 1.00
+						;; size=0 bbWeight=1 PerfScore 0.00
 G_M36835_IG02:
-       cmp      dword ptr [rdi], edi
-       mov      eax, dword ptr [rdi+0x10]
-       mov      ecx, dword ptr [rdi+0x08]
-       sub      ecx, eax
-       xor      eax, eax
-       test     ecx, ecx
-       cmove    ecx, eax
-       cmp      esi, ecx
-       jle      SHORT G_M36835_IG04
-						;; size=21 bbWeight=1 PerfScore 9.25
+       mov      eax, dword ptr [rdi+0x08]
+       sub      eax, dword ptr [rdi+0x10]
+       cmp      eax, esi
+       jl       SHORT G_M36835_IG04
+						;; size=10 bbWeight=1 PerfScore 6.25
 G_M36835_IG03:
-       mov      rax, 0xD1FFAB1E      ; code for System.Net.MultiArrayBuffer:GrowAvailableSpace(int):this
-       call     [rax]System.Net.MultiArrayBuffer:GrowAvailableSpace(int):this
-						;; size=12 bbWeight=0.50 PerfScore 1.62
-G_M36835_IG04:
-       nop      
-						;; size=1 bbWeight=1 PerfScore 0.25
-G_M36835_IG05:
-       add      rsp, 8
        ret      
-						;; size=5 bbWeight=1 PerfScore 1.25
+						;; size=1 bbWeight=0.50 PerfScore 0.50
+G_M36835_IG04:
+       mov      rax, 0xD1FFAB1E      ; code for System.Net.MultiArrayBuffer:GrowAvailableSpace(int):this
+						;; size=10 bbWeight=0.50 PerfScore 0.12
+G_M36835_IG05:
+       tail.jmp [rax]System.Net.MultiArrayBuffer:GrowAvailableSpace(int):this
+						;; size=3 bbWeight=0.50 PerfScore 1.00
 
-; Total bytes of code 40, prolog size 1, PerfScore 13.38, instruction count 15, allocated bytes for code 40 (MethodHash=172f701c) for method System.Net.MultiArrayBuffer:EnsureAvailableSpace(int):this (FullOpts)
+; Total bytes of code 24, prolog size 0, PerfScore 7.88, instruction count 7, allocated bytes for code 24 (MethodHash=172f701c) for method System.Net.MultiArrayBuffer:EnsureAvailableSpace(int):this (FullOpts)
 ; ============================================================
-11 (-15.07 % of base) - System.Net.MultiArrayBuffer:Discard(int):this
 ; Assembly listing for method System.Net.MultiArrayBuffer:Discard(int):this (FullOpts)
 ; Emitting BLENDED_CODE for X64 with AVX - Unix
 ; FullOpts code
 ; optimized code
 ; rbp based frame
-; partially interruptible
+; fully interruptible
 ; No PGO data
-; 0 inlinees with PGO data; 2 single block inlinees; 1 inlinees without PGO data
+; 0 inlinees with PGO data; 1 single block inlinees; 0 inlinees without PGO data
 ; Final local variable assignments
 ;
-;  V00 this         [V00,T00] (  9,  7   )   byref  ->  rdi         this single-def
-;  V01 arg1         [V01,T02] (  4,  3.50)     int  ->  rsi         single-def
+;  V00 this         [V00,T00] (  8,  6   )   byref  ->  rdi         this single-def
+;  V01 arg1         [V01,T01] (  4,  3.50)     int  ->  rsi         single-def
 ;* V02 loc0         [V02    ] (  0,  0   )     int  ->  zero-ref   
-;  V03 loc1         [V03,T05] (  2,  1   )     int  ->  rax        
+;  V03 loc1         [V03,T03] (  2,  1   )     int  ->  rcx        
 ;* V04 loc2         [V04    ] (  0,  0   )     int  ->  zero-ref   
-;* V05 loc3         [V05    ] (  0,  0   )  struct (16) zero-ref    ld-addr-op <System.Net.MultiMemory>
-;# V06 OutArgs      [V06    ] (  1,  1   )  struct ( 0) [rsp+0x00]  do-not-enreg[XS] addr-exposed "OutgoingArgSpace"
-;* V07 tmp1         [V07    ] (  0,  0   )  struct (16) zero-ref    ld-addr-op "NewObj constructor temp" <System.Net.MultiMemory>
-;  V08 tmp2         [V08,T01] (  3,  6   )     int  ->  rax         "Inlining Arg"
-;* V09 tmp3         [V09    ] (  0,  0   )     ref  ->  zero-ref    class-hnd single-def "Inlining Arg" <ubyte[][]>
-;* V10 tmp4         [V10    ] (  0,  0   )     int  ->  zero-ref    "Inlining Arg"
-;* V11 tmp5         [V11    ] (  0,  0   )     ref  ->  zero-ref    "field V05._blocks (fldOffset=0x0)" P-INDEP
-;* V12 tmp6         [V12    ] (  0,  0   )     int  ->  zero-ref    "field V05._start (fldOffset=0x8)" P-INDEP
-;* V13 tmp7         [V13    ] (  0,  0   )     int  ->  zero-ref    "field V05._length (fldOffset=0xc)" P-INDEP
-;* V14 tmp8         [V14    ] (  0,  0   )     ref  ->  zero-ref    "field V07._blocks (fldOffset=0x0)" P-INDEP
-;* V15 tmp9         [V15    ] (  0,  0   )     int  ->  zero-ref    "field V07._start (fldOffset=0x8)" P-INDEP
-;  V16 tmp10        [V16,T04] (  2,  2   )     int  ->  rax         "field V07._length (fldOffset=0xc)" P-INDEP
-;  V17 cse0         [V17,T03] (  4,  3   )     int  ->  rdx         "CSE #01: aggressive"
+;# V05 OutArgs      [V05    ] (  1,  1   )  struct ( 0) [rsp+0x00]  do-not-enreg[XS] addr-exposed "OutgoingArgSpace"
+;  V06 cse0         [V06,T02] (  4,  3   )     int  ->  rax         "CSE #01: aggressive"
 ;
 ; Lcl frame size = 0
 
 G_M26734_IG01:
        push     rbp
        mov      rbp, rsp
 						;; size=4 bbWeight=1 PerfScore 1.25
 G_M26734_IG02:
-       cmp      dword ptr [rdi], edi
-       mov      edx, dword ptr [rdi+0x0C]
-       mov      eax, dword ptr [rdi+0x10]
-       sub      eax, edx
-       xor      ecx, ecx
-       test     eax, eax
-       cmove    eax, ecx
-       cmp      esi, eax
+       mov      edx, dword ptr [rdi+0x10]
+       mov      eax, dword ptr [rdi+0x0C]
+       sub      edx, eax
+       cmp      edx, esi
        je       SHORT G_M26734_IG05
-						;; size=21 bbWeight=1 PerfScore 9.25
+						;; size=12 bbWeight=1 PerfScore 5.50
 G_M26734_IG03:
-       mov      eax, edx
-       shr      eax, 14
-       add      edx, esi
-       mov      dword ptr [rdi+0x0C], edx
+       mov      ecx, eax
+       shr      ecx, 14
+       add      esi, eax
+       mov      dword ptr [rdi+0x0C], esi
        mov      edx, dword ptr [rdi+0x0C]
        shr      edx, 14
-       mov      esi, eax
+       mov      esi, ecx
        mov      rax, 0xD1FFAB1E      ; code for System.Net.MultiArrayBuffer:FreeBlocks(uint,uint):this
-       call     [rax]System.Net.MultiArrayBuffer:FreeBlocks(uint,uint):this
-       nop      
-						;; size=31 bbWeight=0.50 PerfScore 4.12
+						;; size=28 bbWeight=0.50 PerfScore 2.50
 G_M26734_IG04:
        pop      rbp
-       ret      
-						;; size=2 bbWeight=0.50 PerfScore 0.75
+       tail.jmp [rax]System.Net.MultiArrayBuffer:FreeBlocks(uint,uint):this
+						;; size=4 bbWeight=0.50 PerfScore 1.25
 G_M26734_IG05:
        mov      rax, 0xD1FFAB1E      ; code for System.Net.MultiArrayBuffer:DiscardAll():this
-       call     [rax]System.Net.MultiArrayBuffer:DiscardAll():this
-       nop      
-						;; size=13 bbWeight=0.50 PerfScore 1.75
+						;; size=10 bbWeight=0.50 PerfScore 0.12
 G_M26734_IG06:
        pop      rbp
-       ret      
-						;; size=2 bbWeight=0.50 PerfScore 0.75
+       tail.jmp [rax]System.Net.MultiArrayBuffer:DiscardAll():this
+						;; size=4 bbWeight=0.50 PerfScore 1.25
 
-; Total bytes of code 73, prolog size 4, PerfScore 17.88, instruction count 28, allocated bytes for code 73 (MethodHash=4bbf9791) for method System.Net.MultiArrayBuffer:Discard(int):this (FullOpts)
+; Total bytes of code 62, prolog size 4, PerfScore 11.88, instruction count 20, allocated bytes for code 62 (MethodHash=4bbf9791) for method System.Net.MultiArrayBuffer:Discard(int):this (FullOpts)
 ; ============================================================
-11 (-15.07 % of base) - System.Net.MultiArrayBuffer:Discard(int):this
 ; Assembly listing for method System.Net.MultiArrayBuffer:Discard(int):this (FullOpts)
 ; Emitting BLENDED_CODE for X64 with AVX - Unix
 ; FullOpts code
 ; optimized code
 ; rbp based frame
-; partially interruptible
+; fully interruptible
 ; No PGO data
-; 0 inlinees with PGO data; 2 single block inlinees; 1 inlinees without PGO data
+; 0 inlinees with PGO data; 1 single block inlinees; 0 inlinees without PGO data
 ; Final local variable assignments
 ;
-;  V00 this         [V00,T00] (  9,  7   )   byref  ->  rdi         this single-def
-;  V01 arg1         [V01,T02] (  4,  3.50)     int  ->  rsi         single-def
+;  V00 this         [V00,T00] (  8,  6   )   byref  ->  rdi         this single-def
+;  V01 arg1         [V01,T01] (  4,  3.50)     int  ->  rsi         single-def
 ;* V02 loc0         [V02    ] (  0,  0   )     int  ->  zero-ref   
-;  V03 loc1         [V03,T05] (  2,  1   )     int  ->  rax        
+;  V03 loc1         [V03,T03] (  2,  1   )     int  ->  rcx        
 ;* V04 loc2         [V04    ] (  0,  0   )     int  ->  zero-ref   
-;* V05 loc3         [V05    ] (  0,  0   )  struct (16) zero-ref    ld-addr-op <System.Net.MultiMemory>
-;# V06 OutArgs      [V06    ] (  1,  1   )  struct ( 0) [rsp+0x00]  do-not-enreg[XS] addr-exposed "OutgoingArgSpace"
-;* V07 tmp1         [V07    ] (  0,  0   )  struct (16) zero-ref    ld-addr-op "NewObj constructor temp" <System.Net.MultiMemory>
-;  V08 tmp2         [V08,T01] (  3,  6   )     int  ->  rax         "Inlining Arg"
-;* V09 tmp3         [V09    ] (  0,  0   )     ref  ->  zero-ref    class-hnd single-def "Inlining Arg" <ubyte[][]>
-;* V10 tmp4         [V10    ] (  0,  0   )     int  ->  zero-ref    "Inlining Arg"
-;* V11 tmp5         [V11    ] (  0,  0   )     ref  ->  zero-ref    "field V05._blocks (fldOffset=0x0)" P-INDEP
-;* V12 tmp6         [V12    ] (  0,  0   )     int  ->  zero-ref    "field V05._start (fldOffset=0x8)" P-INDEP
-;* V13 tmp7         [V13    ] (  0,  0   )     int  ->  zero-ref    "field V05._length (fldOffset=0xc)" P-INDEP
-;* V14 tmp8         [V14    ] (  0,  0   )     ref  ->  zero-ref    "field V07._blocks (fldOffset=0x0)" P-INDEP
-;* V15 tmp9         [V15    ] (  0,  0   )     int  ->  zero-ref    "field V07._start (fldOffset=0x8)" P-INDEP
-;  V16 tmp10        [V16,T04] (  2,  2   )     int  ->  rax         "field V07._length (fldOffset=0xc)" P-INDEP
-;  V17 cse0         [V17,T03] (  4,  3   )     int  ->  rdx         "CSE #01: aggressive"
+;# V05 OutArgs      [V05    ] (  1,  1   )  struct ( 0) [rsp+0x00]  do-not-enreg[XS] addr-exposed "OutgoingArgSpace"
+;  V06 cse0         [V06,T02] (  4,  3   )     int  ->  rax         "CSE #01: aggressive"
 ;
 ; Lcl frame size = 0
 
 G_M26734_IG01:
        push     rbp
        mov      rbp, rsp
 						;; size=4 bbWeight=1 PerfScore 1.25
 G_M26734_IG02:
-       cmp      dword ptr [rdi], edi
-       mov      edx, dword ptr [rdi+0x0C]
-       mov      eax, dword ptr [rdi+0x10]
-       sub      eax, edx
-       xor      ecx, ecx
-       test     eax, eax
-       cmove    eax, ecx
-       cmp      esi, eax
+       mov      edx, dword ptr [rdi+0x10]
+       mov      eax, dword ptr [rdi+0x0C]
+       sub      edx, eax
+       cmp      edx, esi
        je       SHORT G_M26734_IG05
-						;; size=21 bbWeight=1 PerfScore 9.25
+						;; size=12 bbWeight=1 PerfScore 5.50
 G_M26734_IG03:
-       mov      eax, edx
-       shr      eax, 14
-       add      edx, esi
-       mov      dword ptr [rdi+0x0C], edx
+       mov      ecx, eax
+       shr      ecx, 14
+       add      esi, eax
+       mov      dword ptr [rdi+0x0C], esi
        mov      edx, dword ptr [rdi+0x0C]
        shr      edx, 14
-       mov      esi, eax
+       mov      esi, ecx
        mov      rax, 0xD1FFAB1E      ; code for System.Net.MultiArrayBuffer:FreeBlocks(uint,uint):this
-       call     [rax]System.Net.MultiArrayBuffer:FreeBlocks(uint,uint):this
-       nop      
-						;; size=31 bbWeight=0.50 PerfScore 4.12
+						;; size=28 bbWeight=0.50 PerfScore 2.50
 G_M26734_IG04:
        pop      rbp
-       ret      
-						;; size=2 bbWeight=0.50 PerfScore 0.75
+       tail.jmp [rax]System.Net.MultiArrayBuffer:FreeBlocks(uint,uint):this
+						;; size=4 bbWeight=0.50 PerfScore 1.25
 G_M26734_IG05:
        mov      rax, 0xD1FFAB1E      ; code for System.Net.MultiArrayBuffer:DiscardAll():this
-       call     [rax]System.Net.MultiArrayBuffer:DiscardAll():this
-       nop      
-						;; size=13 bbWeight=0.50 PerfScore 1.75
+						;; size=10 bbWeight=0.50 PerfScore 0.12
 G_M26734_IG06:
        pop      rbp
-       ret      
-						;; size=2 bbWeight=0.50 PerfScore 0.75
+       tail.jmp [rax]System.Net.MultiArrayBuffer:DiscardAll():this
+						;; size=4 bbWeight=0.50 PerfScore 1.25
 
-; Total bytes of code 73, prolog size 4, PerfScore 17.88, instruction count 28, allocated bytes for code 73 (MethodHash=4bbf9791) for method System.Net.MultiArrayBuffer:Discard(int):this (FullOpts)
+; Total bytes of code 62, prolog size 4, PerfScore 11.88, instruction count 20, allocated bytes for code 62 (MethodHash=4bbf9791) for method System.Net.MultiArrayBuffer:Discard(int):this (FullOpts)
 ; ============================================================

Note: some changes were skipped as they were too large to fit into a comment.

Larger list of diffs: https://gist.github.com/MihuBot/e78a72fa03e6fe8eef1bb8153d45c224

@MihuBot
Copy link
Owner Author

MihuBot commented Oct 24, 2024

@MihaZupan

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant