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] [hez2010] JIT: Devirtualization and inlining for GVM #998

Open
MihuBot opened this issue Feb 10, 2025 · 2 comments
Open

[JitDiff X64] [hez2010] JIT: Devirtualization and inlining for GVM #998

MihuBot opened this issue Feb 10, 2025 · 2 comments

Comments

@MihuBot
Copy link
Owner

MihuBot commented Feb 10, 2025

Job completed in 18 minutes 20 seconds (remote runner delay: 2 minutes 40 seconds).
dotnet/runtime#112353

Diffs

Found 86 files with textual diffs.

Summary of Code Size diffs:
(Lower is better)

Total bytes of base: 43747423
Total bytes of diff: 43747207
Total bytes of delta: -216 (-0.00 % of base)
Total relative delta: -0.88
    diff is an improvement.
    relative diff is an improvement.


Top file improvements (bytes):
        -216 : System.Text.Json.dasm (-0.02 % of base)

1 total files with Code Size differences (1 improved, 0 regressed), 262 unchanged.

Top method improvements (bytes):
         -55 (-18.09 % of base) : System.Text.Json.dasm - System.Text.Json.Nodes.JsonValueOfElement:GetValue[System.__Canon]():System.__Canon:this (FullOpts)
         -23 (-10.04 % of base) : System.Text.Json.dasm - System.Text.Json.Nodes.JsonValueOfElement:GetValue[double]():double:this (FullOpts)
         -23 (-10.13 % of base) : System.Text.Json.dasm - System.Text.Json.Nodes.JsonValueOfElement:GetValue[int]():int:this (FullOpts)
         -23 (-10.09 % of base) : System.Text.Json.dasm - System.Text.Json.Nodes.JsonValueOfElement:GetValue[long]():long:this (FullOpts)
         -23 (-10.04 % of base) : System.Text.Json.dasm - System.Text.Json.Nodes.JsonValueOfElement:GetValue[short]():short:this (FullOpts)
         -23 (-10.09 % of base) : System.Text.Json.dasm - System.Text.Json.Nodes.JsonValueOfElement:GetValue[System.Nullable`1[int]]():System.Nullable`1[int]:this (FullOpts)
         -23 (-9.20 % of base) : System.Text.Json.dasm - System.Text.Json.Nodes.JsonValueOfElement:GetValue[System.Numerics.Vector`1[float]]():System.Numerics.Vector`1[float]:this (FullOpts)
         -23 (-10.09 % of base) : System.Text.Json.dasm - System.Text.Json.Nodes.JsonValueOfElement:GetValue[ubyte]():ubyte:this (FullOpts)

Top method improvements (percentages):
         -55 (-18.09 % of base) : System.Text.Json.dasm - System.Text.Json.Nodes.JsonValueOfElement:GetValue[System.__Canon]():System.__Canon:this (FullOpts)
         -23 (-10.13 % of base) : System.Text.Json.dasm - System.Text.Json.Nodes.JsonValueOfElement:GetValue[int]():int:this (FullOpts)
         -23 (-10.09 % of base) : System.Text.Json.dasm - System.Text.Json.Nodes.JsonValueOfElement:GetValue[long]():long:this (FullOpts)
         -23 (-10.09 % of base) : System.Text.Json.dasm - System.Text.Json.Nodes.JsonValueOfElement:GetValue[System.Nullable`1[int]]():System.Nullable`1[int]:this (FullOpts)
         -23 (-10.09 % of base) : System.Text.Json.dasm - System.Text.Json.Nodes.JsonValueOfElement:GetValue[ubyte]():ubyte:this (FullOpts)
         -23 (-10.04 % of base) : System.Text.Json.dasm - System.Text.Json.Nodes.JsonValueOfElement:GetValue[double]():double:this (FullOpts)
         -23 (-10.04 % of base) : System.Text.Json.dasm - System.Text.Json.Nodes.JsonValueOfElement:GetValue[short]():short:this (FullOpts)
         -23 (-9.20 % of base) : System.Text.Json.dasm - System.Text.Json.Nodes.JsonValueOfElement:GetValue[System.Numerics.Vector`1[float]]():System.Numerics.Vector`1[float]:this (FullOpts)

8 total methods with Code Size differences (8 improved, 0 regressed), 247810 unchanged.

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

Artifacts:

@MihuBot
Copy link
Owner Author

MihuBot commented Feb 10, 2025

Top method improvements

-55 (-18.09 % of base) - System.Text.Json.Nodes.JsonValueOfElement:GetValue[System.__Canon]():System.__Canon:this
 ; Assembly listing for method System.Text.Json.Nodes.JsonValueOfElement:GetValue[System.__Canon]():System.__Canon: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; 8 single block inlinees; 4 inlinees without PGO data
 ; Final local variable assignments
 ;
-;  V00 this         [V00,T01] (  5,  4.50)     ref  ->  r15         this class-hnd single-def <System.Text.Json.Nodes.JsonValueOfElement>
-;  V01 TypeCtx      [V01,T00] (  6,  4.70)    long  ->  rbx         single-def
+;  V00 this         [V00,T00] (  5,  4.50)     ref  ->  rbx         this class-hnd single-def <System.Text.Json.Nodes.JsonValueOfElement>
+;  V01 TypeCtx      [V01,T01] (  4,  3.50)    long  ->  r15         single-def
 ;  V02 loc0         [V02    ] (  2,  2   )     ref  ->  [rbp-0x20]  do-not-enreg[X] must-init addr-exposed ld-addr-op class-hnd <System.__Canon>
 ;# V03 OutArgs      [V03    ] (  1,  1   )  struct ( 0) [rsp+0x00]  do-not-enreg[XS] addr-exposed "OutgoingArgSpace" <Empty>
 ;* V04 tmp1         [V04    ] (  0,  0   )    long  ->  zero-ref    "spilling helperCall"
-;  V05 tmp2         [V05,T07] (  2,  4   )    long  ->  rax         "VirtualCall through function pointer"
-;  V06 tmp3         [V06,T09] (  3,  3   )   byref  ->  r15         single-def "Inlining Arg"
-;  V07 tmp4         [V07,T16] (  3,  1.50)   ubyte  ->  rdi         "Inline return value spill temp"
-;  V08 tmp5         [V08,T04] (  4,  4   )     ref  ->  rdi         class-hnd exact single-def "dup spill" <System.Text.Json.JsonDocument>
+;* V05 tmp2         [V05    ] (  0,  0   )    long  ->  zero-ref    "VirtualCall through function pointer"
+;  V06 tmp3         [V06,T05] (  3,  3   )   byref  ->  rbx         single-def "Inlining Arg"
+;  V07 tmp4         [V07,T12] (  3,  1.50)   ubyte  ->  rdi         "Inline return value spill temp"
+;  V08 tmp5         [V08,T03] (  4,  4   )     ref  ->  rdi         class-hnd exact single-def "dup spill" <System.Text.Json.JsonDocument>
 ;* V09 tmp6         [V09    ] (  0,  0   )     ref  ->  zero-ref    single-def
-;  V10 tmp7         [V10,T12] (  2,  2   )     int  ->  rax         "Inlining Arg"
+;  V10 tmp7         [V10,T08] (  2,  2   )     int  ->  rax         "Inlining Arg"
 ;* V11 tmp8         [V11    ] (  0,  0   )   byref  ->  zero-ref    "Inlining Arg"
 ;* V12 tmp9         [V12    ] (  0,  0   )   byref  ->  zero-ref    "Inlining Arg"
 ;* V13 tmp10        [V13    ] (  0,  0   )  struct (16) zero-ref    "spilled call-like call argument" <System.Span`1[ubyte]>
 ;* V14 tmp11        [V14    ] (  0,  0   )  struct (16) zero-ref    "spilled call-like call argument" <System.ReadOnlySpan`1[ubyte]>
 ;* V15 tmp12        [V15    ] (  0,  0   )  struct (16) zero-ref    "Inline return value spill temp" <System.Span`1[ubyte]>
-;  V16 tmp13        [V16,T05] (  4,  4   )     ref  ->  rdi         class-hnd single-def "Inlining Arg" <ubyte[]>
-;  V17 tmp14        [V17,T03] (  5,  5   )     int  ->  rax         "Inlining Arg"
+;  V16 tmp13        [V16,T04] (  4,  4   )     ref  ->  rdi         class-hnd single-def "Inlining Arg" <ubyte[]>
+;  V17 tmp14        [V17,T02] (  5,  5   )     int  ->  rax         "Inlining Arg"
 ;* V18 tmp15        [V18    ] (  0,  0   )  struct (16) zero-ref    ld-addr-op "NewObj constructor temp" <System.Span`1[ubyte]>
 ;* V19 tmp16        [V19    ] (  0,  0   )  struct (16) zero-ref    ld-addr-op "Inline ldloca(s) first use temp" <System.Span`1[ubyte]>
-;  V20 tmp17        [V20,T10] (  2,  2   )   byref  ->  rdi         single-def "Inlining Arg"
-;  V21 tmp18        [V21,T13] (  2,  2   )     int  ->  rcx         "Inlining Arg"
+;  V20 tmp17        [V20,T06] (  2,  2   )   byref  ->  rdi         single-def "Inlining Arg"
+;  V21 tmp18        [V21,T09] (  2,  2   )     int  ->  rcx         "Inlining Arg"
 ;* V22 tmp19        [V22    ] (  0,  0   )  struct (16) zero-ref    ld-addr-op "Inlining Arg" <System.Span`1[ubyte]>
 ;* V23 tmp20        [V23    ] (  0,  0   )  struct (16) zero-ref    ld-addr-op "NewObj constructor temp" <System.ReadOnlySpan`1[ubyte]>
 ;* V24 tmp21        [V24    ] (  0,  0   )   byref  ->  zero-ref    single-def "Inlining Arg"
 ;* V25 tmp22        [V25    ] (  0,  0   )     int  ->  zero-ref    "Inlining Arg"
 ;* V26 tmp23        [V26    ] (  0,  0   )  struct (16) zero-ref    ld-addr-op "Inlining Arg" <System.ReadOnlySpan`1[ubyte]>
 ;* V27 tmp24        [V27    ] (  0,  0   )  struct (16) zero-ref    ld-addr-op "Inlining Arg" <System.ReadOnlySpan`1[ubyte]>
 ;* V28 tmp25        [V28    ] (  0,  0   )   byref  ->  zero-ref    "field V13._reference (fldOffset=0x0)" P-INDEP
 ;* V29 tmp26        [V29    ] (  0,  0   )     int  ->  zero-ref    "field V13._length (fldOffset=0x8)" P-INDEP
 ;* V30 tmp27        [V30    ] (  0,  0   )   byref  ->  zero-ref    "field V14._reference (fldOffset=0x0)" P-INDEP
 ;* V31 tmp28        [V31    ] (  0,  0   )     int  ->  zero-ref    "field V14._length (fldOffset=0x8)" P-INDEP
-;  V32 tmp29        [V32,T15] (  3,  1.50)   byref  ->  rdi         "field V15._reference (fldOffset=0x0)" P-INDEP
-;  V33 tmp30        [V33,T17] (  3,  1.50)     int  ->  rcx         "field V15._length (fldOffset=0x8)" P-INDEP
-;  V34 tmp31        [V34,T19] (  2,  1   )   byref  ->  rdi         single-def "field V18._reference (fldOffset=0x0)" P-INDEP
-;  V35 tmp32        [V35,T20] (  2,  1   )     int  ->  rcx         "field V18._length (fldOffset=0x8)" P-INDEP
+;  V32 tmp29        [V32,T11] (  3,  1.50)   byref  ->  rdi         "field V15._reference (fldOffset=0x0)" P-INDEP
+;  V33 tmp30        [V33,T13] (  3,  1.50)     int  ->  rcx         "field V15._length (fldOffset=0x8)" P-INDEP
+;  V34 tmp31        [V34,T15] (  2,  1   )   byref  ->  rdi         single-def "field V18._reference (fldOffset=0x0)" P-INDEP
+;  V35 tmp32        [V35,T16] (  2,  1   )     int  ->  rcx         "field V18._length (fldOffset=0x8)" P-INDEP
 ;* V36 tmp33        [V36    ] (  0,  0   )   byref  ->  zero-ref    single-def "field V19._reference (fldOffset=0x0)" P-INDEP
 ;* V37 tmp34        [V37    ] (  0,  0   )     int  ->  zero-ref    "field V19._length (fldOffset=0x8)" P-INDEP
 ;* V38 tmp35        [V38    ] (  0,  0   )   byref  ->  zero-ref    single-def "field V22._reference (fldOffset=0x0)" P-INDEP
 ;* V39 tmp36        [V39    ] (  0,  0   )     int  ->  zero-ref    "field V22._length (fldOffset=0x8)" P-INDEP
 ;* V40 tmp37        [V40    ] (  0,  0   )   byref  ->  zero-ref    single-def "field V23._reference (fldOffset=0x0)" P-INDEP
 ;* V41 tmp38        [V41    ] (  0,  0   )     int  ->  zero-ref    "field V23._length (fldOffset=0x8)" P-INDEP
 ;* V42 tmp39        [V42    ] (  0,  0   )   byref  ->  zero-ref    single-def "field V26._reference (fldOffset=0x0)" P-INDEP
 ;* V43 tmp40        [V43    ] (  0,  0   )     int  ->  zero-ref    "field V26._length (fldOffset=0x8)" P-INDEP
 ;* V44 tmp41        [V44    ] (  0,  0   )   byref  ->  zero-ref    single-def "field V27._reference (fldOffset=0x0)" P-INDEP
 ;* V45 tmp42        [V45    ] (  0,  0   )     int  ->  zero-ref    "field V27._length (fldOffset=0x8)" P-INDEP
-;  V46 tmp43        [V46,T08] (  2,  4   )    long  ->  rdx         "argument with side effect"
-;  V47 tmp44        [V47,T14] (  2,  2   )     int  ->  r15         "argument with side effect"
-;  V48 tmp45        [V48,T11] (  2,  2   )     ref  ->  rsi         single-def "argument with side effect"
-;  V49 cse0         [V49,T18] (  3,  1.50)     int  ->  rcx         "CSE #01: moderate"
-;  V50 rat0         [V50,T06] (  3,  4   )    long  ->  rdx         "runtime lookup"
-;  V51 rat1         [V51,T02] (  3,  5.60)    long  ->  rdx         "fgMakeTemp is creating a new local variable"
+;  V46 tmp43        [V46,T10] (  2,  2   )     int  ->  rbx         "argument with side effect"
+;  V47 tmp44        [V47,T07] (  2,  2   )     ref  ->  rsi         single-def "argument with side effect"
+;  V48 cse0         [V48,T14] (  3,  1.50)     int  ->  rcx         "CSE #01: moderate"
 ;
 ; Lcl frame size = 16
 
 G_M9419_IG01:
        push     rbp
        push     r15
        push     rbx
        sub      rsp, 16
        lea      rbp, [rsp+0x20]
        xor      eax, eax
        mov      qword ptr [rbp-0x20], rax
        mov      qword ptr [rbp-0x18], rsi
-       mov      r15, rdi
-       mov      rbx, rsi
+       mov      rbx, rdi
+       mov      r15, rsi
 						;; size=29 bbWeight=1 PerfScore 6.50
 G_M9419_IG02:
-       mov      rdi, qword ptr [rbx+0x18]
-       mov      rdx, qword ptr [rdi+0x10]
-       test     rdx, rdx
-       je       SHORT G_M9419_IG06
-						;; size=13 bbWeight=1 PerfScore 5.25
-G_M9419_IG03:
-       mov      rdi, r15
-       mov      rsi, 0xD1FFAB1E      ; System.Text.Json.Nodes.JsonValue
-       mov      rax, 0xD1FFAB1E      ; code for CORINFO_HELP_VIRTUAL_FUNC_PTR
-       call     [rax]CORINFO_HELP_VIRTUAL_FUNC_PTR
-       lea      rsi, [rbp-0x20]
-       mov      rdi, r15
-       call     rax
-       test     eax, eax
-       jne      SHORT G_M9419_IG07
-						;; size=38 bbWeight=1 PerfScore 8.75
-G_M9419_IG04:
-       add      r15, 24
-       mov      rdi, gword ptr [r15]
-       test     rdi, rdi
-       jne      SHORT G_M9419_IG09
-       xor      edi, edi
-						;; size=14 bbWeight=0.50 PerfScore 1.88
-G_M9419_IG05:
-       mov      rax, 0xD1FFAB1E      ; code for System.Text.Json.JsonReaderHelper:ToValueKind(ubyte):ubyte
-       call     [rax]System.Text.Json.JsonReaderHelper:ToValueKind(ubyte):ubyte
-       mov      r15d, eax
-       mov      rdi, qword ptr [rbx+0x18]
-       mov      rdi, qword ptr [rdi]
-       mov      rax, 0xD1FFAB1E      ; code for CORINFO_HELP_TYPEHANDLE_TO_RUNTIMETYPE
-       call     [rax]CORINFO_HELP_TYPEHANDLE_TO_RUNTIMETYPE
-       mov      rsi, rax
-       mov      edi, r15d
-       mov      rax, 0xD1FFAB1E      ; code for System.Text.Json.ThrowHelper:ThrowInvalidOperationException_NodeUnableToConvertElement(ubyte,System.Type)
-       call     [rax]System.Text.Json.ThrowHelper:ThrowInvalidOperationException_NodeUnableToConvertElement(ubyte,System.Type)
-       int3     
-						;; size=53 bbWeight=0.50 PerfScore 7.38
-G_M9419_IG06:
+       cmp      byte  ptr [rbx], bl
+       lea      rdx, [rbp-0x20]
        mov      rdi, rbx
-       mov      rsi, 0xD1FFAB1E      ; global ptr
-       mov      rax, 0xD1FFAB1E      ; code for CORINFO_HELP_RUNTIMEHANDLE_METHOD
-       call     [rax]CORINFO_HELP_RUNTIMEHANDLE_METHOD
-       mov      rdx, rax
-       jmp      G_M9419_IG03
-						;; size=33 bbWeight=0.20 PerfScore 1.20
-G_M9419_IG07:
+       mov      rsi, 0xD1FFAB1E      ; System.Text.Json.Nodes.JsonValueOfElement:TryGetValue[System.__Canon](byref):ubyte:this
+       mov      rax, 0xD1FFAB1E      ; code for System.Text.Json.Nodes.JsonValueOfElement:TryGetValue[System.__Canon](byref):ubyte:this
+       call     [rax]System.Text.Json.Nodes.JsonValueOfElement:TryGetValue[System.__Canon](byref):ubyte:this
+       test     eax, eax
+       je       SHORT G_M9419_IG04
        mov      rax, gword ptr [rbp-0x20]
-						;; size=4 bbWeight=1 PerfScore 1.00
-G_M9419_IG08:
+						;; size=39 bbWeight=1 PerfScore 9.50
+G_M9419_IG03:
        add      rsp, 16
        pop      rbx
        pop      r15
        pop      rbp
        ret      
 						;; size=9 bbWeight=1 PerfScore 2.75
-G_M9419_IG09:
-       mov      eax, dword ptr [r15+0x08]
+G_M9419_IG04:
+       add      rbx, 24
+       mov      rdi, gword ptr [rbx]
+       test     rdi, rdi
+       je       SHORT G_M9419_IG10
+       mov      eax, dword ptr [rbx+0x08]
        cmp      dword ptr [rdi+0x2C], 0
-       je       SHORT G_M9419_IG14
+       je       SHORT G_M9419_IG09
        mov      rdi, gword ptr [rdi+0x30]
        add      eax, 8
        test     rdi, rdi
-       je       SHORT G_M9419_IG10
+       je       SHORT G_M9419_IG05
        mov      ecx, dword ptr [rdi+0x08]
        cmp      ecx, eax
-       jb       SHORT G_M9419_IG13
+       jb       SHORT G_M9419_IG08
        mov      edx, eax
        lea      rdi, bword ptr [rdi+rdx+0x10]
        sub      ecx, eax
-       jmp      SHORT G_M9419_IG11
-						;; size=40 bbWeight=0.50 PerfScore 8.12
-G_M9419_IG10:
+       jmp      SHORT G_M9419_IG06
+						;; size=51 bbWeight=0.50 PerfScore 9.88
+G_M9419_IG05:
        test     eax, eax
-       jne      SHORT G_M9419_IG13
+       jne      SHORT G_M9419_IG08
        xor      rdi, rdi
        xor      ecx, ecx
 						;; size=8 bbWeight=0.50 PerfScore 0.88
-G_M9419_IG11:
+G_M9419_IG06:
        cmp      ecx, 4
-       jl       SHORT G_M9419_IG12
+       jl       SHORT G_M9419_IG07
        mov      edi, dword ptr [rdi]
        shr      edi, 28
        movzx    rdi, dil
-       jmp      G_M9419_IG05
-						;; size=19 bbWeight=0.50 PerfScore 3.00
-G_M9419_IG12:
+       jmp      SHORT G_M9419_IG11
+						;; size=16 bbWeight=0.50 PerfScore 3.00
+G_M9419_IG07:
        mov      edi, 40
        mov      rax, 0xD1FFAB1E      ; code for System.ThrowHelper:ThrowArgumentOutOfRangeException(int)
        call     [rax]System.ThrowHelper:ThrowArgumentOutOfRangeException(int)
        int3     
 						;; size=18 bbWeight=0.50 PerfScore 1.88
-G_M9419_IG13:
+G_M9419_IG08:
        mov      rax, 0xD1FFAB1E      ; code for System.ThrowHelper:ThrowArgumentOutOfRangeException()
        call     [rax]System.ThrowHelper:ThrowArgumentOutOfRangeException()
        int3     
 						;; size=13 bbWeight=0.50 PerfScore 1.75
-G_M9419_IG14:
+G_M9419_IG09:
        mov      rax, 0xD1FFAB1E      ; code for System.Text.Json.ThrowHelper:ThrowObjectDisposedException_JsonDocument()
        call     [rax]System.Text.Json.ThrowHelper:ThrowObjectDisposedException_JsonDocument()
        int3     
 						;; size=13 bbWeight=0.50 PerfScore 1.75
+G_M9419_IG10:
+       xor      edi, edi
+						;; size=2 bbWeight=0.50 PerfScore 0.12
+G_M9419_IG11:
+       mov      rax, 0xD1FFAB1E      ; code for System.Text.Json.JsonReaderHelper:ToValueKind(ubyte):ubyte
+       call     [rax]System.Text.Json.JsonReaderHelper:ToValueKind(ubyte):ubyte
+       mov      ebx, eax
+       mov      rdi, qword ptr [r15+0x18]
+       mov      rdi, qword ptr [rdi]
+       mov      rax, 0xD1FFAB1E      ; code for CORINFO_HELP_TYPEHANDLE_TO_RUNTIMETYPE
+       call     [rax]CORINFO_HELP_TYPEHANDLE_TO_RUNTIMETYPE
+       mov      rsi, rax
+       mov      edi, ebx
+       mov      rax, 0xD1FFAB1E      ; code for System.Text.Json.ThrowHelper:ThrowInvalidOperationException_NodeUnableToConvertElement(ubyte,System.Type)
+       call     [rax]System.Text.Json.ThrowHelper:ThrowInvalidOperationException_NodeUnableToConvertElement(ubyte,System.Type)
+       int3     
+						;; size=51 bbWeight=0.50 PerfScore 7.38
 
-; Total bytes of code 304, prolog size 23, PerfScore 52.08, instruction count 86, allocated bytes for code 304 (MethodHash=f5acdb34) for method System.Text.Json.Nodes.JsonValueOfElement:GetValue[System.__Canon]():System.__Canon:this (FullOpts)
+; Total bytes of code 249, prolog size 23, PerfScore 45.38, instruction count 75, allocated bytes for code 249 (MethodHash=f5acdb34) for method System.Text.Json.Nodes.JsonValueOfElement:GetValue[System.__Canon]():System.__Canon:this (FullOpts)
 ; ============================================================
-23 (-10.04 % of base) - System.Text.Json.Nodes.JsonValueOfElement:GetValue[double]():double:this
 ; Assembly listing for method System.Text.Json.Nodes.JsonValueOfElement:GetValue[double]():double: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; 8 single block inlinees; 4 inlinees without PGO data
 ; Final local variable assignments
 ;
 ;  V00 this         [V00,T00] (  5,  4.50)     ref  ->  rbx         this class-hnd single-def <System.Text.Json.Nodes.JsonValueOfElement>
 ;  V01 loc0         [V01    ] (  2,  2   )  double  ->  [rbp-0x10]  do-not-enreg[X] addr-exposed ld-addr-op
 ;# V02 OutArgs      [V02    ] (  1,  1   )  struct ( 0) [rsp+0x00]  do-not-enreg[XS] addr-exposed "OutgoingArgSpace" <Empty>
-;  V03 tmp1         [V03,T04] (  2,  4   )    long  ->  rax         "VirtualCall through function pointer"
-;  V04 tmp2         [V04,T05] (  3,  3   )   byref  ->  rbx         single-def "Inlining Arg"
-;  V05 tmp3         [V05,T11] (  3,  1.50)   ubyte  ->  rdi         "Inline return value spill temp"
+;* V03 tmp1         [V03    ] (  0,  0   )    long  ->  zero-ref    "VirtualCall through function pointer"
+;  V04 tmp2         [V04,T04] (  3,  3   )   byref  ->  rbx         single-def "Inlining Arg"
+;  V05 tmp3         [V05,T10] (  3,  1.50)   ubyte  ->  rdi         "Inline return value spill temp"
 ;  V06 tmp4         [V06,T02] (  4,  4   )     ref  ->  rdi         class-hnd exact single-def "dup spill" <System.Text.Json.JsonDocument>
 ;* V07 tmp5         [V07    ] (  0,  0   )     ref  ->  zero-ref    single-def
-;  V08 tmp6         [V08,T07] (  2,  2   )     int  ->  rax         "Inlining Arg"
+;  V08 tmp6         [V08,T06] (  2,  2   )     int  ->  rax         "Inlining Arg"
 ;* V09 tmp7         [V09    ] (  0,  0   )   byref  ->  zero-ref    "Inlining Arg"
 ;* V10 tmp8         [V10    ] (  0,  0   )   byref  ->  zero-ref    "Inlining Arg"
 ;* V11 tmp9         [V11    ] (  0,  0   )  struct (16) zero-ref    "spilled call-like call argument" <System.Span`1[ubyte]>
 ;* V12 tmp10        [V12    ] (  0,  0   )  struct (16) zero-ref    "spilled call-like call argument" <System.ReadOnlySpan`1[ubyte]>
 ;* V13 tmp11        [V13    ] (  0,  0   )  struct (16) zero-ref    "Inline return value spill temp" <System.Span`1[ubyte]>
 ;  V14 tmp12        [V14,T03] (  4,  4   )     ref  ->  rdi         class-hnd single-def "Inlining Arg" <ubyte[]>
 ;  V15 tmp13        [V15,T01] (  5,  5   )     int  ->  rax         "Inlining Arg"
 ;* V16 tmp14        [V16    ] (  0,  0   )  struct (16) zero-ref    ld-addr-op "NewObj constructor temp" <System.Span`1[ubyte]>
 ;* V17 tmp15        [V17    ] (  0,  0   )  struct (16) zero-ref    ld-addr-op "Inline ldloca(s) first use temp" <System.Span`1[ubyte]>
-;  V18 tmp16        [V18,T06] (  2,  2   )   byref  ->  rdi         single-def "Inlining Arg"
-;  V19 tmp17        [V19,T08] (  2,  2   )     int  ->  rcx         "Inlining Arg"
+;  V18 tmp16        [V18,T05] (  2,  2   )   byref  ->  rdi         single-def "Inlining Arg"
+;  V19 tmp17        [V19,T07] (  2,  2   )     int  ->  rcx         "Inlining Arg"
 ;* V20 tmp18        [V20    ] (  0,  0   )  struct (16) zero-ref    ld-addr-op "Inlining Arg" <System.Span`1[ubyte]>
 ;* V21 tmp19        [V21    ] (  0,  0   )  struct (16) zero-ref    ld-addr-op "NewObj constructor temp" <System.ReadOnlySpan`1[ubyte]>
 ;* V22 tmp20        [V22    ] (  0,  0   )   byref  ->  zero-ref    single-def "Inlining Arg"
 ;* V23 tmp21        [V23    ] (  0,  0   )     int  ->  zero-ref    "Inlining Arg"
 ;* V24 tmp22        [V24    ] (  0,  0   )  struct (16) zero-ref    ld-addr-op "Inlining Arg" <System.ReadOnlySpan`1[ubyte]>
 ;* V25 tmp23        [V25    ] (  0,  0   )  struct (16) zero-ref    ld-addr-op "Inlining Arg" <System.ReadOnlySpan`1[ubyte]>
 ;* V26 tmp24        [V26    ] (  0,  0   )   byref  ->  zero-ref    "field V11._reference (fldOffset=0x0)" P-INDEP
 ;* V27 tmp25        [V27    ] (  0,  0   )     int  ->  zero-ref    "field V11._length (fldOffset=0x8)" P-INDEP
 ;* V28 tmp26        [V28    ] (  0,  0   )   byref  ->  zero-ref    "field V12._reference (fldOffset=0x0)" P-INDEP
 ;* V29 tmp27        [V29    ] (  0,  0   )     int  ->  zero-ref    "field V12._length (fldOffset=0x8)" P-INDEP
-;  V30 tmp28        [V30,T10] (  3,  1.50)   byref  ->  rdi         "field V13._reference (fldOffset=0x0)" P-INDEP
-;  V31 tmp29        [V31,T12] (  3,  1.50)     int  ->  rcx         "field V13._length (fldOffset=0x8)" P-INDEP
-;  V32 tmp30        [V32,T14] (  2,  1   )   byref  ->  rdi         single-def "field V16._reference (fldOffset=0x0)" P-INDEP
-;  V33 tmp31        [V33,T15] (  2,  1   )     int  ->  rcx         "field V16._length (fldOffset=0x8)" P-INDEP
+;  V30 tmp28        [V30,T09] (  3,  1.50)   byref  ->  rdi         "field V13._reference (fldOffset=0x0)" P-INDEP
+;  V31 tmp29        [V31,T11] (  3,  1.50)     int  ->  rcx         "field V13._length (fldOffset=0x8)" P-INDEP
+;  V32 tmp30        [V32,T13] (  2,  1   )   byref  ->  rdi         single-def "field V16._reference (fldOffset=0x0)" P-INDEP
+;  V33 tmp31        [V33,T14] (  2,  1   )     int  ->  rcx         "field V16._length (fldOffset=0x8)" P-INDEP
 ;* V34 tmp32        [V34    ] (  0,  0   )   byref  ->  zero-ref    single-def "field V17._reference (fldOffset=0x0)" P-INDEP
 ;* V35 tmp33        [V35    ] (  0,  0   )     int  ->  zero-ref    "field V17._length (fldOffset=0x8)" P-INDEP
 ;* V36 tmp34        [V36    ] (  0,  0   )   byref  ->  zero-ref    single-def "field V20._reference (fldOffset=0x0)" P-INDEP
 ;* V37 tmp35        [V37    ] (  0,  0   )     int  ->  zero-ref    "field V20._length (fldOffset=0x8)" P-INDEP
 ;* V38 tmp36        [V38    ] (  0,  0   )   byref  ->  zero-ref    single-def "field V21._reference (fldOffset=0x0)" P-INDEP
 ;* V39 tmp37        [V39    ] (  0,  0   )     int  ->  zero-ref    "field V21._length (fldOffset=0x8)" P-INDEP
 ;* V40 tmp38        [V40    ] (  0,  0   )   byref  ->  zero-ref    single-def "field V24._reference (fldOffset=0x0)" P-INDEP
 ;* V41 tmp39        [V41    ] (  0,  0   )     int  ->  zero-ref    "field V24._length (fldOffset=0x8)" P-INDEP
 ;* V42 tmp40        [V42    ] (  0,  0   )   byref  ->  zero-ref    single-def "field V25._reference (fldOffset=0x0)" P-INDEP
 ;* V43 tmp41        [V43    ] (  0,  0   )     int  ->  zero-ref    "field V25._length (fldOffset=0x8)" P-INDEP
-;  V44 tmp42        [V44,T09] (  2,  2   )     int  ->  rdi         "argument with side effect"
-;  V45 cse0         [V45,T13] (  3,  1.50)     int  ->  rcx         "CSE #01: moderate"
+;  V44 tmp42        [V44,T08] (  2,  2   )     int  ->  rdi         "argument with side effect"
+;  V45 cse0         [V45,T12] (  3,  1.50)     int  ->  rcx         "CSE #01: moderate"
 ;
 ; Lcl frame size = 8
 
 G_M715_IG01:
        push     rbp
        push     rbx
        push     rax
        lea      rbp, [rsp+0x10]
        mov      rbx, rdi
 						;; size=11 bbWeight=1 PerfScore 3.75
 G_M715_IG02:
-       mov      rdi, rbx
-       mov      rsi, 0xD1FFAB1E      ; System.Text.Json.Nodes.JsonValue
-       mov      rdx, 0xD1FFAB1E      ; token handle
-       mov      rax, 0xD1FFAB1E      ; code for CORINFO_HELP_VIRTUAL_FUNC_PTR
-       call     [rax]CORINFO_HELP_VIRTUAL_FUNC_PTR
+       cmp      byte  ptr [rbx], bl
        lea      rsi, [rbp-0x10]
        mov      rdi, rbx
-       call     rax
+       mov      rax, 0xD1FFAB1E      ; code for System.Text.Json.Nodes.JsonValueOfElement:TryGetValue[double](byref):ubyte:this
+       call     [rax]System.Text.Json.Nodes.JsonValueOfElement:TryGetValue[double](byref):ubyte:this
        test     eax, eax
        je       SHORT G_M715_IG04
        vmovsd   xmm0, qword ptr [rbp-0x10]
-						;; size=53 bbWeight=1 PerfScore 12.00
+						;; size=30 bbWeight=1 PerfScore 11.25
 G_M715_IG03:
        add      rsp, 8
        pop      rbx
        pop      rbp
        ret      
 						;; size=7 bbWeight=1 PerfScore 2.25
 G_M715_IG04:
        add      rbx, 24
        mov      rdi, gword ptr [rbx]
        test     rdi, rdi
        je       SHORT G_M715_IG10
        mov      eax, dword ptr [rbx+0x08]
        cmp      dword ptr [rdi+0x2C], 0
        je       SHORT G_M715_IG09
        mov      rdi, gword ptr [rdi+0x30]
        add      eax, 8
        test     rdi, rdi
        je       SHORT G_M715_IG05
        mov      ecx, dword ptr [rdi+0x08]
        cmp      ecx, eax
        jb       SHORT G_M715_IG08
        mov      edx, eax
        lea      rdi, bword ptr [rdi+rdx+0x10]
        sub      ecx, eax
        jmp      SHORT G_M715_IG06
 						;; size=51 bbWeight=0.50 PerfScore 9.88
 G_M715_IG05:
        test     eax, eax
        jne      SHORT G_M715_IG08
        xor      rdi, rdi
        xor      ecx, ecx
 						;; size=8 bbWeight=0.50 PerfScore 0.88
 G_M715_IG06:
        cmp      ecx, 4
        jl       SHORT G_M715_IG07
        mov      edi, dword ptr [rdi]
        shr      edi, 28
        movzx    rdi, dil
        jmp      SHORT G_M715_IG11
 						;; size=16 bbWeight=0.50 PerfScore 3.00
 G_M715_IG07:
        mov      edi, 40
        mov      rax, 0xD1FFAB1E      ; code for System.ThrowHelper:ThrowArgumentOutOfRangeException(int)
        call     [rax]System.ThrowHelper:ThrowArgumentOutOfRangeException(int)
        int3     
 						;; size=18 bbWeight=0.50 PerfScore 1.88
 G_M715_IG08:
        mov      rax, 0xD1FFAB1E      ; code for System.ThrowHelper:ThrowArgumentOutOfRangeException()
        call     [rax]System.ThrowHelper:ThrowArgumentOutOfRangeException()
        int3     
 						;; size=13 bbWeight=0.50 PerfScore 1.75
 G_M715_IG09:
        mov      rax, 0xD1FFAB1E      ; code for System.Text.Json.ThrowHelper:ThrowObjectDisposedException_JsonDocument()
        call     [rax]System.Text.Json.ThrowHelper:ThrowObjectDisposedException_JsonDocument()
        int3     
 						;; size=13 bbWeight=0.50 PerfScore 1.75
 G_M715_IG10:
        xor      edi, edi
 						;; size=2 bbWeight=0.50 PerfScore 0.12
 G_M715_IG11:
        mov      rax, 0xD1FFAB1E      ; code for System.Text.Json.JsonReaderHelper:ToValueKind(ubyte):ubyte
        call     [rax]System.Text.Json.JsonReaderHelper:ToValueKind(ubyte):ubyte
        mov      edi, eax
        mov      rsi, 0xD1FFAB1E      ; 'System.Double'
        mov      rax, 0xD1FFAB1E      ; code for System.Text.Json.ThrowHelper:ThrowInvalidOperationException_NodeUnableToConvertElement(ubyte,System.Type)
        call     [rax]System.Text.Json.ThrowHelper:ThrowInvalidOperationException_NodeUnableToConvertElement(ubyte,System.Type)
        int3     
 						;; size=37 bbWeight=0.50 PerfScore 3.62
 
-; Total bytes of code 229, prolog size 8, PerfScore 40.88, instruction count 66, allocated bytes for code 229 (MethodHash=7ea7fd34) for method System.Text.Json.Nodes.JsonValueOfElement:GetValue[double]():double:this (FullOpts)
+; Total bytes of code 206, prolog size 8, PerfScore 40.12, instruction count 63, allocated bytes for code 206 (MethodHash=7ea7fd34) for method System.Text.Json.Nodes.JsonValueOfElement:GetValue[double]():double:this (FullOpts)
 ; ============================================================
-23 (-10.13 % of base) - System.Text.Json.Nodes.JsonValueOfElement:GetValue[int]():int:this
 ; Assembly listing for method System.Text.Json.Nodes.JsonValueOfElement:GetValue[int]():int: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; 8 single block inlinees; 4 inlinees without PGO data
 ; Final local variable assignments
 ;
 ;  V00 this         [V00,T00] (  5,  4.50)     ref  ->  rbx         this class-hnd single-def <System.Text.Json.Nodes.JsonValueOfElement>
 ;  V01 loc0         [V01    ] (  2,  2   )     int  ->  [rbp-0x10]  do-not-enreg[X] addr-exposed ld-addr-op
 ;# V02 OutArgs      [V02    ] (  1,  1   )  struct ( 0) [rsp+0x00]  do-not-enreg[XS] addr-exposed "OutgoingArgSpace" <Empty>
-;  V03 tmp1         [V03,T04] (  2,  4   )    long  ->  rax         "VirtualCall through function pointer"
-;  V04 tmp2         [V04,T05] (  3,  3   )   byref  ->  rbx         single-def "Inlining Arg"
-;  V05 tmp3         [V05,T11] (  3,  1.50)   ubyte  ->  rdi         "Inline return value spill temp"
+;* V03 tmp1         [V03    ] (  0,  0   )    long  ->  zero-ref    "VirtualCall through function pointer"
+;  V04 tmp2         [V04,T04] (  3,  3   )   byref  ->  rbx         single-def "Inlining Arg"
+;  V05 tmp3         [V05,T10] (  3,  1.50)   ubyte  ->  rdi         "Inline return value spill temp"
 ;  V06 tmp4         [V06,T02] (  4,  4   )     ref  ->  rdi         class-hnd exact single-def "dup spill" <System.Text.Json.JsonDocument>
 ;* V07 tmp5         [V07    ] (  0,  0   )     ref  ->  zero-ref    single-def
-;  V08 tmp6         [V08,T07] (  2,  2   )     int  ->  rax         "Inlining Arg"
+;  V08 tmp6         [V08,T06] (  2,  2   )     int  ->  rax         "Inlining Arg"
 ;* V09 tmp7         [V09    ] (  0,  0   )   byref  ->  zero-ref    "Inlining Arg"
 ;* V10 tmp8         [V10    ] (  0,  0   )   byref  ->  zero-ref    "Inlining Arg"
 ;* V11 tmp9         [V11    ] (  0,  0   )  struct (16) zero-ref    "spilled call-like call argument" <System.Span`1[ubyte]>
 ;* V12 tmp10        [V12    ] (  0,  0   )  struct (16) zero-ref    "spilled call-like call argument" <System.ReadOnlySpan`1[ubyte]>
 ;* V13 tmp11        [V13    ] (  0,  0   )  struct (16) zero-ref    "Inline return value spill temp" <System.Span`1[ubyte]>
 ;  V14 tmp12        [V14,T03] (  4,  4   )     ref  ->  rdi         class-hnd single-def "Inlining Arg" <ubyte[]>
 ;  V15 tmp13        [V15,T01] (  5,  5   )     int  ->  rax         "Inlining Arg"
 ;* V16 tmp14        [V16    ] (  0,  0   )  struct (16) zero-ref    ld-addr-op "NewObj constructor temp" <System.Span`1[ubyte]>
 ;* V17 tmp15        [V17    ] (  0,  0   )  struct (16) zero-ref    ld-addr-op "Inline ldloca(s) first use temp" <System.Span`1[ubyte]>
-;  V18 tmp16        [V18,T06] (  2,  2   )   byref  ->  rdi         single-def "Inlining Arg"
-;  V19 tmp17        [V19,T08] (  2,  2   )     int  ->  rcx         "Inlining Arg"
+;  V18 tmp16        [V18,T05] (  2,  2   )   byref  ->  rdi         single-def "Inlining Arg"
+;  V19 tmp17        [V19,T07] (  2,  2   )     int  ->  rcx         "Inlining Arg"
 ;* V20 tmp18        [V20    ] (  0,  0   )  struct (16) zero-ref    ld-addr-op "Inlining Arg" <System.Span`1[ubyte]>
 ;* V21 tmp19        [V21    ] (  0,  0   )  struct (16) zero-ref    ld-addr-op "NewObj constructor temp" <System.ReadOnlySpan`1[ubyte]>
 ;* V22 tmp20        [V22    ] (  0,  0   )   byref  ->  zero-ref    single-def "Inlining Arg"
 ;* V23 tmp21        [V23    ] (  0,  0   )     int  ->  zero-ref    "Inlining Arg"
 ;* V24 tmp22        [V24    ] (  0,  0   )  struct (16) zero-ref    ld-addr-op "Inlining Arg" <System.ReadOnlySpan`1[ubyte]>
 ;* V25 tmp23        [V25    ] (  0,  0   )  struct (16) zero-ref    ld-addr-op "Inlining Arg" <System.ReadOnlySpan`1[ubyte]>
 ;* V26 tmp24        [V26    ] (  0,  0   )   byref  ->  zero-ref    "field V11._reference (fldOffset=0x0)" P-INDEP
 ;* V27 tmp25        [V27    ] (  0,  0   )     int  ->  zero-ref    "field V11._length (fldOffset=0x8)" P-INDEP
 ;* V28 tmp26        [V28    ] (  0,  0   )   byref  ->  zero-ref    "field V12._reference (fldOffset=0x0)" P-INDEP
 ;* V29 tmp27        [V29    ] (  0,  0   )     int  ->  zero-ref    "field V12._length (fldOffset=0x8)" P-INDEP
-;  V30 tmp28        [V30,T10] (  3,  1.50)   byref  ->  rdi         "field V13._reference (fldOffset=0x0)" P-INDEP
-;  V31 tmp29        [V31,T12] (  3,  1.50)     int  ->  rcx         "field V13._length (fldOffset=0x8)" P-INDEP
-;  V32 tmp30        [V32,T14] (  2,  1   )   byref  ->  rdi         single-def "field V16._reference (fldOffset=0x0)" P-INDEP
-;  V33 tmp31        [V33,T15] (  2,  1   )     int  ->  rcx         "field V16._length (fldOffset=0x8)" P-INDEP
+;  V30 tmp28        [V30,T09] (  3,  1.50)   byref  ->  rdi         "field V13._reference (fldOffset=0x0)" P-INDEP
+;  V31 tmp29        [V31,T11] (  3,  1.50)     int  ->  rcx         "field V13._length (fldOffset=0x8)" P-INDEP
+;  V32 tmp30        [V32,T13] (  2,  1   )   byref  ->  rdi         single-def "field V16._reference (fldOffset=0x0)" P-INDEP
+;  V33 tmp31        [V33,T14] (  2,  1   )     int  ->  rcx         "field V16._length (fldOffset=0x8)" P-INDEP
 ;* V34 tmp32        [V34    ] (  0,  0   )   byref  ->  zero-ref    single-def "field V17._reference (fldOffset=0x0)" P-INDEP
 ;* V35 tmp33        [V35    ] (  0,  0   )     int  ->  zero-ref    "field V17._length (fldOffset=0x8)" P-INDEP
 ;* V36 tmp34        [V36    ] (  0,  0   )   byref  ->  zero-ref    single-def "field V20._reference (fldOffset=0x0)" P-INDEP
 ;* V37 tmp35        [V37    ] (  0,  0   )     int  ->  zero-ref    "field V20._length (fldOffset=0x8)" P-INDEP
 ;* V38 tmp36        [V38    ] (  0,  0   )   byref  ->  zero-ref    single-def "field V21._reference (fldOffset=0x0)" P-INDEP
 ;* V39 tmp37        [V39    ] (  0,  0   )     int  ->  zero-ref    "field V21._length (fldOffset=0x8)" P-INDEP
 ;* V40 tmp38        [V40    ] (  0,  0   )   byref  ->  zero-ref    single-def "field V24._reference (fldOffset=0x0)" P-INDEP
 ;* V41 tmp39        [V41    ] (  0,  0   )     int  ->  zero-ref    "field V24._length (fldOffset=0x8)" P-INDEP
 ;* V42 tmp40        [V42    ] (  0,  0   )   byref  ->  zero-ref    single-def "field V25._reference (fldOffset=0x0)" P-INDEP
 ;* V43 tmp41        [V43    ] (  0,  0   )     int  ->  zero-ref    "field V25._length (fldOffset=0x8)" P-INDEP
-;  V44 tmp42        [V44,T09] (  2,  2   )     int  ->  rdi         "argument with side effect"
-;  V45 cse0         [V45,T13] (  3,  1.50)     int  ->  rcx         "CSE #01: moderate"
+;  V44 tmp42        [V44,T08] (  2,  2   )     int  ->  rdi         "argument with side effect"
+;  V45 cse0         [V45,T12] (  3,  1.50)     int  ->  rcx         "CSE #01: moderate"
 ;
 ; Lcl frame size = 8
 
 G_M37867_IG01:
        push     rbp
        push     rbx
        push     rax
        lea      rbp, [rsp+0x10]
        mov      rbx, rdi
 						;; size=11 bbWeight=1 PerfScore 3.75
 G_M37867_IG02:
-       mov      rdi, rbx
-       mov      rsi, 0xD1FFAB1E      ; System.Text.Json.Nodes.JsonValue
-       mov      rdx, 0xD1FFAB1E      ; token handle
-       mov      rax, 0xD1FFAB1E      ; code for CORINFO_HELP_VIRTUAL_FUNC_PTR
-       call     [rax]CORINFO_HELP_VIRTUAL_FUNC_PTR
+       cmp      byte  ptr [rbx], bl
        lea      rsi, [rbp-0x10]
        mov      rdi, rbx
-       call     rax
+       mov      rax, 0xD1FFAB1E      ; code for System.Text.Json.Nodes.JsonValueOfElement:TryGetValue[int](byref):ubyte:this
+       call     [rax]System.Text.Json.Nodes.JsonValueOfElement:TryGetValue[int](byref):ubyte:this
        test     eax, eax
        je       SHORT G_M37867_IG04
        mov      eax, dword ptr [rbp-0x10]
-						;; size=51 bbWeight=1 PerfScore 10.00
+						;; size=28 bbWeight=1 PerfScore 9.25
 G_M37867_IG03:
        add      rsp, 8
        pop      rbx
        pop      rbp
        ret      
 						;; size=7 bbWeight=1 PerfScore 2.25
 G_M37867_IG04:
        add      rbx, 24
        mov      rdi, gword ptr [rbx]
        test     rdi, rdi
        je       SHORT G_M37867_IG10
        mov      eax, dword ptr [rbx+0x08]
        cmp      dword ptr [rdi+0x2C], 0
        je       SHORT G_M37867_IG09
        mov      rdi, gword ptr [rdi+0x30]
        add      eax, 8
        test     rdi, rdi
        je       SHORT G_M37867_IG05
        mov      ecx, dword ptr [rdi+0x08]
        cmp      ecx, eax
        jb       SHORT G_M37867_IG08
        mov      edx, eax
        lea      rdi, bword ptr [rdi+rdx+0x10]
        sub      ecx, eax
        jmp      SHORT G_M37867_IG06
 						;; size=51 bbWeight=0.50 PerfScore 9.88
 G_M37867_IG05:
        test     eax, eax
        jne      SHORT G_M37867_IG08
        xor      rdi, rdi
        xor      ecx, ecx
 						;; size=8 bbWeight=0.50 PerfScore 0.88
 G_M37867_IG06:
        cmp      ecx, 4
        jl       SHORT G_M37867_IG07
        mov      edi, dword ptr [rdi]
        shr      edi, 28
        movzx    rdi, dil
        jmp      SHORT G_M37867_IG11
 						;; size=16 bbWeight=0.50 PerfScore 3.00
 G_M37867_IG07:
        mov      edi, 40
        mov      rax, 0xD1FFAB1E      ; code for System.ThrowHelper:ThrowArgumentOutOfRangeException(int)
        call     [rax]System.ThrowHelper:ThrowArgumentOutOfRangeException(int)
        int3     
 						;; size=18 bbWeight=0.50 PerfScore 1.88
 G_M37867_IG08:
        mov      rax, 0xD1FFAB1E      ; code for System.ThrowHelper:ThrowArgumentOutOfRangeException()
        call     [rax]System.ThrowHelper:ThrowArgumentOutOfRangeException()
        int3     
 						;; size=13 bbWeight=0.50 PerfScore 1.75
 G_M37867_IG09:
        mov      rax, 0xD1FFAB1E      ; code for System.Text.Json.ThrowHelper:ThrowObjectDisposedException_JsonDocument()
        call     [rax]System.Text.Json.ThrowHelper:ThrowObjectDisposedException_JsonDocument()
        int3     
 						;; size=13 bbWeight=0.50 PerfScore 1.75
 G_M37867_IG10:
        xor      edi, edi
 						;; size=2 bbWeight=0.50 PerfScore 0.12
 G_M37867_IG11:
        mov      rax, 0xD1FFAB1E      ; code for System.Text.Json.JsonReaderHelper:ToValueKind(ubyte):ubyte
        call     [rax]System.Text.Json.JsonReaderHelper:ToValueKind(ubyte):ubyte
        mov      edi, eax
        mov      rsi, 0xD1FFAB1E      ; 'System.Int32'
        mov      rax, 0xD1FFAB1E      ; code for System.Text.Json.ThrowHelper:ThrowInvalidOperationException_NodeUnableToConvertElement(ubyte,System.Type)
        call     [rax]System.Text.Json.ThrowHelper:ThrowInvalidOperationException_NodeUnableToConvertElement(ubyte,System.Type)
        int3     
 						;; size=37 bbWeight=0.50 PerfScore 3.62
 
-; Total bytes of code 227, prolog size 8, PerfScore 38.88, instruction count 66, allocated bytes for code 227 (MethodHash=48d36c14) for method System.Text.Json.Nodes.JsonValueOfElement:GetValue[int]():int:this (FullOpts)
+; Total bytes of code 204, prolog size 8, PerfScore 38.12, instruction count 63, allocated bytes for code 204 (MethodHash=48d36c14) for method System.Text.Json.Nodes.JsonValueOfElement:GetValue[int]():int:this (FullOpts)
 ; ============================================================
-23 (-10.09 % of base) - System.Text.Json.Nodes.JsonValueOfElement:GetValue[long]():long:this
 ; Assembly listing for method System.Text.Json.Nodes.JsonValueOfElement:GetValue[long]():long: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; 8 single block inlinees; 4 inlinees without PGO data
 ; Final local variable assignments
 ;
 ;  V00 this         [V00,T00] (  5,  4.50)     ref  ->  rbx         this class-hnd single-def <System.Text.Json.Nodes.JsonValueOfElement>
 ;  V01 loc0         [V01    ] (  2,  2   )    long  ->  [rbp-0x10]  do-not-enreg[X] addr-exposed ld-addr-op
 ;# V02 OutArgs      [V02    ] (  1,  1   )  struct ( 0) [rsp+0x00]  do-not-enreg[XS] addr-exposed "OutgoingArgSpace" <Empty>
-;  V03 tmp1         [V03,T04] (  2,  4   )    long  ->  rax         "VirtualCall through function pointer"
-;  V04 tmp2         [V04,T05] (  3,  3   )   byref  ->  rbx         single-def "Inlining Arg"
-;  V05 tmp3         [V05,T11] (  3,  1.50)   ubyte  ->  rdi         "Inline return value spill temp"
+;* V03 tmp1         [V03    ] (  0,  0   )    long  ->  zero-ref    "VirtualCall through function pointer"
+;  V04 tmp2         [V04,T04] (  3,  3   )   byref  ->  rbx         single-def "Inlining Arg"
+;  V05 tmp3         [V05,T10] (  3,  1.50)   ubyte  ->  rdi         "Inline return value spill temp"
 ;  V06 tmp4         [V06,T02] (  4,  4   )     ref  ->  rdi         class-hnd exact single-def "dup spill" <System.Text.Json.JsonDocument>
 ;* V07 tmp5         [V07    ] (  0,  0   )     ref  ->  zero-ref    single-def
-;  V08 tmp6         [V08,T07] (  2,  2   )     int  ->  rax         "Inlining Arg"
+;  V08 tmp6         [V08,T06] (  2,  2   )     int  ->  rax         "Inlining Arg"
 ;* V09 tmp7         [V09    ] (  0,  0   )   byref  ->  zero-ref    "Inlining Arg"
 ;* V10 tmp8         [V10    ] (  0,  0   )   byref  ->  zero-ref    "Inlining Arg"
 ;* V11 tmp9         [V11    ] (  0,  0   )  struct (16) zero-ref    "spilled call-like call argument" <System.Span`1[ubyte]>
 ;* V12 tmp10        [V12    ] (  0,  0   )  struct (16) zero-ref    "spilled call-like call argument" <System.ReadOnlySpan`1[ubyte]>
 ;* V13 tmp11        [V13    ] (  0,  0   )  struct (16) zero-ref    "Inline return value spill temp" <System.Span`1[ubyte]>
 ;  V14 tmp12        [V14,T03] (  4,  4   )     ref  ->  rdi         class-hnd single-def "Inlining Arg" <ubyte[]>
 ;  V15 tmp13        [V15,T01] (  5,  5   )     int  ->  rax         "Inlining Arg"
 ;* V16 tmp14        [V16    ] (  0,  0   )  struct (16) zero-ref    ld-addr-op "NewObj constructor temp" <System.Span`1[ubyte]>
 ;* V17 tmp15        [V17    ] (  0,  0   )  struct (16) zero-ref    ld-addr-op "Inline ldloca(s) first use temp" <System.Span`1[ubyte]>
-;  V18 tmp16        [V18,T06] (  2,  2   )   byref  ->  rdi         single-def "Inlining Arg"
-;  V19 tmp17        [V19,T08] (  2,  2   )     int  ->  rcx         "Inlining Arg"
+;  V18 tmp16        [V18,T05] (  2,  2   )   byref  ->  rdi         single-def "Inlining Arg"
+;  V19 tmp17        [V19,T07] (  2,  2   )     int  ->  rcx         "Inlining Arg"
 ;* V20 tmp18        [V20    ] (  0,  0   )  struct (16) zero-ref    ld-addr-op "Inlining Arg" <System.Span`1[ubyte]>
 ;* V21 tmp19        [V21    ] (  0,  0   )  struct (16) zero-ref    ld-addr-op "NewObj constructor temp" <System.ReadOnlySpan`1[ubyte]>
 ;* V22 tmp20        [V22    ] (  0,  0   )   byref  ->  zero-ref    single-def "Inlining Arg"
 ;* V23 tmp21        [V23    ] (  0,  0   )     int  ->  zero-ref    "Inlining Arg"
 ;* V24 tmp22        [V24    ] (  0,  0   )  struct (16) zero-ref    ld-addr-op "Inlining Arg" <System.ReadOnlySpan`1[ubyte]>
 ;* V25 tmp23        [V25    ] (  0,  0   )  struct (16) zero-ref    ld-addr-op "Inlining Arg" <System.ReadOnlySpan`1[ubyte]>
 ;* V26 tmp24        [V26    ] (  0,  0   )   byref  ->  zero-ref    "field V11._reference (fldOffset=0x0)" P-INDEP
 ;* V27 tmp25        [V27    ] (  0,  0   )     int  ->  zero-ref    "field V11._length (fldOffset=0x8)" P-INDEP
 ;* V28 tmp26        [V28    ] (  0,  0   )   byref  ->  zero-ref    "field V12._reference (fldOffset=0x0)" P-INDEP
 ;* V29 tmp27        [V29    ] (  0,  0   )     int  ->  zero-ref    "field V12._length (fldOffset=0x8)" P-INDEP
-;  V30 tmp28        [V30,T10] (  3,  1.50)   byref  ->  rdi         "field V13._reference (fldOffset=0x0)" P-INDEP
-;  V31 tmp29        [V31,T12] (  3,  1.50)     int  ->  rcx         "field V13._length (fldOffset=0x8)" P-INDEP
-;  V32 tmp30        [V32,T14] (  2,  1   )   byref  ->  rdi         single-def "field V16._reference (fldOffset=0x0)" P-INDEP
-;  V33 tmp31        [V33,T15] (  2,  1   )     int  ->  rcx         "field V16._length (fldOffset=0x8)" P-INDEP
+;  V30 tmp28        [V30,T09] (  3,  1.50)   byref  ->  rdi         "field V13._reference (fldOffset=0x0)" P-INDEP
+;  V31 tmp29        [V31,T11] (  3,  1.50)     int  ->  rcx         "field V13._length (fldOffset=0x8)" P-INDEP
+;  V32 tmp30        [V32,T13] (  2,  1   )   byref  ->  rdi         single-def "field V16._reference (fldOffset=0x0)" P-INDEP
+;  V33 tmp31        [V33,T14] (  2,  1   )     int  ->  rcx         "field V16._length (fldOffset=0x8)" P-INDEP
 ;* V34 tmp32        [V34    ] (  0,  0   )   byref  ->  zero-ref    single-def "field V17._reference (fldOffset=0x0)" P-INDEP
 ;* V35 tmp33        [V35    ] (  0,  0   )     int  ->  zero-ref    "field V17._length (fldOffset=0x8)" P-INDEP
 ;* V36 tmp34        [V36    ] (  0,  0   )   byref  ->  zero-ref    single-def "field V20._reference (fldOffset=0x0)" P-INDEP
 ;* V37 tmp35        [V37    ] (  0,  0   )     int  ->  zero-ref    "field V20._length (fldOffset=0x8)" P-INDEP
 ;* V38 tmp36        [V38    ] (  0,  0   )   byref  ->  zero-ref    single-def "field V21._reference (fldOffset=0x0)" P-INDEP
 ;* V39 tmp37        [V39    ] (  0,  0   )     int  ->  zero-ref    "field V21._length (fldOffset=0x8)" P-INDEP
 ;* V40 tmp38        [V40    ] (  0,  0   )   byref  ->  zero-ref    single-def "field V24._reference (fldOffset=0x0)" P-INDEP
 ;* V41 tmp39        [V41    ] (  0,  0   )     int  ->  zero-ref    "field V24._length (fldOffset=0x8)" P-INDEP
 ;* V42 tmp40        [V42    ] (  0,  0   )   byref  ->  zero-ref    single-def "field V25._reference (fldOffset=0x0)" P-INDEP
 ;* V43 tmp41        [V43    ] (  0,  0   )     int  ->  zero-ref    "field V25._length (fldOffset=0x8)" P-INDEP
-;  V44 tmp42        [V44,T09] (  2,  2   )     int  ->  rdi         "argument with side effect"
-;  V45 cse0         [V45,T13] (  3,  1.50)     int  ->  rcx         "CSE #01: moderate"
+;  V44 tmp42        [V44,T08] (  2,  2   )     int  ->  rdi         "argument with side effect"
+;  V45 cse0         [V45,T12] (  3,  1.50)     int  ->  rcx         "CSE #01: moderate"
 ;
 ; Lcl frame size = 8
 
 G_M48331_IG01:
        push     rbp
        push     rbx
        push     rax
        lea      rbp, [rsp+0x10]
        mov      rbx, rdi
 						;; size=11 bbWeight=1 PerfScore 3.75
 G_M48331_IG02:
-       mov      rdi, rbx
-       mov      rsi, 0xD1FFAB1E      ; System.Text.Json.Nodes.JsonValue
-       mov      rdx, 0xD1FFAB1E      ; token handle
-       mov      rax, 0xD1FFAB1E      ; code for CORINFO_HELP_VIRTUAL_FUNC_PTR
-       call     [rax]CORINFO_HELP_VIRTUAL_FUNC_PTR
+       cmp      byte  ptr [rbx], bl
        lea      rsi, [rbp-0x10]
        mov      rdi, rbx
-       call     rax
+       mov      rax, 0xD1FFAB1E      ; code for System.Text.Json.Nodes.JsonValueOfElement:TryGetValue[long](byref):ubyte:this
+       call     [rax]System.Text.Json.Nodes.JsonValueOfElement:TryGetValue[long](byref):ubyte:this
        test     eax, eax
        je       SHORT G_M48331_IG04
        mov      rax, qword ptr [rbp-0x10]
-						;; size=52 bbWeight=1 PerfScore 10.00
+						;; size=29 bbWeight=1 PerfScore 9.25
 G_M48331_IG03:
        add      rsp, 8
        pop      rbx
        pop      rbp
        ret      
 						;; size=7 bbWeight=1 PerfScore 2.25
 G_M48331_IG04:
        add      rbx, 24
        mov      rdi, gword ptr [rbx]
        test     rdi, rdi
        je       SHORT G_M48331_IG10
        mov      eax, dword ptr [rbx+0x08]
        cmp      dword ptr [rdi+0x2C], 0
        je       SHORT G_M48331_IG09
        mov      rdi, gword ptr [rdi+0x30]
        add      eax, 8
        test     rdi, rdi
        je       SHORT G_M48331_IG05
        mov      ecx, dword ptr [rdi+0x08]
        cmp      ecx, eax
        jb       SHORT G_M48331_IG08
        mov      edx, eax
        lea      rdi, bword ptr [rdi+rdx+0x10]
        sub      ecx, eax
        jmp      SHORT G_M48331_IG06
 						;; size=51 bbWeight=0.50 PerfScore 9.88
 G_M48331_IG05:
        test     eax, eax
        jne      SHORT G_M48331_IG08
        xor      rdi, rdi
        xor      ecx, ecx
 						;; size=8 bbWeight=0.50 PerfScore 0.88
 G_M48331_IG06:
        cmp      ecx, 4
        jl       SHORT G_M48331_IG07
        mov      edi, dword ptr [rdi]
        shr      edi, 28
        movzx    rdi, dil
        jmp      SHORT G_M48331_IG11
 						;; size=16 bbWeight=0.50 PerfScore 3.00
 G_M48331_IG07:
        mov      edi, 40
        mov      rax, 0xD1FFAB1E      ; code for System.ThrowHelper:ThrowArgumentOutOfRangeException(int)
        call     [rax]System.ThrowHelper:ThrowArgumentOutOfRangeException(int)
        int3     
 						;; size=18 bbWeight=0.50 PerfScore 1.88
 G_M48331_IG08:
        mov      rax, 0xD1FFAB1E      ; code for System.ThrowHelper:ThrowArgumentOutOfRangeException()
        call     [rax]System.ThrowHelper:ThrowArgumentOutOfRangeException()
        int3     
 						;; size=13 bbWeight=0.50 PerfScore 1.75
 G_M48331_IG09:
        mov      rax, 0xD1FFAB1E      ; code for System.Text.Json.ThrowHelper:ThrowObjectDisposedException_JsonDocument()
        call     [rax]System.Text.Json.ThrowHelper:ThrowObjectDisposedException_JsonDocument()
        int3     
 						;; size=13 bbWeight=0.50 PerfScore 1.75
 G_M48331_IG10:
        xor      edi, edi
 						;; size=2 bbWeight=0.50 PerfScore 0.12
 G_M48331_IG11:
        mov      rax, 0xD1FFAB1E      ; code for System.Text.Json.JsonReaderHelper:ToValueKind(ubyte):ubyte
        call     [rax]System.Text.Json.JsonReaderHelper:ToValueKind(ubyte):ubyte
        mov      edi, eax
        mov      rsi, 0xD1FFAB1E      ; 'System.Int64'
        mov      rax, 0xD1FFAB1E      ; code for System.Text.Json.ThrowHelper:ThrowInvalidOperationException_NodeUnableToConvertElement(ubyte,System.Type)
        call     [rax]System.Text.Json.ThrowHelper:ThrowInvalidOperationException_NodeUnableToConvertElement(ubyte,System.Type)
        int3     
 						;; size=37 bbWeight=0.50 PerfScore 3.62
 
-; Total bytes of code 228, prolog size 8, PerfScore 38.88, instruction count 66, allocated bytes for code 228 (MethodHash=948b4334) for method System.Text.Json.Nodes.JsonValueOfElement:GetValue[long]():long:this (FullOpts)
+; Total bytes of code 205, prolog size 8, PerfScore 38.12, instruction count 63, allocated bytes for code 205 (MethodHash=948b4334) for method System.Text.Json.Nodes.JsonValueOfElement:GetValue[long]():long:this (FullOpts)
 ; ============================================================
-23 (-10.04 % of base) - System.Text.Json.Nodes.JsonValueOfElement:GetValue[short]():short:this
 ; Assembly listing for method System.Text.Json.Nodes.JsonValueOfElement:GetValue[short]():short: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; 8 single block inlinees; 4 inlinees without PGO data
 ; Final local variable assignments
 ;
 ;  V00 this         [V00,T00] (  5,  4.50)     ref  ->  rbx         this class-hnd single-def <System.Text.Json.Nodes.JsonValueOfElement>
 ;  V01 loc0         [V01    ] (  2,  2   )   short  ->  [rbp-0x10]  do-not-enreg[X] addr-exposed ld-addr-op
 ;# V02 OutArgs      [V02    ] (  1,  1   )  struct ( 0) [rsp+0x00]  do-not-enreg[XS] addr-exposed "OutgoingArgSpace" <Empty>
-;  V03 tmp1         [V03,T04] (  2,  4   )    long  ->  rax         "VirtualCall through function pointer"
-;  V04 tmp2         [V04,T05] (  3,  3   )   byref  ->  rbx         single-def "Inlining Arg"
-;  V05 tmp3         [V05,T11] (  3,  1.50)   ubyte  ->  rdi         "Inline return value spill temp"
+;* V03 tmp1         [V03    ] (  0,  0   )    long  ->  zero-ref    "VirtualCall through function pointer"
+;  V04 tmp2         [V04,T04] (  3,  3   )   byref  ->  rbx         single-def "Inlining Arg"
+;  V05 tmp3         [V05,T10] (  3,  1.50)   ubyte  ->  rdi         "Inline return value spill temp"
 ;  V06 tmp4         [V06,T02] (  4,  4   )     ref  ->  rdi         class-hnd exact single-def "dup spill" <System.Text.Json.JsonDocument>
 ;* V07 tmp5         [V07    ] (  0,  0   )     ref  ->  zero-ref    single-def
-;  V08 tmp6         [V08,T07] (  2,  2   )     int  ->  rax         "Inlining Arg"
+;  V08 tmp6         [V08,T06] (  2,  2   )     int  ->  rax         "Inlining Arg"
 ;* V09 tmp7         [V09    ] (  0,  0   )   byref  ->  zero-ref    "Inlining Arg"
 ;* V10 tmp8         [V10    ] (  0,  0   )   byref  ->  zero-ref    "Inlining Arg"
 ;* V11 tmp9         [V11    ] (  0,  0   )  struct (16) zero-ref    "spilled call-like call argument" <System.Span`1[ubyte]>
 ;* V12 tmp10        [V12    ] (  0,  0   )  struct (16) zero-ref    "spilled call-like call argument" <System.ReadOnlySpan`1[ubyte]>
 ;* V13 tmp11        [V13    ] (  0,  0   )  struct (16) zero-ref    "Inline return value spill temp" <System.Span`1[ubyte]>
 ;  V14 tmp12        [V14,T03] (  4,  4   )     ref  ->  rdi         class-hnd single-def "Inlining Arg" <ubyte[]>
 ;  V15 tmp13        [V15,T01] (  5,  5   )     int  ->  rax         "Inlining Arg"
 ;* V16 tmp14        [V16    ] (  0,  0   )  struct (16) zero-ref    ld-addr-op "NewObj constructor temp" <System.Span`1[ubyte]>
 ;* V17 tmp15        [V17    ] (  0,  0   )  struct (16) zero-ref    ld-addr-op "Inline ldloca(s) first use temp" <System.Span`1[ubyte]>
-;  V18 tmp16        [V18,T06] (  2,  2   )   byref  ->  rdi         single-def "Inlining Arg"
-;  V19 tmp17        [V19,T08] (  2,  2   )     int  ->  rcx         "Inlining Arg"
+;  V18 tmp16        [V18,T05] (  2,  2   )   byref  ->  rdi         single-def "Inlining Arg"
+;  V19 tmp17        [V19,T07] (  2,  2   )     int  ->  rcx         "Inlining Arg"
 ;* V20 tmp18        [V20    ] (  0,  0   )  struct (16) zero-ref    ld-addr-op "Inlining Arg" <System.Span`1[ubyte]>
 ;* V21 tmp19        [V21    ] (  0,  0   )  struct (16) zero-ref    ld-addr-op "NewObj constructor temp" <System.ReadOnlySpan`1[ubyte]>
 ;* V22 tmp20        [V22    ] (  0,  0   )   byref  ->  zero-ref    single-def "Inlining Arg"
 ;* V23 tmp21        [V23    ] (  0,  0   )     int  ->  zero-ref    "Inlining Arg"
 ;* V24 tmp22        [V24    ] (  0,  0   )  struct (16) zero-ref    ld-addr-op "Inlining Arg" <System.ReadOnlySpan`1[ubyte]>
 ;* V25 tmp23        [V25    ] (  0,  0   )  struct (16) zero-ref    ld-addr-op "Inlining Arg" <System.ReadOnlySpan`1[ubyte]>
 ;* V26 tmp24        [V26    ] (  0,  0   )   byref  ->  zero-ref    "field V11._reference (fldOffset=0x0)" P-INDEP
 ;* V27 tmp25        [V27    ] (  0,  0   )     int  ->  zero-ref    "field V11._length (fldOffset=0x8)" P-INDEP
 ;* V28 tmp26        [V28    ] (  0,  0   )   byref  ->  zero-ref    "field V12._reference (fldOffset=0x0)" P-INDEP
 ;* V29 tmp27        [V29    ] (  0,  0   )     int  ->  zero-ref    "field V12._length (fldOffset=0x8)" P-INDEP
-;  V30 tmp28        [V30,T10] (  3,  1.50)   byref  ->  rdi         "field V13._reference (fldOffset=0x0)" P-INDEP
-;  V31 tmp29        [V31,T12] (  3,  1.50)     int  ->  rcx         "field V13._length (fldOffset=0x8)" P-INDEP
-;  V32 tmp30        [V32,T14] (  2,  1   )   byref  ->  rdi         single-def "field V16._reference (fldOffset=0x0)" P-INDEP
-;  V33 tmp31        [V33,T15] (  2,  1   )     int  ->  rcx         "field V16._length (fldOffset=0x8)" P-INDEP
+;  V30 tmp28        [V30,T09] (  3,  1.50)   byref  ->  rdi         "field V13._reference (fldOffset=0x0)" P-INDEP
+;  V31 tmp29        [V31,T11] (  3,  1.50)     int  ->  rcx         "field V13._length (fldOffset=0x8)" P-INDEP
+;  V32 tmp30        [V32,T13] (  2,  1   )   byref  ->  rdi         single-def "field V16._reference (fldOffset=0x0)" P-INDEP
+;  V33 tmp31        [V33,T14] (  2,  1   )     int  ->  rcx         "field V16._length (fldOffset=0x8)" P-INDEP
 ;* V34 tmp32        [V34    ] (  0,  0   )   byref  ->  zero-ref    single-def "field V17._reference (fldOffset=0x0)" P-INDEP
 ;* V35 tmp33        [V35    ] (  0,  0   )     int  ->  zero-ref    "field V17._length (fldOffset=0x8)" P-INDEP
 ;* V36 tmp34        [V36    ] (  0,  0   )   byref  ->  zero-ref    single-def "field V20._reference (fldOffset=0x0)" P-INDEP
 ;* V37 tmp35        [V37    ] (  0,  0   )     int  ->  zero-ref    "field V20._length (fldOffset=0x8)" P-INDEP
 ;* V38 tmp36        [V38    ] (  0,  0   )   byref  ->  zero-ref    single-def "field V21._reference (fldOffset=0x0)" P-INDEP
 ;* V39 tmp37        [V39    ] (  0,  0   )     int  ->  zero-ref    "field V21._length (fldOffset=0x8)" P-INDEP
 ;* V40 tmp38        [V40    ] (  0,  0   )   byref  ->  zero-ref    single-def "field V24._reference (fldOffset=0x0)" P-INDEP
 ;* V41 tmp39        [V41    ] (  0,  0   )     int  ->  zero-ref    "field V24._length (fldOffset=0x8)" P-INDEP
 ;* V42 tmp40        [V42    ] (  0,  0   )   byref  ->  zero-ref    single-def "field V25._reference (fldOffset=0x0)" P-INDEP
 ;* V43 tmp41        [V43    ] (  0,  0   )     int  ->  zero-ref    "field V25._length (fldOffset=0x8)" P-INDEP
-;  V44 tmp42        [V44,T09] (  2,  2   )     int  ->  rdi         "argument with side effect"
-;  V45 cse0         [V45,T13] (  3,  1.50)     int  ->  rcx         "CSE #01: moderate"
+;  V44 tmp42        [V44,T08] (  2,  2   )     int  ->  rdi         "argument with side effect"
+;  V45 cse0         [V45,T12] (  3,  1.50)     int  ->  rcx         "CSE #01: moderate"
 ;
 ; Lcl frame size = 8
 
 G_M15051_IG01:
        push     rbp
        push     rbx
        push     rax
        lea      rbp, [rsp+0x10]
        mov      rbx, rdi
 						;; size=11 bbWeight=1 PerfScore 3.75
 G_M15051_IG02:
-       mov      rdi, rbx
-       mov      rsi, 0xD1FFAB1E      ; System.Text.Json.Nodes.JsonValue
-       mov      rdx, 0xD1FFAB1E      ; token handle
-       mov      rax, 0xD1FFAB1E      ; code for CORINFO_HELP_VIRTUAL_FUNC_PTR
-       call     [rax]CORINFO_HELP_VIRTUAL_FUNC_PTR
+       cmp      byte  ptr [rbx], bl
        lea      rsi, [rbp-0x10]
        mov      rdi, rbx
-       call     rax
+       mov      rax, 0xD1FFAB1E      ; code for System.Text.Json.Nodes.JsonValueOfElement:TryGetValue[short](byref):ubyte:this
+       call     [rax]System.Text.Json.Nodes.JsonValueOfElement:TryGetValue[short](byref):ubyte:this
        test     eax, eax
        je       SHORT G_M15051_IG04
        movsx    rax, word  ptr [rbp-0x10]
-						;; size=53 bbWeight=1 PerfScore 12.00
+						;; size=30 bbWeight=1 PerfScore 11.25
 G_M15051_IG03:
        add      rsp, 8
        pop      rbx
        pop      rbp
        ret      
 						;; size=7 bbWeight=1 PerfScore 2.25
 G_M15051_IG04:
        add      rbx, 24
        mov      rdi, gword ptr [rbx]
        test     rdi, rdi
        je       SHORT G_M15051_IG10
        mov      eax, dword ptr [rbx+0x08]
        cmp      dword ptr [rdi+0x2C], 0
        je       SHORT G_M15051_IG09
        mov      rdi, gword ptr [rdi+0x30]
        add      eax, 8
        test     rdi, rdi
        je       SHORT G_M15051_IG05
        mov      ecx, dword ptr [rdi+0x08]
        cmp      ecx, eax
        jb       SHORT G_M15051_IG08
        mov      edx, eax
        lea      rdi, bword ptr [rdi+rdx+0x10]
        sub      ecx, eax
        jmp      SHORT G_M15051_IG06
 						;; size=51 bbWeight=0.50 PerfScore 9.88
 G_M15051_IG05:
        test     eax, eax
        jne      SHORT G_M15051_IG08
        xor      rdi, rdi
        xor      ecx, ecx
 						;; size=8 bbWeight=0.50 PerfScore 0.88
 G_M15051_IG06:
        cmp      ecx, 4
        jl       SHORT G_M15051_IG07
        mov      edi, dword ptr [rdi]
        shr      edi, 28
        movzx    rdi, dil
        jmp      SHORT G_M15051_IG11
 						;; size=16 bbWeight=0.50 PerfScore 3.00
 G_M15051_IG07:
        mov      edi, 40
        mov      rax, 0xD1FFAB1E      ; code for System.ThrowHelper:ThrowArgumentOutOfRangeException(int)
        call     [rax]System.ThrowHelper:ThrowArgumentOutOfRangeException(int)
        int3     
 						;; size=18 bbWeight=0.50 PerfScore 1.88
 G_M15051_IG08:
        mov      rax, 0xD1FFAB1E      ; code for System.ThrowHelper:ThrowArgumentOutOfRangeException()
        call     [rax]System.ThrowHelper:ThrowArgumentOutOfRangeException()
        int3     
 						;; size=13 bbWeight=0.50 PerfScore 1.75
 G_M15051_IG09:
        mov      rax, 0xD1FFAB1E      ; code for System.Text.Json.ThrowHelper:ThrowObjectDisposedException_JsonDocument()
        call     [rax]System.Text.Json.ThrowHelper:ThrowObjectDisposedException_JsonDocument()
        int3     
 						;; size=13 bbWeight=0.50 PerfScore 1.75
 G_M15051_IG10:
        xor      edi, edi
 						;; size=2 bbWeight=0.50 PerfScore 0.12
 G_M15051_IG11:
        mov      rax, 0xD1FFAB1E      ; code for System.Text.Json.JsonReaderHelper:ToValueKind(ubyte):ubyte
        call     [rax]System.Text.Json.JsonReaderHelper:ToValueKind(ubyte):ubyte
        mov      edi, eax
        mov      rsi, 0xD1FFAB1E      ; 'System.Int16'
        mov      rax, 0xD1FFAB1E      ; code for System.Text.Json.ThrowHelper:ThrowInvalidOperationException_NodeUnableToConvertElement(ubyte,System.Type)
        call     [rax]System.Text.Json.ThrowHelper:ThrowInvalidOperationException_NodeUnableToConvertElement(ubyte,System.Type)
        int3     
 						;; size=37 bbWeight=0.50 PerfScore 3.62
 
-; Total bytes of code 229, prolog size 8, PerfScore 40.88, instruction count 66, allocated bytes for code 229 (MethodHash=4815c534) for method System.Text.Json.Nodes.JsonValueOfElement:GetValue[short]():short:this (FullOpts)
+; Total bytes of code 206, prolog size 8, PerfScore 40.12, instruction count 63, allocated bytes for code 206 (MethodHash=4815c534) for method System.Text.Json.Nodes.JsonValueOfElement:GetValue[short]():short:this (FullOpts)
 ; ============================================================

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

@MihuBot
Copy link
Owner Author

MihuBot commented Feb 10, 2025

@hez2010

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