forked from MihaZupan/runtime-utils
-
Notifications
You must be signed in to change notification settings - Fork 0
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 #1004
Comments
Top method regressions389 (169.13 % of base) - System.Linq.Parallel.SortQueryOperatorResults`2+ChildResultsRecipient[System.__Canon,System.Nullable`1[int]]:Receive[double](System.Linq.Parallel.PartitionedStream`2[System.__Canon,double]):this ; Assembly listing for method System.Linq.Parallel.SortQueryOperatorResults`2+ChildResultsRecipient[System.__Canon,System.Nullable`1[int]]:Receive[double](System.Linq.Parallel.PartitionedStream`2[System.__Canon,double]):this (FullOpts)
; Emitting BLENDED_CODE for X64 with AVX512 - Unix
; FullOpts code
; optimized code
; rbp based frame
-; partially interruptible
+; fully interruptible
; No PGO data
+; 0 inlinees with PGO data; 10 single block inlinees; 1 inlinees without PGO data
; Final local variable assignments
;
-; V00 this [V00,T01] ( 5, 5 ) ref -> r15 this class-hnd single-def <System.Linq.Parallel.SortQueryOperatorResults`2+ChildResultsRecipient[System.__Canon,System.Nullable`1[int]]>
-; V01 TypeCtx [V01,T00] ( 7, 5.40) long -> rbx single-def
-; V02 arg1 [V02,T05] ( 3, 3 ) ref -> r14 class-hnd single-def <System.Linq.Parallel.PartitionedStream`2[System.__Canon,double]>
-; V03 OutArgs [V03 ] ( 1, 1 ) struct (48) [rsp+0x00] do-not-enreg[XS] addr-exposed "OutgoingArgSpace" <UNNAMED>
-; V04 tmp1 [V04,T02] ( 3, 6 ) ref -> r13 single-def "LDVIRTFTN this pointer"
+; V00 this [V00,T11] ( 4, 4 ) ref -> r15 this class-hnd single-def <System.Linq.Parallel.SortQueryOperatorResults`2+ChildResultsRecipient[System.__Canon,System.Nullable`1[int]]>
+; V01 TypeCtx [V01,T10] ( 5, 4.20) long -> rsi single-def
+; V02 arg1 [V02,T09] ( 4, 7 ) ref -> rbx class-hnd single-def <System.Linq.Parallel.PartitionedStream`2[System.__Canon,double]>
+;# V03 OutArgs [V03 ] ( 1, 1 ) struct ( 0) [rsp+0x00] do-not-enreg[XS] addr-exposed "OutgoingArgSpace" <Empty>
+; V04 tmp1 [V04,T03] ( 5, 16 ) ref -> r14 class-hnd exact single-def "LDVIRTFTN this pointer" <System.Linq.Parallel.SortQueryOperator`2[System.__Canon,System.Nullable`1[int]]>
;* V05 tmp2 [V05 ] ( 0, 0 ) long -> zero-ref "spilling helperCall"
;* V06 tmp3 [V06 ] ( 0, 0 ) long -> zero-ref "spilling helperCall"
-; V07 tmp4 [V07,T08] ( 2, 4 ) long -> rax "VirtualCall through function pointer"
-; V08 tmp5 [V08,T09] ( 2, 4 ) long -> r12 "argument with side effect"
-; V09 tmp6 [V09,T10] ( 2, 4 ) long -> rdx "argument with side effect"
-; V10 rat0 [V10,T06] ( 3, 4 ) long -> r12 "runtime lookup"
-; V11 rat1 [V11,T03] ( 3, 5.60) long -> r12 "fgMakeTemp is creating a new local variable"
-; V12 rat2 [V12,T07] ( 3, 4 ) long -> rdx "runtime lookup"
-; V13 rat3 [V13,T04] ( 3, 5.60) long -> rdx "fgMakeTemp is creating a new local variable"
+; V07 tmp4 [V07,T26] ( 2, 4 ) int -> r12 "impAppendStmt"
+; V08 tmp5 [V08,T24] ( 2, 4 ) ref -> [rbp-0x50] class-hnd spill-single-def "impAppendStmt" <System.Collections.Generic.IComparer`1[System.Nullable`1[int]]>
+; V09 tmp6 [V09,T06] ( 6, 12 ) ref -> [rbp-0x58] class-hnd exact spill-single-def "NewObj constructor temp" <System.Linq.Parallel.PartitionedStream`2[System.__Canon,System.Nullable`1[int]]>
+; V10 tmp7 [V10,T08] ( 10, 9.80) long -> r13 "Inlining Arg"
+;* V11 tmp8 [V11 ] ( 0, 0 ) long -> zero-ref "spilling helperCall"
+; V12 tmp9 [V12,T07] ( 5, 11 ) ref -> r12 class-hnd exact single-def "Inline stloc first use temp" <System.Linq.Parallel.PartitionedStream`2[System.__Canon,System.Nullable`1[int]]>
+;* V13 tmp10 [V13,T34] ( 0, 0 ) int -> zero-ref "Inline stloc first use temp"
+; V14 tmp11 [V14,T00] ( 4, 32 ) ref -> [rbp-0x60] class-hnd exact spill-single-def "NewObj constructor temp" <System.Linq.Parallel.SortQueryOperatorEnumerator`3[System.__Canon,double,System.Nullable`1[int]]>
+;* V15 tmp12 [V15 ] ( 0, 0 ) long -> zero-ref "spilling helperCall"
+; V16 tmp13 [V16,T12] ( 3, 6 ) ref -> r15 class-hnd single-def "Inlining Arg" <System.Linq.Parallel.IPartitionedStreamRecipient`1[System.__Canon]>
+;* V17 tmp14 [V17 ] ( 0, 0 ) long -> zero-ref "spilling helperCall"
+;* V18 tmp15 [V18 ] ( 0, 0 ) long -> zero-ref "spilling helperCall"
+;* V19 tmp16 [V19 ] ( 0, 0 ) long -> zero-ref "spilling helperCall"
+; V20 tmp17 [V20,T25] ( 2, 4 ) ref -> rax class-hnd exact single-def "NewArr temp" <System.__Canon[]>
+; V21 tmp18 [V21,T27] ( 2, 4 ) ubyte -> [rbp-0x34] spill-single-def "Inlining Arg"
+; V22 tmp19 [V22,T04] ( 2, 16 ) ref -> rsi class-hnd "Inlining Arg" <System.__Canon>
+; V23 tmp20 [V23,T05] ( 2, 16 ) ref -> [rbp-0x68] class-hnd spill-single-def "Inlining Arg" <System.Func`2[System.__Canon,System.Nullable`1[int]]>
+; V24 tmp21 [V24,T28] ( 2, 4 ) long -> rax "Spilling to split statement for tree"
+; V25 tmp22 [V25,T29] ( 2, 4 ) long -> rdi "argument with side effect"
+; V26 tmp23 [V26,T02] ( 3, 24 ) ref -> rdi "arr expr"
+; V27 tmp24 [V27,T30] ( 2, 4 ) long -> rbx "argument with side effect"
+; V28 tmp25 [V28,T31] ( 2, 4 ) long -> rdx "argument with side effect"
+; V29 cse0 [V29,T19] ( 2, 4.25) long -> [rbp-0x40] spill-single-def hoist "CSE #01: moderate"
+; V30 rat0 [V30,T01] ( 7, 25 ) long -> [rbp-0x48] "Widened IV V13"
+; V31 rat1 [V31,T13] ( 3, 5.60) long -> r13 "fgMakeTemp is creating a new local variable"
+; V32 rat2 [V32,T20] ( 3, 4 ) long -> rdi "runtime lookup"
+; V33 rat3 [V33,T14] ( 3, 5.60) long -> rdi "fgMakeTemp is creating a new local variable"
+; V34 rat4 [V34,T18] ( 3, 4.40) long -> rdi "Spilling to split statement for tree"
+; V35 rat5 [V35,T21] ( 3, 4 ) long -> rdi "runtime lookup"
+; V36 rat6 [V36,T15] ( 3, 5.60) long -> rdx "fgMakeTemp is creating a new local variable"
+; V37 rat7 [V37,T33] ( 3, 1 ) long -> rcx "runtime lookup"
+; V38 rat8 [V38,T32] ( 3, 1.40) long -> rcx "fgMakeTemp is creating a new local variable"
+; V39 rat9 [V39,T22] ( 3, 4 ) long -> rbx "runtime lookup"
+; V40 rat10 [V40,T16] ( 3, 5.60) long -> rbx "fgMakeTemp is creating a new local variable"
+; V41 rat11 [V41,T23] ( 3, 4 ) long -> rdx "runtime lookup"
+; V42 rat12 [V42,T17] ( 3, 5.60) long -> rdx "fgMakeTemp is creating a new local variable"
;
-; Lcl frame size = 56
+; Lcl frame size = 72
G_M16955_IG01:
push rbp
push r15
push r14
push r13
push r12
push rbx
- sub rsp, 56
- lea rbp, [rsp+0x60]
+ sub rsp, 72
+ lea rbp, [rsp+0x70]
mov qword ptr [rbp-0x30], rsi
mov r15, rdi
- mov rbx, rsi
- mov r14, rdx
- ;; size=32 bbWeight=1 PerfScore 8.50
+ mov rbx, rdx
+ ;; size=29 bbWeight=1 PerfScore 8.25
G_M16955_IG02:
- mov r13, gword ptr [r15+0x10]
- mov rdi, qword ptr [rbx+0x18]
- mov r12, qword ptr [rdi+0x10]
- test r12, r12
- je SHORT G_M16955_IG06
- ;; size=17 bbWeight=1 PerfScore 7.25
+ mov r14, gword ptr [r15+0x10]
+ mov rdi, qword ptr [rsi+0x18]
+ mov r13, qword ptr [rdi+0x18]
+ test r13, r13
+ je G_M16955_IG14
+ ;; size=21 bbWeight=1 PerfScore 7.25
G_M16955_IG03:
- mov rdi, qword ptr [rbx+0x18]
- mov rdx, qword ptr [rdi+0x18]
- test rdx, rdx
- je G_M16955_IG07
- ;; size=17 bbWeight=1 PerfScore 5.25
+ mov r15, gword ptr [r15+0x08]
+ cmp byte ptr [r14], r14b
+ mov rdi, gword ptr [rbx+0x08]
+ mov r12d, dword ptr [rdi+0x08]
+ mov rax, gword ptr [r14+0x50]
+ mov gword ptr [rbp-0x50], rax
+ mov rdi, qword ptr [r13+0x18]
+ mov rdi, qword ptr [rdi+0x10]
+ test rdi, rdi
+ je G_M16955_IG15
+ ;; size=40 bbWeight=1 PerfScore 17.25
G_M16955_IG04:
- mov rsi, r12
- mov rdi, r13
+ call CORINFO_HELP_NEWSFAST
+ mov gword ptr [rbp-0x58], rax
+ movzx rcx, byte ptr [r14+0x39]
+ mov dword ptr [rbp-0x34], ecx
+ mov rdi, qword ptr [rax]
+ mov rsi, qword ptr [rdi+0x30]
+ mov rsi, qword ptr [rsi]
+ mov rdx, qword ptr [rsi+0x18]
+ test rdx, rdx
+ je G_M16955_IG16
+ ;; size=40 bbWeight=1 PerfScore 14.25
+G_M16955_IG05:
+ mov rdi, rdx
+ ;; size=3 bbWeight=0.80 PerfScore 0.20
+G_M16955_IG06:
+ mov esi, r12d
+ call CORINFO_HELP_NEWARR_1_OBJ
+ mov r12, gword ptr [rbp-0x58]
+ lea rdi, bword ptr [r12+0x08]
+ mov rsi, rax
+ call CORINFO_HELP_ASSIGN_REF
+ lea rdi, bword ptr [r12+0x10]
+ mov rsi, gword ptr [rbp-0x50]
+ call CORINFO_HELP_ASSIGN_REF
+ mov edi, dword ptr [rbp-0x34]
+ mov byte ptr [r12+0x18], dil
+ xor eax, eax
+ mov qword ptr [rbp-0x48], rax
+ mov rdi, gword ptr [r12+0x08]
+ cmp dword ptr [rdi+0x08], 0
+ jle G_M16955_IG10
+ ;; size=68 bbWeight=1 PerfScore 15.75
+G_M16955_IG07:
+ mov rdi, qword ptr [r13+0x18]
+ mov rcx, qword ptr [rdi+0x18]
+ test rcx, rcx
+ je G_M16955_IG17
+ ;; size=17 bbWeight=0.25 PerfScore 1.31
+G_M16955_IG08:
+ mov qword ptr [rbp-0x40], rcx
+ ;; size=4 bbWeight=0.25 PerfScore 0.25
+G_M16955_IG09:
+ mov rdi, rcx
+ call CORINFO_HELP_NEWSFAST
+ mov gword ptr [rbp-0x60], rax
+ mov rdi, gword ptr [rbx+0x08]
+ mov rcx, qword ptr [rbp-0x48]
+ cmp ecx, dword ptr [rdi+0x08]
+ jae G_M16955_IG20
+ mov qword ptr [rbp-0x48], rcx
+ mov rsi, gword ptr [rdi+8*rcx+0x10]
+ mov rdx, gword ptr [r14+0x48]
+ mov gword ptr [rbp-0x68], rdx
+ lea rdi, bword ptr [rax+0x08]
+ call CORINFO_HELP_ASSIGN_REF
+ mov rax, gword ptr [rbp-0x60]
+ lea rdi, bword ptr [rax+0x10]
+ mov rsi, gword ptr [rbp-0x68]
+ call CORINFO_HELP_ASSIGN_REF
+ mov rdi, gword ptr [r12+0x08]
+ mov rsi, qword ptr [rbp-0x48]
+ mov rdx, gword ptr [rbp-0x60]
+ mov rax, 0xD1FFAB1E ; code for CORINFO_HELP_ARRADDR_ST
+ call [rax]CORINFO_HELP_ARRADDR_ST
+ mov rdi, qword ptr [rbp-0x48]
+ inc edi
+ mov rsi, gword ptr [r12+0x08]
+ cmp dword ptr [rsi+0x08], edi
+ mov qword ptr [rbp-0x48], rdi
+ mov rcx, qword ptr [rbp-0x40]
+ jg SHORT G_M16955_IG09
+ ;; size=121 bbWeight=4 PerfScore 147.00
+G_M16955_IG10:
+ mov rdi, qword ptr [r13+0x18]
+ mov rbx, qword ptr [rdi+0x20]
+ test rbx, rbx
+ je G_M16955_IG18
+ ;; size=17 bbWeight=1 PerfScore 5.25
+G_M16955_IG11:
+ mov rdi, qword ptr [r13+0x18]
+ mov rdx, qword ptr [rdi+0x28]
+ test rdx, rdx
+ je G_M16955_IG19
+ ;; size=17 bbWeight=1 PerfScore 5.25
+G_M16955_IG12:
+ mov rsi, rbx
+ mov rdi, r15
mov rax, 0xD1FFAB1E ; code for CORINFO_HELP_VIRTUAL_FUNC_PTR
call [rax]CORINFO_HELP_VIRTUAL_FUNC_PTR
- lea rdx, bword ptr [r15+0x18]
- lea rdi, [rsp]
- mov rsi, rdx
- mov rcx, gword ptr [rsi]
- mov gword ptr [rsp], rcx
- add rsi, 8
- add rdi, 8
- mov rcx, gword ptr [rsi]
- mov gword ptr [rsp+0x08], rcx
- add rsi, 8
- add rdi, 8
- mov ecx, 4
- rep movsq
- mov rdx, gword ptr [r15+0x08]
- mov rdi, r13
- mov rsi, r14
- xor ecx, ecx
- call rax
- nop
- ;; size=83 bbWeight=1 PerfScore 43.25
-G_M16955_IG05:
- add rsp, 56
+ mov rdi, r15
+ mov rsi, r12
+ ;; size=24 bbWeight=1 PerfScore 4.25
+G_M16955_IG13:
+ add rsp, 72
pop rbx
pop r12
pop r13
pop r14
pop r15
pop rbp
- ret
- ;; size=15 bbWeight=1 PerfScore 4.25
-G_M16955_IG06:
- mov rdi, rbx
+ tail.jmp rax
+ ;; size=17 bbWeight=1 PerfScore 5.25
+G_M16955_IG14:
+ mov rdi, rsi
mov rsi, 0xD1FFAB1E ; global ptr
mov rax, 0xD1FFAB1E ; code for CORINFO_HELP_RUNTIMEHANDLE_METHOD
call [rax]CORINFO_HELP_RUNTIMEHANDLE_METHOD
- mov r12, rax
+ mov r13, rax
jmp G_M16955_IG03
;; size=33 bbWeight=0.20 PerfScore 1.20
-G_M16955_IG07:
- mov rdi, rbx
+G_M16955_IG15:
+ mov rdi, r13
+ mov rsi, 0xD1FFAB1E ; global ptr
+ mov rcx, 0xD1FFAB1E ; code for CORINFO_HELP_RUNTIMEHANDLE_METHOD
+ call [rcx]CORINFO_HELP_RUNTIMEHANDLE_METHOD
+ mov rdi, rax
+ jmp G_M16955_IG04
+ ;; size=33 bbWeight=0.20 PerfScore 1.20
+G_M16955_IG16:
+ mov rsi, 0xD1FFAB1E ; global ptr
+ mov rdx, 0xD1FFAB1E ; code for CORINFO_HELP_RUNTIMEHANDLE_CLASS
+ call [rdx]CORINFO_HELP_RUNTIMEHANDLE_CLASS
+ mov rdi, rax
+ jmp G_M16955_IG06
+ ;; size=30 bbWeight=0.20 PerfScore 1.15
+G_M16955_IG17:
+ mov rdi, r13
+ mov rsi, 0xD1FFAB1E ; global ptr
+ mov rcx, 0xD1FFAB1E ; code for CORINFO_HELP_RUNTIMEHANDLE_METHOD
+ call [rcx]CORINFO_HELP_RUNTIMEHANDLE_METHOD
+ mov rcx, rax
+ jmp G_M16955_IG08
+ ;; size=33 bbWeight=0.05 PerfScore 0.30
+G_M16955_IG18:
+ mov rdi, r13
+ mov rsi, 0xD1FFAB1E ; global ptr
+ mov rax, 0xD1FFAB1E ; code for CORINFO_HELP_RUNTIMEHANDLE_METHOD
+ call [rax]CORINFO_HELP_RUNTIMEHANDLE_METHOD
+ mov rbx, rax
+ jmp G_M16955_IG11
+ ;; size=33 bbWeight=0.20 PerfScore 1.20
+G_M16955_IG19:
+ mov rdi, r13
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_M16955_IG04
+ jmp G_M16955_IG12
;; size=33 bbWeight=0.20 PerfScore 1.20
+G_M16955_IG20:
+ call CORINFO_HELP_RNGCHKFAIL
+ int3
+ ;; size=6 bbWeight=0 PerfScore 0.00
-; Total bytes of code 230, prolog size 23, PerfScore 70.90, instruction count 64, allocated bytes for code 230 (MethodHash=04c7bdc4) for method System.Linq.Parallel.SortQueryOperatorResults`2+ChildResultsRecipient[System.__Canon,System.Nullable`1[int]]:Receive[double](System.Linq.Parallel.PartitionedStream`2[System.__Canon,double]):this (FullOpts)
+; Total bytes of code 619, prolog size 29, PerfScore 237.76, instruction count 146, allocated bytes for code 619 (MethodHash=04c7bdc4) for method System.Linq.Parallel.SortQueryOperatorResults`2+ChildResultsRecipient[System.__Canon,System.Nullable`1[int]]:Receive[double](System.Linq.Parallel.PartitionedStream`2[System.__Canon,double]):this (FullOpts)
; ============================================================ 389 (169.13 % of base) - System.Linq.Parallel.SortQueryOperatorResults`2+ChildResultsRecipient[System.__Canon,System.Nullable`1[int]]:Receive[int](System.Linq.Parallel.PartitionedStream`2[System.__Canon,int]):this ; Assembly listing for method System.Linq.Parallel.SortQueryOperatorResults`2+ChildResultsRecipient[System.__Canon,System.Nullable`1[int]]:Receive[int](System.Linq.Parallel.PartitionedStream`2[System.__Canon,int]):this (FullOpts)
; Emitting BLENDED_CODE for X64 with AVX512 - Unix
; FullOpts code
; optimized code
; rbp based frame
-; partially interruptible
+; fully interruptible
; No PGO data
+; 0 inlinees with PGO data; 10 single block inlinees; 1 inlinees without PGO data
; Final local variable assignments
;
-; V00 this [V00,T01] ( 5, 5 ) ref -> r15 this class-hnd single-def <System.Linq.Parallel.SortQueryOperatorResults`2+ChildResultsRecipient[System.__Canon,System.Nullable`1[int]]>
-; V01 TypeCtx [V01,T00] ( 7, 5.40) long -> rbx single-def
-; V02 arg1 [V02,T05] ( 3, 3 ) ref -> r14 class-hnd single-def <System.Linq.Parallel.PartitionedStream`2[System.__Canon,int]>
-; V03 OutArgs [V03 ] ( 1, 1 ) struct (48) [rsp+0x00] do-not-enreg[XS] addr-exposed "OutgoingArgSpace" <UNNAMED>
-; V04 tmp1 [V04,T02] ( 3, 6 ) ref -> r13 single-def "LDVIRTFTN this pointer"
+; V00 this [V00,T11] ( 4, 4 ) ref -> r15 this class-hnd single-def <System.Linq.Parallel.SortQueryOperatorResults`2+ChildResultsRecipient[System.__Canon,System.Nullable`1[int]]>
+; V01 TypeCtx [V01,T10] ( 5, 4.20) long -> rsi single-def
+; V02 arg1 [V02,T09] ( 4, 7 ) ref -> rbx class-hnd single-def <System.Linq.Parallel.PartitionedStream`2[System.__Canon,int]>
+;# V03 OutArgs [V03 ] ( 1, 1 ) struct ( 0) [rsp+0x00] do-not-enreg[XS] addr-exposed "OutgoingArgSpace" <Empty>
+; V04 tmp1 [V04,T03] ( 5, 16 ) ref -> r14 class-hnd exact single-def "LDVIRTFTN this pointer" <System.Linq.Parallel.SortQueryOperator`2[System.__Canon,System.Nullable`1[int]]>
;* V05 tmp2 [V05 ] ( 0, 0 ) long -> zero-ref "spilling helperCall"
;* V06 tmp3 [V06 ] ( 0, 0 ) long -> zero-ref "spilling helperCall"
-; V07 tmp4 [V07,T08] ( 2, 4 ) long -> rax "VirtualCall through function pointer"
-; V08 tmp5 [V08,T09] ( 2, 4 ) long -> r12 "argument with side effect"
-; V09 tmp6 [V09,T10] ( 2, 4 ) long -> rdx "argument with side effect"
-; V10 rat0 [V10,T06] ( 3, 4 ) long -> r12 "runtime lookup"
-; V11 rat1 [V11,T03] ( 3, 5.60) long -> r12 "fgMakeTemp is creating a new local variable"
-; V12 rat2 [V12,T07] ( 3, 4 ) long -> rdx "runtime lookup"
-; V13 rat3 [V13,T04] ( 3, 5.60) long -> rdx "fgMakeTemp is creating a new local variable"
+; V07 tmp4 [V07,T26] ( 2, 4 ) int -> r12 "impAppendStmt"
+; V08 tmp5 [V08,T24] ( 2, 4 ) ref -> [rbp-0x50] class-hnd spill-single-def "impAppendStmt" <System.Collections.Generic.IComparer`1[System.Nullable`1[int]]>
+; V09 tmp6 [V09,T06] ( 6, 12 ) ref -> [rbp-0x58] class-hnd exact spill-single-def "NewObj constructor temp" <System.Linq.Parallel.PartitionedStream`2[System.__Canon,System.Nullable`1[int]]>
+; V10 tmp7 [V10,T08] ( 10, 9.80) long -> r13 "Inlining Arg"
+;* V11 tmp8 [V11 ] ( 0, 0 ) long -> zero-ref "spilling helperCall"
+; V12 tmp9 [V12,T07] ( 5, 11 ) ref -> r12 class-hnd exact single-def "Inline stloc first use temp" <System.Linq.Parallel.PartitionedStream`2[System.__Canon,System.Nullable`1[int]]>
+;* V13 tmp10 [V13,T34] ( 0, 0 ) int -> zero-ref "Inline stloc first use temp"
+; V14 tmp11 [V14,T00] ( 4, 32 ) ref -> [rbp-0x60] class-hnd exact spill-single-def "NewObj constructor temp" <System.Linq.Parallel.SortQueryOperatorEnumerator`3[System.__Canon,int,System.Nullable`1[int]]>
+;* V15 tmp12 [V15 ] ( 0, 0 ) long -> zero-ref "spilling helperCall"
+; V16 tmp13 [V16,T12] ( 3, 6 ) ref -> r15 class-hnd single-def "Inlining Arg" <System.Linq.Parallel.IPartitionedStreamRecipient`1[System.__Canon]>
+;* V17 tmp14 [V17 ] ( 0, 0 ) long -> zero-ref "spilling helperCall"
+;* V18 tmp15 [V18 ] ( 0, 0 ) long -> zero-ref "spilling helperCall"
+;* V19 tmp16 [V19 ] ( 0, 0 ) long -> zero-ref "spilling helperCall"
+; V20 tmp17 [V20,T25] ( 2, 4 ) ref -> rax class-hnd exact single-def "NewArr temp" <System.__Canon[]>
+; V21 tmp18 [V21,T27] ( 2, 4 ) ubyte -> [rbp-0x34] spill-single-def "Inlining Arg"
+; V22 tmp19 [V22,T04] ( 2, 16 ) ref -> rsi class-hnd "Inlining Arg" <System.__Canon>
+; V23 tmp20 [V23,T05] ( 2, 16 ) ref -> [rbp-0x68] class-hnd spill-single-def "Inlining Arg" <System.Func`2[System.__Canon,System.Nullable`1[int]]>
+; V24 tmp21 [V24,T28] ( 2, 4 ) long -> rax "Spilling to split statement for tree"
+; V25 tmp22 [V25,T29] ( 2, 4 ) long -> rdi "argument with side effect"
+; V26 tmp23 [V26,T02] ( 3, 24 ) ref -> rdi "arr expr"
+; V27 tmp24 [V27,T30] ( 2, 4 ) long -> rbx "argument with side effect"
+; V28 tmp25 [V28,T31] ( 2, 4 ) long -> rdx "argument with side effect"
+; V29 cse0 [V29,T19] ( 2, 4.25) long -> [rbp-0x40] spill-single-def hoist "CSE #01: moderate"
+; V30 rat0 [V30,T01] ( 7, 25 ) long -> [rbp-0x48] "Widened IV V13"
+; V31 rat1 [V31,T13] ( 3, 5.60) long -> r13 "fgMakeTemp is creating a new local variable"
+; V32 rat2 [V32,T20] ( 3, 4 ) long -> rdi "runtime lookup"
+; V33 rat3 [V33,T14] ( 3, 5.60) long -> rdi "fgMakeTemp is creating a new local variable"
+; V34 rat4 [V34,T18] ( 3, 4.40) long -> rdi "Spilling to split statement for tree"
+; V35 rat5 [V35,T21] ( 3, 4 ) long -> rdi "runtime lookup"
+; V36 rat6 [V36,T15] ( 3, 5.60) long -> rdx "fgMakeTemp is creating a new local variable"
+; V37 rat7 [V37,T33] ( 3, 1 ) long -> rcx "runtime lookup"
+; V38 rat8 [V38,T32] ( 3, 1.40) long -> rcx "fgMakeTemp is creating a new local variable"
+; V39 rat9 [V39,T22] ( 3, 4 ) long -> rbx "runtime lookup"
+; V40 rat10 [V40,T16] ( 3, 5.60) long -> rbx "fgMakeTemp is creating a new local variable"
+; V41 rat11 [V41,T23] ( 3, 4 ) long -> rdx "runtime lookup"
+; V42 rat12 [V42,T17] ( 3, 5.60) long -> rdx "fgMakeTemp is creating a new local variable"
;
-; Lcl frame size = 56
+; Lcl frame size = 72
G_M17083_IG01:
push rbp
push r15
push r14
push r13
push r12
push rbx
- sub rsp, 56
- lea rbp, [rsp+0x60]
+ sub rsp, 72
+ lea rbp, [rsp+0x70]
mov qword ptr [rbp-0x30], rsi
mov r15, rdi
- mov rbx, rsi
- mov r14, rdx
- ;; size=32 bbWeight=1 PerfScore 8.50
+ mov rbx, rdx
+ ;; size=29 bbWeight=1 PerfScore 8.25
G_M17083_IG02:
- mov r13, gword ptr [r15+0x10]
- mov rdi, qword ptr [rbx+0x18]
- mov r12, qword ptr [rdi+0x10]
- test r12, r12
- je SHORT G_M17083_IG06
- ;; size=17 bbWeight=1 PerfScore 7.25
+ mov r14, gword ptr [r15+0x10]
+ mov rdi, qword ptr [rsi+0x18]
+ mov r13, qword ptr [rdi+0x18]
+ test r13, r13
+ je G_M17083_IG14
+ ;; size=21 bbWeight=1 PerfScore 7.25
G_M17083_IG03:
- mov rdi, qword ptr [rbx+0x18]
- mov rdx, qword ptr [rdi+0x18]
- test rdx, rdx
- je G_M17083_IG07
- ;; size=17 bbWeight=1 PerfScore 5.25
+ mov r15, gword ptr [r15+0x08]
+ cmp byte ptr [r14], r14b
+ mov rdi, gword ptr [rbx+0x08]
+ mov r12d, dword ptr [rdi+0x08]
+ mov rax, gword ptr [r14+0x50]
+ mov gword ptr [rbp-0x50], rax
+ mov rdi, qword ptr [r13+0x18]
+ mov rdi, qword ptr [rdi+0x10]
+ test rdi, rdi
+ je G_M17083_IG15
+ ;; size=40 bbWeight=1 PerfScore 17.25
G_M17083_IG04:
- mov rsi, r12
- mov rdi, r13
+ call CORINFO_HELP_NEWSFAST
+ mov gword ptr [rbp-0x58], rax
+ movzx rcx, byte ptr [r14+0x39]
+ mov dword ptr [rbp-0x34], ecx
+ mov rdi, qword ptr [rax]
+ mov rsi, qword ptr [rdi+0x30]
+ mov rsi, qword ptr [rsi]
+ mov rdx, qword ptr [rsi+0x18]
+ test rdx, rdx
+ je G_M17083_IG16
+ ;; size=40 bbWeight=1 PerfScore 14.25
+G_M17083_IG05:
+ mov rdi, rdx
+ ;; size=3 bbWeight=0.80 PerfScore 0.20
+G_M17083_IG06:
+ mov esi, r12d
+ call CORINFO_HELP_NEWARR_1_OBJ
+ mov r12, gword ptr [rbp-0x58]
+ lea rdi, bword ptr [r12+0x08]
+ mov rsi, rax
+ call CORINFO_HELP_ASSIGN_REF
+ lea rdi, bword ptr [r12+0x10]
+ mov rsi, gword ptr [rbp-0x50]
+ call CORINFO_HELP_ASSIGN_REF
+ mov edi, dword ptr [rbp-0x34]
+ mov byte ptr [r12+0x18], dil
+ xor eax, eax
+ mov qword ptr [rbp-0x48], rax
+ mov rdi, gword ptr [r12+0x08]
+ cmp dword ptr [rdi+0x08], 0
+ jle G_M17083_IG10
+ ;; size=68 bbWeight=1 PerfScore 15.75
+G_M17083_IG07:
+ mov rdi, qword ptr [r13+0x18]
+ mov rcx, qword ptr [rdi+0x18]
+ test rcx, rcx
+ je G_M17083_IG17
+ ;; size=17 bbWeight=0.25 PerfScore 1.31
+G_M17083_IG08:
+ mov qword ptr [rbp-0x40], rcx
+ ;; size=4 bbWeight=0.25 PerfScore 0.25
+G_M17083_IG09:
+ mov rdi, rcx
+ call CORINFO_HELP_NEWSFAST
+ mov gword ptr [rbp-0x60], rax
+ mov rdi, gword ptr [rbx+0x08]
+ mov rcx, qword ptr [rbp-0x48]
+ cmp ecx, dword ptr [rdi+0x08]
+ jae G_M17083_IG20
+ mov qword ptr [rbp-0x48], rcx
+ mov rsi, gword ptr [rdi+8*rcx+0x10]
+ mov rdx, gword ptr [r14+0x48]
+ mov gword ptr [rbp-0x68], rdx
+ lea rdi, bword ptr [rax+0x08]
+ call CORINFO_HELP_ASSIGN_REF
+ mov rax, gword ptr [rbp-0x60]
+ lea rdi, bword ptr [rax+0x10]
+ mov rsi, gword ptr [rbp-0x68]
+ call CORINFO_HELP_ASSIGN_REF
+ mov rdi, gword ptr [r12+0x08]
+ mov rsi, qword ptr [rbp-0x48]
+ mov rdx, gword ptr [rbp-0x60]
+ mov rax, 0xD1FFAB1E ; code for CORINFO_HELP_ARRADDR_ST
+ call [rax]CORINFO_HELP_ARRADDR_ST
+ mov rdi, qword ptr [rbp-0x48]
+ inc edi
+ mov rsi, gword ptr [r12+0x08]
+ cmp dword ptr [rsi+0x08], edi
+ mov qword ptr [rbp-0x48], rdi
+ mov rcx, qword ptr [rbp-0x40]
+ jg SHORT G_M17083_IG09
+ ;; size=121 bbWeight=4 PerfScore 147.00
+G_M17083_IG10:
+ mov rdi, qword ptr [r13+0x18]
+ mov rbx, qword ptr [rdi+0x20]
+ test rbx, rbx
+ je G_M17083_IG18
+ ;; size=17 bbWeight=1 PerfScore 5.25
+G_M17083_IG11:
+ mov rdi, qword ptr [r13+0x18]
+ mov rdx, qword ptr [rdi+0x28]
+ test rdx, rdx
+ je G_M17083_IG19
+ ;; size=17 bbWeight=1 PerfScore 5.25
+G_M17083_IG12:
+ mov rsi, rbx
+ mov rdi, r15
mov rax, 0xD1FFAB1E ; code for CORINFO_HELP_VIRTUAL_FUNC_PTR
call [rax]CORINFO_HELP_VIRTUAL_FUNC_PTR
- lea rdx, bword ptr [r15+0x18]
- lea rdi, [rsp]
- mov rsi, rdx
- mov rcx, gword ptr [rsi]
- mov gword ptr [rsp], rcx
- add rsi, 8
- add rdi, 8
- mov rcx, gword ptr [rsi]
- mov gword ptr [rsp+0x08], rcx
- add rsi, 8
- add rdi, 8
- mov ecx, 4
- rep movsq
- mov rdx, gword ptr [r15+0x08]
- mov rdi, r13
- mov rsi, r14
- xor ecx, ecx
- call rax
- nop
- ;; size=83 bbWeight=1 PerfScore 43.25
-G_M17083_IG05:
- add rsp, 56
+ mov rdi, r15
+ mov rsi, r12
+ ;; size=24 bbWeight=1 PerfScore 4.25
+G_M17083_IG13:
+ add rsp, 72
pop rbx
pop r12
pop r13
pop r14
pop r15
pop rbp
- ret
- ;; size=15 bbWeight=1 PerfScore 4.25
-G_M17083_IG06:
- mov rdi, rbx
+ tail.jmp rax
+ ;; size=17 bbWeight=1 PerfScore 5.25
+G_M17083_IG14:
+ mov rdi, rsi
mov rsi, 0xD1FFAB1E ; global ptr
mov rax, 0xD1FFAB1E ; code for CORINFO_HELP_RUNTIMEHANDLE_METHOD
call [rax]CORINFO_HELP_RUNTIMEHANDLE_METHOD
- mov r12, rax
+ mov r13, rax
jmp G_M17083_IG03
;; size=33 bbWeight=0.20 PerfScore 1.20
-G_M17083_IG07:
- mov rdi, rbx
+G_M17083_IG15:
+ mov rdi, r13
+ mov rsi, 0xD1FFAB1E ; global ptr
+ mov rcx, 0xD1FFAB1E ; code for CORINFO_HELP_RUNTIMEHANDLE_METHOD
+ call [rcx]CORINFO_HELP_RUNTIMEHANDLE_METHOD
+ mov rdi, rax
+ jmp G_M17083_IG04
+ ;; size=33 bbWeight=0.20 PerfScore 1.20
+G_M17083_IG16:
+ mov rsi, 0xD1FFAB1E ; global ptr
+ mov rdx, 0xD1FFAB1E ; code for CORINFO_HELP_RUNTIMEHANDLE_CLASS
+ call [rdx]CORINFO_HELP_RUNTIMEHANDLE_CLASS
+ mov rdi, rax
+ jmp G_M17083_IG06
+ ;; size=30 bbWeight=0.20 PerfScore 1.15
+G_M17083_IG17:
+ mov rdi, r13
+ mov rsi, 0xD1FFAB1E ; global ptr
+ mov rcx, 0xD1FFAB1E ; code for CORINFO_HELP_RUNTIMEHANDLE_METHOD
+ call [rcx]CORINFO_HELP_RUNTIMEHANDLE_METHOD
+ mov rcx, rax
+ jmp G_M17083_IG08
+ ;; size=33 bbWeight=0.05 PerfScore 0.30
+G_M17083_IG18:
+ mov rdi, r13
+ mov rsi, 0xD1FFAB1E ; global ptr
+ mov rax, 0xD1FFAB1E ; code for CORINFO_HELP_RUNTIMEHANDLE_METHOD
+ call [rax]CORINFO_HELP_RUNTIMEHANDLE_METHOD
+ mov rbx, rax
+ jmp G_M17083_IG11
+ ;; size=33 bbWeight=0.20 PerfScore 1.20
+G_M17083_IG19:
+ mov rdi, r13
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_M17083_IG04
+ jmp G_M17083_IG12
;; size=33 bbWeight=0.20 PerfScore 1.20
+G_M17083_IG20:
+ call CORINFO_HELP_RNGCHKFAIL
+ int3
+ ;; size=6 bbWeight=0 PerfScore 0.00
-; Total bytes of code 230, prolog size 23, PerfScore 70.90, instruction count 64, allocated bytes for code 230 (MethodHash=fd02bd44) for method System.Linq.Parallel.SortQueryOperatorResults`2+ChildResultsRecipient[System.__Canon,System.Nullable`1[int]]:Receive[int](System.Linq.Parallel.PartitionedStream`2[System.__Canon,int]):this (FullOpts)
+; Total bytes of code 619, prolog size 29, PerfScore 237.76, instruction count 146, allocated bytes for code 619 (MethodHash=fd02bd44) for method System.Linq.Parallel.SortQueryOperatorResults`2+ChildResultsRecipient[System.__Canon,System.Nullable`1[int]]:Receive[int](System.Linq.Parallel.PartitionedStream`2[System.__Canon,int]):this (FullOpts)
; ============================================================ 389 (169.13 % of base) - System.Linq.Parallel.SortQueryOperatorResults`2+ChildResultsRecipient[System.__Canon,System.Nullable`1[int]]:Receive[long](System.Linq.Parallel.PartitionedStream`2[System.__Canon,long]):this ; Assembly listing for method System.Linq.Parallel.SortQueryOperatorResults`2+ChildResultsRecipient[System.__Canon,System.Nullable`1[int]]:Receive[long](System.Linq.Parallel.PartitionedStream`2[System.__Canon,long]):this (FullOpts)
; Emitting BLENDED_CODE for X64 with AVX512 - Unix
; FullOpts code
; optimized code
; rbp based frame
-; partially interruptible
+; fully interruptible
; No PGO data
+; 0 inlinees with PGO data; 10 single block inlinees; 1 inlinees without PGO data
; Final local variable assignments
;
-; V00 this [V00,T01] ( 5, 5 ) ref -> r15 this class-hnd single-def <System.Linq.Parallel.SortQueryOperatorResults`2+ChildResultsRecipient[System.__Canon,System.Nullable`1[int]]>
-; V01 TypeCtx [V01,T00] ( 7, 5.40) long -> rbx single-def
-; V02 arg1 [V02,T05] ( 3, 3 ) ref -> r14 class-hnd single-def <System.Linq.Parallel.PartitionedStream`2[System.__Canon,long]>
-; V03 OutArgs [V03 ] ( 1, 1 ) struct (48) [rsp+0x00] do-not-enreg[XS] addr-exposed "OutgoingArgSpace" <UNNAMED>
-; V04 tmp1 [V04,T02] ( 3, 6 ) ref -> r13 single-def "LDVIRTFTN this pointer"
+; V00 this [V00,T11] ( 4, 4 ) ref -> r15 this class-hnd single-def <System.Linq.Parallel.SortQueryOperatorResults`2+ChildResultsRecipient[System.__Canon,System.Nullable`1[int]]>
+; V01 TypeCtx [V01,T10] ( 5, 4.20) long -> rsi single-def
+; V02 arg1 [V02,T09] ( 4, 7 ) ref -> rbx class-hnd single-def <System.Linq.Parallel.PartitionedStream`2[System.__Canon,long]>
+;# V03 OutArgs [V03 ] ( 1, 1 ) struct ( 0) [rsp+0x00] do-not-enreg[XS] addr-exposed "OutgoingArgSpace" <Empty>
+; V04 tmp1 [V04,T03] ( 5, 16 ) ref -> r14 class-hnd exact single-def "LDVIRTFTN this pointer" <System.Linq.Parallel.SortQueryOperator`2[System.__Canon,System.Nullable`1[int]]>
;* V05 tmp2 [V05 ] ( 0, 0 ) long -> zero-ref "spilling helperCall"
;* V06 tmp3 [V06 ] ( 0, 0 ) long -> zero-ref "spilling helperCall"
-; V07 tmp4 [V07,T08] ( 2, 4 ) long -> rax "VirtualCall through function pointer"
-; V08 tmp5 [V08,T09] ( 2, 4 ) long -> r12 "argument with side effect"
-; V09 tmp6 [V09,T10] ( 2, 4 ) long -> rdx "argument with side effect"
-; V10 rat0 [V10,T06] ( 3, 4 ) long -> r12 "runtime lookup"
-; V11 rat1 [V11,T03] ( 3, 5.60) long -> r12 "fgMakeTemp is creating a new local variable"
-; V12 rat2 [V12,T07] ( 3, 4 ) long -> rdx "runtime lookup"
-; V13 rat3 [V13,T04] ( 3, 5.60) long -> rdx "fgMakeTemp is creating a new local variable"
+; V07 tmp4 [V07,T26] ( 2, 4 ) int -> r12 "impAppendStmt"
+; V08 tmp5 [V08,T24] ( 2, 4 ) ref -> [rbp-0x50] class-hnd spill-single-def "impAppendStmt" <System.Collections.Generic.IComparer`1[System.Nullable`1[int]]>
+; V09 tmp6 [V09,T06] ( 6, 12 ) ref -> [rbp-0x58] class-hnd exact spill-single-def "NewObj constructor temp" <System.Linq.Parallel.PartitionedStream`2[System.__Canon,System.Nullable`1[int]]>
+; V10 tmp7 [V10,T08] ( 10, 9.80) long -> r13 "Inlining Arg"
+;* V11 tmp8 [V11 ] ( 0, 0 ) long -> zero-ref "spilling helperCall"
+; V12 tmp9 [V12,T07] ( 5, 11 ) ref -> r12 class-hnd exact single-def "Inline stloc first use temp" <System.Linq.Parallel.PartitionedStream`2[System.__Canon,System.Nullable`1[int]]>
+;* V13 tmp10 [V13,T34] ( 0, 0 ) int -> zero-ref "Inline stloc first use temp"
+; V14 tmp11 [V14,T00] ( 4, 32 ) ref -> [rbp-0x60] class-hnd exact spill-single-def "NewObj constructor temp" <System.Linq.Parallel.SortQueryOperatorEnumerator`3[System.__Canon,long,System.Nullable`1[int]]>
+;* V15 tmp12 [V15 ] ( 0, 0 ) long -> zero-ref "spilling helperCall"
+; V16 tmp13 [V16,T12] ( 3, 6 ) ref -> r15 class-hnd single-def "Inlining Arg" <System.Linq.Parallel.IPartitionedStreamRecipient`1[System.__Canon]>
+;* V17 tmp14 [V17 ] ( 0, 0 ) long -> zero-ref "spilling helperCall"
+;* V18 tmp15 [V18 ] ( 0, 0 ) long -> zero-ref "spilling helperCall"
+;* V19 tmp16 [V19 ] ( 0, 0 ) long -> zero-ref "spilling helperCall"
+; V20 tmp17 [V20,T25] ( 2, 4 ) ref -> rax class-hnd exact single-def "NewArr temp" <System.__Canon[]>
+; V21 tmp18 [V21,T27] ( 2, 4 ) ubyte -> [rbp-0x34] spill-single-def "Inlining Arg"
+; V22 tmp19 [V22,T04] ( 2, 16 ) ref -> rsi class-hnd "Inlining Arg" <System.__Canon>
+; V23 tmp20 [V23,T05] ( 2, 16 ) ref -> [rbp-0x68] class-hnd spill-single-def "Inlining Arg" <System.Func`2[System.__Canon,System.Nullable`1[int]]>
+; V24 tmp21 [V24,T28] ( 2, 4 ) long -> rax "Spilling to split statement for tree"
+; V25 tmp22 [V25,T29] ( 2, 4 ) long -> rdi "argument with side effect"
+; V26 tmp23 [V26,T02] ( 3, 24 ) ref -> rdi "arr expr"
+; V27 tmp24 [V27,T30] ( 2, 4 ) long -> rbx "argument with side effect"
+; V28 tmp25 [V28,T31] ( 2, 4 ) long -> rdx "argument with side effect"
+; V29 cse0 [V29,T19] ( 2, 4.25) long -> [rbp-0x40] spill-single-def hoist "CSE #01: moderate"
+; V30 rat0 [V30,T01] ( 7, 25 ) long -> [rbp-0x48] "Widened IV V13"
+; V31 rat1 [V31,T13] ( 3, 5.60) long -> r13 "fgMakeTemp is creating a new local variable"
+; V32 rat2 [V32,T20] ( 3, 4 ) long -> rdi "runtime lookup"
+; V33 rat3 [V33,T14] ( 3, 5.60) long -> rdi "fgMakeTemp is creating a new local variable"
+; V34 rat4 [V34,T18] ( 3, 4.40) long -> rdi "Spilling to split statement for tree"
+; V35 rat5 [V35,T21] ( 3, 4 ) long -> rdi "runtime lookup"
+; V36 rat6 [V36,T15] ( 3, 5.60) long -> rdx "fgMakeTemp is creating a new local variable"
+; V37 rat7 [V37,T33] ( 3, 1 ) long -> rcx "runtime lookup"
+; V38 rat8 [V38,T32] ( 3, 1.40) long -> rcx "fgMakeTemp is creating a new local variable"
+; V39 rat9 [V39,T22] ( 3, 4 ) long -> rbx "runtime lookup"
+; V40 rat10 [V40,T16] ( 3, 5.60) long -> rbx "fgMakeTemp is creating a new local variable"
+; V41 rat11 [V41,T23] ( 3, 4 ) long -> rdx "runtime lookup"
+; V42 rat12 [V42,T17] ( 3, 5.60) long -> rdx "fgMakeTemp is creating a new local variable"
;
-; Lcl frame size = 56
+; Lcl frame size = 72
G_M12731_IG01:
push rbp
push r15
push r14
push r13
push r12
push rbx
- sub rsp, 56
- lea rbp, [rsp+0x60]
+ sub rsp, 72
+ lea rbp, [rsp+0x70]
mov qword ptr [rbp-0x30], rsi
mov r15, rdi
- mov rbx, rsi
- mov r14, rdx
- ;; size=32 bbWeight=1 PerfScore 8.50
+ mov rbx, rdx
+ ;; size=29 bbWeight=1 PerfScore 8.25
G_M12731_IG02:
- mov r13, gword ptr [r15+0x10]
- mov rdi, qword ptr [rbx+0x18]
- mov r12, qword ptr [rdi+0x10]
- test r12, r12
- je SHORT G_M12731_IG06
- ;; size=17 bbWeight=1 PerfScore 7.25
+ mov r14, gword ptr [r15+0x10]
+ mov rdi, qword ptr [rsi+0x18]
+ mov r13, qword ptr [rdi+0x18]
+ test r13, r13
+ je G_M12731_IG14
+ ;; size=21 bbWeight=1 PerfScore 7.25
G_M12731_IG03:
- mov rdi, qword ptr [rbx+0x18]
- mov rdx, qword ptr [rdi+0x18]
- test rdx, rdx
- je G_M12731_IG07
- ;; size=17 bbWeight=1 PerfScore 5.25
+ mov r15, gword ptr [r15+0x08]
+ cmp byte ptr [r14], r14b
+ mov rdi, gword ptr [rbx+0x08]
+ mov r12d, dword ptr [rdi+0x08]
+ mov rax, gword ptr [r14+0x50]
+ mov gword ptr [rbp-0x50], rax
+ mov rdi, qword ptr [r13+0x18]
+ mov rdi, qword ptr [rdi+0x10]
+ test rdi, rdi
+ je G_M12731_IG15
+ ;; size=40 bbWeight=1 PerfScore 17.25
G_M12731_IG04:
- mov rsi, r12
- mov rdi, r13
+ call CORINFO_HELP_NEWSFAST
+ mov gword ptr [rbp-0x58], rax
+ movzx rcx, byte ptr [r14+0x39]
+ mov dword ptr [rbp-0x34], ecx
+ mov rdi, qword ptr [rax]
+ mov rsi, qword ptr [rdi+0x30]
+ mov rsi, qword ptr [rsi]
+ mov rdx, qword ptr [rsi+0x18]
+ test rdx, rdx
+ je G_M12731_IG16
+ ;; size=40 bbWeight=1 PerfScore 14.25
+G_M12731_IG05:
+ mov rdi, rdx
+ ;; size=3 bbWeight=0.80 PerfScore 0.20
+G_M12731_IG06:
+ mov esi, r12d
+ call CORINFO_HELP_NEWARR_1_OBJ
+ mov r12, gword ptr [rbp-0x58]
+ lea rdi, bword ptr [r12+0x08]
+ mov rsi, rax
+ call CORINFO_HELP_ASSIGN_REF
+ lea rdi, bword ptr [r12+0x10]
+ mov rsi, gword ptr [rbp-0x50]
+ call CORINFO_HELP_ASSIGN_REF
+ mov edi, dword ptr [rbp-0x34]
+ mov byte ptr [r12+0x18], dil
+ xor eax, eax
+ mov qword ptr [rbp-0x48], rax
+ mov rdi, gword ptr [r12+0x08]
+ cmp dword ptr [rdi+0x08], 0
+ jle G_M12731_IG10
+ ;; size=68 bbWeight=1 PerfScore 15.75
+G_M12731_IG07:
+ mov rdi, qword ptr [r13+0x18]
+ mov rcx, qword ptr [rdi+0x18]
+ test rcx, rcx
+ je G_M12731_IG17
+ ;; size=17 bbWeight=0.25 PerfScore 1.31
+G_M12731_IG08:
+ mov qword ptr [rbp-0x40], rcx
+ ;; size=4 bbWeight=0.25 PerfScore 0.25
+G_M12731_IG09:
+ mov rdi, rcx
+ call CORINFO_HELP_NEWSFAST
+ mov gword ptr [rbp-0x60], rax
+ mov rdi, gword ptr [rbx+0x08]
+ mov rcx, qword ptr [rbp-0x48]
+ cmp ecx, dword ptr [rdi+0x08]
+ jae G_M12731_IG20
+ mov qword ptr [rbp-0x48], rcx
+ mov rsi, gword ptr [rdi+8*rcx+0x10]
+ mov rdx, gword ptr [r14+0x48]
+ mov gword ptr [rbp-0x68], rdx
+ lea rdi, bword ptr [rax+0x08]
+ call CORINFO_HELP_ASSIGN_REF
+ mov rax, gword ptr [rbp-0x60]
+ lea rdi, bword ptr [rax+0x10]
+ mov rsi, gword ptr [rbp-0x68]
+ call CORINFO_HELP_ASSIGN_REF
+ mov rdi, gword ptr [r12+0x08]
+ mov rsi, qword ptr [rbp-0x48]
+ mov rdx, gword ptr [rbp-0x60]
+ mov rax, 0xD1FFAB1E ; code for CORINFO_HELP_ARRADDR_ST
+ call [rax]CORINFO_HELP_ARRADDR_ST
+ mov rdi, qword ptr [rbp-0x48]
+ inc edi
+ mov rsi, gword ptr [r12+0x08]
+ cmp dword ptr [rsi+0x08], edi
+ mov qword ptr [rbp-0x48], rdi
+ mov rcx, qword ptr [rbp-0x40]
+ jg SHORT G_M12731_IG09
+ ;; size=121 bbWeight=4 PerfScore 147.00
+G_M12731_IG10:
+ mov rdi, qword ptr [r13+0x18]
+ mov rbx, qword ptr [rdi+0x20]
+ test rbx, rbx
+ je G_M12731_IG18
+ ;; size=17 bbWeight=1 PerfScore 5.25
+G_M12731_IG11:
+ mov rdi, qword ptr [r13+0x18]
+ mov rdx, qword ptr [rdi+0x28]
+ test rdx, rdx
+ je G_M12731_IG19
+ ;; size=17 bbWeight=1 PerfScore 5.25
+G_M12731_IG12:
+ mov rsi, rbx
+ mov rdi, r15
mov rax, 0xD1FFAB1E ; code for CORINFO_HELP_VIRTUAL_FUNC_PTR
call [rax]CORINFO_HELP_VIRTUAL_FUNC_PTR
- lea rdx, bword ptr [r15+0x18]
- lea rdi, [rsp]
- mov rsi, rdx
- mov rcx, gword ptr [rsi]
- mov gword ptr [rsp], rcx
- add rsi, 8
- add rdi, 8
- mov rcx, gword ptr [rsi]
- mov gword ptr [rsp+0x08], rcx
- add rsi, 8
- add rdi, 8
- mov ecx, 4
- rep movsq
- mov rdx, gword ptr [r15+0x08]
- mov rdi, r13
- mov rsi, r14
- xor ecx, ecx
- call rax
- nop
- ;; size=83 bbWeight=1 PerfScore 43.25
-G_M12731_IG05:
- add rsp, 56
+ mov rdi, r15
+ mov rsi, r12
+ ;; size=24 bbWeight=1 PerfScore 4.25
+G_M12731_IG13:
+ add rsp, 72
pop rbx
pop r12
pop r13
pop r14
pop r15
pop rbp
- ret
- ;; size=15 bbWeight=1 PerfScore 4.25
-G_M12731_IG06:
- mov rdi, rbx
+ tail.jmp rax
+ ;; size=17 bbWeight=1 PerfScore 5.25
+G_M12731_IG14:
+ mov rdi, rsi
mov rsi, 0xD1FFAB1E ; global ptr
mov rax, 0xD1FFAB1E ; code for CORINFO_HELP_RUNTIMEHANDLE_METHOD
call [rax]CORINFO_HELP_RUNTIMEHANDLE_METHOD
- mov r12, rax
+ mov r13, rax
jmp G_M12731_IG03
;; size=33 bbWeight=0.20 PerfScore 1.20
-G_M12731_IG07:
- mov rdi, rbx
+G_M12731_IG15:
+ mov rdi, r13
+ mov rsi, 0xD1FFAB1E ; global ptr
+ mov rcx, 0xD1FFAB1E ; code for CORINFO_HELP_RUNTIMEHANDLE_METHOD
+ call [rcx]CORINFO_HELP_RUNTIMEHANDLE_METHOD
+ mov rdi, rax
+ jmp G_M12731_IG04
+ ;; size=33 bbWeight=0.20 PerfScore 1.20
+G_M12731_IG16:
+ mov rsi, 0xD1FFAB1E ; global ptr
+ mov rdx, 0xD1FFAB1E ; code for CORINFO_HELP_RUNTIMEHANDLE_CLASS
+ call [rdx]CORINFO_HELP_RUNTIMEHANDLE_CLASS
+ mov rdi, rax
+ jmp G_M12731_IG06
+ ;; size=30 bbWeight=0.20 PerfScore 1.15
+G_M12731_IG17:
+ mov rdi, r13
+ mov rsi, 0xD1FFAB1E ; global ptr
+ mov rcx, 0xD1FFAB1E ; code for CORINFO_HELP_RUNTIMEHANDLE_METHOD
+ call [rcx]CORINFO_HELP_RUNTIMEHANDLE_METHOD
+ mov rcx, rax
+ jmp G_M12731_IG08
+ ;; size=33 bbWeight=0.05 PerfScore 0.30
+G_M12731_IG18:
+ mov rdi, r13
+ mov rsi, 0xD1FFAB1E ; global ptr
+ mov rax, 0xD1FFAB1E ; code for CORINFO_HELP_RUNTIMEHANDLE_METHOD
+ call [rax]CORINFO_HELP_RUNTIMEHANDLE_METHOD
+ mov rbx, rax
+ jmp G_M12731_IG11
+ ;; size=33 bbWeight=0.20 PerfScore 1.20
+G_M12731_IG19:
+ mov rdi, r13
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_M12731_IG04
+ jmp G_M12731_IG12
;; size=33 bbWeight=0.20 PerfScore 1.20
+G_M12731_IG20:
+ call CORINFO_HELP_RNGCHKFAIL
+ int3
+ ;; size=6 bbWeight=0 PerfScore 0.00
-; Total bytes of code 230, prolog size 23, PerfScore 70.90, instruction count 64, allocated bytes for code 230 (MethodHash=9d0dce44) for method System.Linq.Parallel.SortQueryOperatorResults`2+ChildResultsRecipient[System.__Canon,System.Nullable`1[int]]:Receive[long](System.Linq.Parallel.PartitionedStream`2[System.__Canon,long]):this (FullOpts)
+; Total bytes of code 619, prolog size 29, PerfScore 237.76, instruction count 146, allocated bytes for code 619 (MethodHash=9d0dce44) for method System.Linq.Parallel.SortQueryOperatorResults`2+ChildResultsRecipient[System.__Canon,System.Nullable`1[int]]:Receive[long](System.Linq.Parallel.PartitionedStream`2[System.__Canon,long]):this (FullOpts)
; ============================================================ 239 (217.27 % of base) - Microsoft.Extensions.Logging.LoggerMessage+<>c__DisplayClass12_0`2[System.__Canon,System.Nullable`1[int]]:b__1(Microsoft.Extensions.Logging.ILogger,System.__Canon,System.Nullable`1[int],System.Exception):this ; Assembly listing for method Microsoft.Extensions.Logging.LoggerMessage+<>c__DisplayClass12_0`2[System.__Canon,System.Nullable`1[int]]:<Define>b__1(Microsoft.Extensions.Logging.ILogger,System.__Canon,System.Nullable`1[int],System.Exception):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; 2 single block inlinees; 0 inlinees without PGO data
; Final local variable assignments
;
-; V00 this [V00,T00] ( 4, 3.50) ref -> rbx this class-hnd single-def <Microsoft.Extensions.Logging.LoggerMessage+<>c__DisplayClass12_0`2[System.__Canon,System.Nullable`1[int]]>
-; V01 arg1 [V01,T01] ( 4, 3.50) ref -> r15 class-hnd single-def <Microsoft.Extensions.Logging.ILogger>
+; V00 this [V00,T00] ( 9, 6 ) ref -> rbx this class-hnd single-def <Microsoft.Extensions.Logging.LoggerMessage+<>c__DisplayClass12_0`2[System.__Canon,System.Nullable`1[int]]>
+; V01 arg1 [V01,T01] ( 5, 4 ) ref -> r15 class-hnd single-def <Microsoft.Extensions.Logging.ILogger>
; V02 arg2 [V02,T02] ( 3, 2.50) ref -> r14 class-hnd single-def <System.__Canon>
-; V03 arg3 [V03,T04] ( 3, 2.50) struct ( 8) [rbp-0x28] do-not-enreg[S] single-def <System.Nullable`1[int]>
+; V03 arg3 [V03,T04] ( 3, 2.50) struct ( 8) r12 single-def <System.Nullable`1[int]>
; V04 arg4 [V04,T03] ( 3, 2.50) ref -> r13 class-hnd single-def <System.Exception>
-;# V05 OutArgs [V05 ] ( 1, 1 ) struct ( 0) [rsp+0x00] do-not-enreg[XS] addr-exposed "OutgoingArgSpace" <Empty>
+; V05 OutArgs [V05 ] ( 1, 1 ) struct (24) [rsp+0x00] do-not-enreg[XS] addr-exposed "OutgoingArgSpace" <UNNAMED>
+; V06 tmp1 [V06,T05] ( 4, 4 ) struct (24) [rbp-0x48] do-not-enreg[SF] must-init ld-addr-op "NewObj constructor temp" <Microsoft.Extensions.Logging.LoggerMessage+LogValues`2[System.__Canon,System.Nullable`1[int]]>
+;* V07 tmp2 [V07 ] ( 0, 0 ) long -> zero-ref "spilling helperCall"
+; V08 tmp3 [V08,T13] ( 2, 2 ) int -> [rbp-0x4C] spill-single-def "impAppendStmt"
+;* V09 tmp4 [V09 ] ( 0, 0 ) struct (16) zero-ref multireg-arg "impAppendStmt" <Microsoft.Extensions.Logging.EventId>
+; V10 tmp5 [V10,T10] ( 3, 2 ) long -> r14 "spilling helperCall"
+; V11 tmp6 [V11,T11] ( 3, 2 ) long -> r12 "spilling helperCall"
+;* V12 tmp7 [V12 ] ( 0, 0 ) ref -> zero-ref class-hnd exact "Inlining Arg" <Microsoft.Extensions.Logging.LogValuesFormatter>
+; V13 tmp8 [V13,T12] ( 2, 2 ) ref -> r14 single-def "Spilling to split statement for tree"
+; V14 tmp9 [V14,T14] ( 2, 2 ) long -> rax "Spilling to split statement for tree"
+; V15 tmp10 [V15,T15] ( 2, 1 ) ref -> [rbp-0x58] spill-single-def "field V09.<Name>k__BackingField (fldOffset=0x0)" P-INDEP
+; V16 tmp11 [V16,T16] ( 2, 1 ) int -> [rbp-0x50] spill-single-def "field V09.<Id>k__BackingField (fldOffset=0x8)" P-INDEP
+; V17 rat0 [V17,T08] ( 3, 2.20) long -> rdi "Spilling to split statement for tree"
+; V18 rat1 [V18,T06] ( 3, 2.80) long -> r14 "fgMakeTemp is creating a new local variable"
+; V19 rat2 [V19,T09] ( 3, 2.20) long -> rdi "Spilling to split statement for tree"
+; V20 rat3 [V20,T07] ( 3, 2.80) long -> r12 "fgMakeTemp is creating a new local variable"
;
-; Lcl frame size = 16
+; Lcl frame size = 72
G_M24721_IG01:
push rbp
push r15
push r14
push r13
+ push r12
push rbx
- sub rsp, 16
- lea rbp, [rsp+0x30]
- mov qword ptr [rbp-0x28], rcx
+ sub rsp, 72
+ lea rbp, [rsp+0x70]
+ vxorps xmm8, xmm8, xmm8
+ vmovdqu xmmword ptr [rbp-0x48], xmm8
+ xor eax, eax
+ mov qword ptr [rbp-0x38], rax
+ mov qword ptr [rbp-0x30], rdi
mov rbx, rdi
mov r15, rsi
mov r14, rdx
+ mov r12, rcx
mov r13, r8
- ;; size=33 bbWeight=1 PerfScore 7.75
+ ;; size=54 bbWeight=1 PerfScore 12.58
G_M24721_IG02:
mov esi, dword ptr [rbx+0x10]
mov rdi, r15
mov r11, 0xD1FFAB1E ; code for Microsoft.Extensions.Logging.ILogger:IsEnabled(int):ubyte:this
call [r11]Microsoft.Extensions.Logging.ILogger:IsEnabled(int):ubyte:this
test eax, eax
- jne SHORT G_M24721_IG04
- ;; size=23 bbWeight=1 PerfScore 6.75
+ je G_M24721_IG06
+ ;; size=27 bbWeight=1 PerfScore 6.75
G_M24721_IG03:
- add rsp, 16
+ mov eax, dword ptr [rbx+0x10]
+ mov dword ptr [rbp-0x4C], eax
+ mov rcx, gword ptr [rbx+0x18]
+ mov gword ptr [rbp-0x58], rcx
+ mov edx, dword ptr [rbx+0x20]
+ mov dword ptr [rbp-0x50], edx
+ mov rdi, gword ptr [rbx+0x08]
+ mov gword ptr [rbp-0x48], rdi
+ mov gword ptr [rbp-0x40], r14
+ mov qword ptr [rbp-0x38], r12
+ mov rdi, qword ptr [rbx]
+ mov rsi, qword ptr [rdi+0x30]
+ mov rsi, qword ptr [rsi]
+ mov r14, qword ptr [rsi+0x18]
+ test r14, r14
+ je G_M24721_IG08
+ ;; size=59 bbWeight=0.50 PerfScore 11.62
+G_M24721_IG04:
+ mov rdi, qword ptr [rbx]
+ mov rsi, qword ptr [rdi+0x30]
+ mov rsi, qword ptr [rsi]
+ mov r12, qword ptr [rsi+0x20]
+ test r12, r12
+ je G_M24721_IG09
+ ;; size=23 bbWeight=0.50 PerfScore 4.62
+G_M24721_IG05:
+ mov rdi, r14
+ mov rsi, 0xD1FFAB1E ; code for CORINFO_HELP_GET_GCSTATIC_BASE
+ call [rsi]CORINFO_HELP_GET_GCSTATIC_BASE
+ mov r14, gword ptr [rax]
+ mov rdi, r15
+ mov rdx, r12
+ mov rsi, 0xD1FFAB1E ; Microsoft.Extensions.Logging.ILogger
+ mov rax, 0xD1FFAB1E ; code for CORINFO_HELP_VIRTUAL_FUNC_PTR
+ call [rax]CORINFO_HELP_VIRTUAL_FUNC_PTR
+ lea rdi, [rsp]
+ lea rsi, [rbp-0x48]
+ mov rcx, gword ptr [rsi]
+ mov gword ptr [rsp], rcx
+ add rsi, 8
+ add rdi, 8
+ mov rcx, gword ptr [rsi]
+ mov gword ptr [rsp+0x08], rcx
+ add rsi, 8
+ add rdi, 8
+ movsq
+ mov rdx, gword ptr [rbp-0x58]
+ mov ecx, dword ptr [rbp-0x50]
+ mov rdi, r15
+ mov esi, dword ptr [rbp-0x4C]
+ mov r8, r13
+ mov r9, r14
+ call rax
+ ;; size=108 bbWeight=0.50 PerfScore 12.62
+G_M24721_IG06:
+ nop
+ ;; size=1 bbWeight=1 PerfScore 0.25
+G_M24721_IG07:
+ add rsp, 72
pop rbx
+ pop r12
pop r13
pop r14
pop r15
pop rbp
ret
- ;; size=13 bbWeight=0.50 PerfScore 1.88
-G_M24721_IG04:
- mov rdi, rbx
- mov rsi, r15
- mov rdx, r14
- mov rcx, qword ptr [rbp-0x28]
- mov r8, r13
- mov rax, 0xD1FFAB1E ; code for Microsoft.Extensions.Logging.LoggerMessage+<>c__DisplayClass12_0`2[System.__Canon,System.Nullable`1[int]]:<Define>g__Log|0(Microsoft.Extensions.Logging.ILogger,System.__Canon,System.Nullable`1[int],System.Exception):this
- ;; size=26 bbWeight=0.50 PerfScore 1.12
-G_M24721_IG05:
- add rsp, 16
- pop rbx
- pop r13
- pop r14
- pop r15
- pop rbp
- tail.jmp [rax]Microsoft.Extensions.Logging.LoggerMessage+<>c__DisplayClass12_0`2[System.__Canon,System.Nullable`1[int]]:<Define>g__Log|0(Microsoft.Extensions.Logging.ILogger,System.__Canon,System.Nullable`1[int],System.Exception):this
- ;; size=15 bbWeight=0.50 PerfScore 2.38
+ ;; size=15 bbWeight=1 PerfScore 4.25
+G_M24721_IG08:
+ mov rsi, 0xD1FFAB1E ; global ptr
+ mov r8, 0xD1FFAB1E ; code for CORINFO_HELP_RUNTIMEHANDLE_CLASS
+ call [r8]CORINFO_HELP_RUNTIMEHANDLE_CLASS
+ mov r14, rax
+ jmp G_M24721_IG04
+ ;; size=31 bbWeight=0.10 PerfScore 0.58
+G_M24721_IG09:
+ mov rsi, 0xD1FFAB1E ; global ptr
+ mov r8, 0xD1FFAB1E ; code for CORINFO_HELP_RUNTIMEHANDLE_CLASS
+ call [r8]CORINFO_HELP_RUNTIMEHANDLE_CLASS
+ mov r12, rax
+ jmp G_M24721_IG05
+ ;; size=31 bbWeight=0.10 PerfScore 0.58
-; Total bytes of code 110, prolog size 17, PerfScore 19.88, instruction count 38, allocated bytes for code 110 (MethodHash=e0179f6e) for method Microsoft.Extensions.Logging.LoggerMessage+<>c__DisplayClass12_0`2[System.__Canon,System.Nullable`1[int]]:<Define>b__1(Microsoft.Extensions.Logging.ILogger,System.__Canon,System.Nullable`1[int],System.Exception):this (FullOpts)
+; Total bytes of code 349, prolog size 39, PerfScore 53.86, instruction count 92, allocated bytes for code 349 (MethodHash=e0179f6e) for method Microsoft.Extensions.Logging.LoggerMessage+<>c__DisplayClass12_0`2[System.__Canon,System.Nullable`1[int]]:<Define>b__1(Microsoft.Extensions.Logging.ILogger,System.__Canon,System.Nullable`1[int],System.Exception):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/396113e75f19847dc8bac67168db056f |
Top method improvements-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>
+; V00 this [V00,T00] ( 4, 3.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"
-; 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"
+; V03 tmp1 [V03,T04] ( 3, 3 ) byref -> rbx single-def "Inlining Arg"
+; V04 tmp2 [V04,T10] ( 3, 1.50) ubyte -> rdi "Inline return value spill temp"
+; V05 tmp3 [V05,T02] ( 4, 4 ) ref -> rdi class-hnd exact single-def "dup spill" <System.Text.Json.JsonDocument>
+;* V06 tmp4 [V06 ] ( 0, 0 ) ref -> zero-ref single-def
+; V07 tmp5 [V07,T06] ( 2, 2 ) int -> rax "Inlining Arg"
+;* V08 tmp6 [V08 ] ( 0, 0 ) byref -> zero-ref "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"
-;* 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"
+;* V10 tmp8 [V10 ] ( 0, 0 ) struct (16) zero-ref "spilled call-like call argument" <System.Span`1[ubyte]>
+;* V11 tmp9 [V11 ] ( 0, 0 ) struct (16) zero-ref "spilled call-like call argument" <System.ReadOnlySpan`1[ubyte]>
+;* V12 tmp10 [V12 ] ( 0, 0 ) struct (16) zero-ref "Inline return value spill temp" <System.Span`1[ubyte]>
+; V13 tmp11 [V13,T03] ( 4, 4 ) ref -> rdi class-hnd single-def "Inlining Arg" <ubyte[]>
+; V14 tmp12 [V14,T01] ( 5, 5 ) int -> rax "Inlining Arg"
+;* V15 tmp13 [V15 ] ( 0, 0 ) struct (16) zero-ref ld-addr-op "NewObj constructor temp" <System.Span`1[ubyte]>
+;* V16 tmp14 [V16 ] ( 0, 0 ) struct (16) zero-ref ld-addr-op "Inline ldloca(s) first use temp" <System.Span`1[ubyte]>
+; V17 tmp15 [V17,T05] ( 2, 2 ) byref -> rdi single-def "Inlining Arg"
+; V18 tmp16 [V18,T07] ( 2, 2 ) int -> rcx "Inlining Arg"
+;* V19 tmp17 [V19 ] ( 0, 0 ) struct (16) zero-ref ld-addr-op "Inlining Arg" <System.Span`1[ubyte]>
+;* V20 tmp18 [V20 ] ( 0, 0 ) struct (16) zero-ref ld-addr-op "NewObj constructor temp" <System.ReadOnlySpan`1[ubyte]>
+;* V21 tmp19 [V21 ] ( 0, 0 ) byref -> zero-ref single-def "Inlining Arg"
+;* V22 tmp20 [V22 ] ( 0, 0 ) int -> zero-ref "Inlining Arg"
+;* V23 tmp21 [V23 ] ( 0, 0 ) struct (16) zero-ref ld-addr-op "Inlining Arg" <System.ReadOnlySpan`1[ubyte]>
;* 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
-;* 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"
+;* V25 tmp23 [V25 ] ( 0, 0 ) byref -> zero-ref "field V10._reference (fldOffset=0x0)" P-INDEP
+;* V26 tmp24 [V26 ] ( 0, 0 ) int -> zero-ref "field V10._length (fldOffset=0x8)" P-INDEP
+;* V27 tmp25 [V27 ] ( 0, 0 ) byref -> zero-ref "field V11._reference (fldOffset=0x0)" P-INDEP
+;* V28 tmp26 [V28 ] ( 0, 0 ) int -> zero-ref "field V11._length (fldOffset=0x8)" P-INDEP
+; V29 tmp27 [V29,T09] ( 3, 1.50) byref -> rdi "field V12._reference (fldOffset=0x0)" P-INDEP
+; V30 tmp28 [V30,T11] ( 3, 1.50) int -> rcx "field V12._length (fldOffset=0x8)" P-INDEP
+; V31 tmp29 [V31,T13] ( 2, 1 ) byref -> rdi single-def "field V15._reference (fldOffset=0x0)" P-INDEP
+; V32 tmp30 [V32,T14] ( 2, 1 ) int -> rcx "field V15._length (fldOffset=0x8)" P-INDEP
+;* V33 tmp31 [V33 ] ( 0, 0 ) byref -> zero-ref single-def "field V16._reference (fldOffset=0x0)" P-INDEP
+;* V34 tmp32 [V34 ] ( 0, 0 ) int -> zero-ref "field V16._length (fldOffset=0x8)" P-INDEP
+;* V35 tmp33 [V35 ] ( 0, 0 ) byref -> zero-ref single-def "field V19._reference (fldOffset=0x0)" P-INDEP
+;* V36 tmp34 [V36 ] ( 0, 0 ) int -> zero-ref "field V19._length (fldOffset=0x8)" P-INDEP
+;* V37 tmp35 [V37 ] ( 0, 0 ) byref -> zero-ref single-def "field V20._reference (fldOffset=0x0)" P-INDEP
+;* V38 tmp36 [V38 ] ( 0, 0 ) int -> zero-ref "field V20._length (fldOffset=0x8)" P-INDEP
+;* V39 tmp37 [V39 ] ( 0, 0 ) byref -> zero-ref single-def "field V23._reference (fldOffset=0x0)" P-INDEP
+;* V40 tmp38 [V40 ] ( 0, 0 ) int -> zero-ref "field V23._length (fldOffset=0x8)" P-INDEP
+;* V41 tmp39 [V41 ] ( 0, 0 ) byref -> zero-ref single-def "field V24._reference (fldOffset=0x0)" P-INDEP
+;* V42 tmp40 [V42 ] ( 0, 0 ) int -> zero-ref "field V24._length (fldOffset=0x8)" P-INDEP
+; V43 tmp41 [V43,T08] ( 2, 2 ) int -> rdi "argument with side effect"
+; V44 cse0 [V44,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
lea rsi, [rbp-0x10]
mov rdi, rbx
- call rax
+ mov rax, 0xD1FFAB1E ; code for System.Text.Json.Nodes.JsonValueOfElement:TryGetValue[double](byref):ubyte:this
+ cmp dword ptr [rdi], edi
+ 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>
+; V00 this [V00,T00] ( 4, 3.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"
-; 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"
+; V03 tmp1 [V03,T04] ( 3, 3 ) byref -> rbx single-def "Inlining Arg"
+; V04 tmp2 [V04,T10] ( 3, 1.50) ubyte -> rdi "Inline return value spill temp"
+; V05 tmp3 [V05,T02] ( 4, 4 ) ref -> rdi class-hnd exact single-def "dup spill" <System.Text.Json.JsonDocument>
+;* V06 tmp4 [V06 ] ( 0, 0 ) ref -> zero-ref single-def
+; V07 tmp5 [V07,T06] ( 2, 2 ) int -> rax "Inlining Arg"
+;* V08 tmp6 [V08 ] ( 0, 0 ) byref -> zero-ref "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"
-;* 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"
+;* V10 tmp8 [V10 ] ( 0, 0 ) struct (16) zero-ref "spilled call-like call argument" <System.Span`1[ubyte]>
+;* V11 tmp9 [V11 ] ( 0, 0 ) struct (16) zero-ref "spilled call-like call argument" <System.ReadOnlySpan`1[ubyte]>
+;* V12 tmp10 [V12 ] ( 0, 0 ) struct (16) zero-ref "Inline return value spill temp" <System.Span`1[ubyte]>
+; V13 tmp11 [V13,T03] ( 4, 4 ) ref -> rdi class-hnd single-def "Inlining Arg" <ubyte[]>
+; V14 tmp12 [V14,T01] ( 5, 5 ) int -> rax "Inlining Arg"
+;* V15 tmp13 [V15 ] ( 0, 0 ) struct (16) zero-ref ld-addr-op "NewObj constructor temp" <System.Span`1[ubyte]>
+;* V16 tmp14 [V16 ] ( 0, 0 ) struct (16) zero-ref ld-addr-op "Inline ldloca(s) first use temp" <System.Span`1[ubyte]>
+; V17 tmp15 [V17,T05] ( 2, 2 ) byref -> rdi single-def "Inlining Arg"
+; V18 tmp16 [V18,T07] ( 2, 2 ) int -> rcx "Inlining Arg"
+;* V19 tmp17 [V19 ] ( 0, 0 ) struct (16) zero-ref ld-addr-op "Inlining Arg" <System.Span`1[ubyte]>
+;* V20 tmp18 [V20 ] ( 0, 0 ) struct (16) zero-ref ld-addr-op "NewObj constructor temp" <System.ReadOnlySpan`1[ubyte]>
+;* V21 tmp19 [V21 ] ( 0, 0 ) byref -> zero-ref single-def "Inlining Arg"
+;* V22 tmp20 [V22 ] ( 0, 0 ) int -> zero-ref "Inlining Arg"
+;* V23 tmp21 [V23 ] ( 0, 0 ) struct (16) zero-ref ld-addr-op "Inlining Arg" <System.ReadOnlySpan`1[ubyte]>
;* 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
-;* 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"
+;* V25 tmp23 [V25 ] ( 0, 0 ) byref -> zero-ref "field V10._reference (fldOffset=0x0)" P-INDEP
+;* V26 tmp24 [V26 ] ( 0, 0 ) int -> zero-ref "field V10._length (fldOffset=0x8)" P-INDEP
+;* V27 tmp25 [V27 ] ( 0, 0 ) byref -> zero-ref "field V11._reference (fldOffset=0x0)" P-INDEP
+;* V28 tmp26 [V28 ] ( 0, 0 ) int -> zero-ref "field V11._length (fldOffset=0x8)" P-INDEP
+; V29 tmp27 [V29,T09] ( 3, 1.50) byref -> rdi "field V12._reference (fldOffset=0x0)" P-INDEP
+; V30 tmp28 [V30,T11] ( 3, 1.50) int -> rcx "field V12._length (fldOffset=0x8)" P-INDEP
+; V31 tmp29 [V31,T13] ( 2, 1 ) byref -> rdi single-def "field V15._reference (fldOffset=0x0)" P-INDEP
+; V32 tmp30 [V32,T14] ( 2, 1 ) int -> rcx "field V15._length (fldOffset=0x8)" P-INDEP
+;* V33 tmp31 [V33 ] ( 0, 0 ) byref -> zero-ref single-def "field V16._reference (fldOffset=0x0)" P-INDEP
+;* V34 tmp32 [V34 ] ( 0, 0 ) int -> zero-ref "field V16._length (fldOffset=0x8)" P-INDEP
+;* V35 tmp33 [V35 ] ( 0, 0 ) byref -> zero-ref single-def "field V19._reference (fldOffset=0x0)" P-INDEP
+;* V36 tmp34 [V36 ] ( 0, 0 ) int -> zero-ref "field V19._length (fldOffset=0x8)" P-INDEP
+;* V37 tmp35 [V37 ] ( 0, 0 ) byref -> zero-ref single-def "field V20._reference (fldOffset=0x0)" P-INDEP
+;* V38 tmp36 [V38 ] ( 0, 0 ) int -> zero-ref "field V20._length (fldOffset=0x8)" P-INDEP
+;* V39 tmp37 [V39 ] ( 0, 0 ) byref -> zero-ref single-def "field V23._reference (fldOffset=0x0)" P-INDEP
+;* V40 tmp38 [V40 ] ( 0, 0 ) int -> zero-ref "field V23._length (fldOffset=0x8)" P-INDEP
+;* V41 tmp39 [V41 ] ( 0, 0 ) byref -> zero-ref single-def "field V24._reference (fldOffset=0x0)" P-INDEP
+;* V42 tmp40 [V42 ] ( 0, 0 ) int -> zero-ref "field V24._length (fldOffset=0x8)" P-INDEP
+; V43 tmp41 [V43,T08] ( 2, 2 ) int -> rdi "argument with side effect"
+; V44 cse0 [V44,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
lea rsi, [rbp-0x10]
mov rdi, rbx
- call rax
+ mov rax, 0xD1FFAB1E ; code for System.Text.Json.Nodes.JsonValueOfElement:TryGetValue[int](byref):ubyte:this
+ cmp dword ptr [rdi], edi
+ 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>
+; V00 this [V00,T00] ( 4, 3.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"
-; 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"
+; V03 tmp1 [V03,T04] ( 3, 3 ) byref -> rbx single-def "Inlining Arg"
+; V04 tmp2 [V04,T10] ( 3, 1.50) ubyte -> rdi "Inline return value spill temp"
+; V05 tmp3 [V05,T02] ( 4, 4 ) ref -> rdi class-hnd exact single-def "dup spill" <System.Text.Json.JsonDocument>
+;* V06 tmp4 [V06 ] ( 0, 0 ) ref -> zero-ref single-def
+; V07 tmp5 [V07,T06] ( 2, 2 ) int -> rax "Inlining Arg"
+;* V08 tmp6 [V08 ] ( 0, 0 ) byref -> zero-ref "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"
-;* 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"
+;* V10 tmp8 [V10 ] ( 0, 0 ) struct (16) zero-ref "spilled call-like call argument" <System.Span`1[ubyte]>
+;* V11 tmp9 [V11 ] ( 0, 0 ) struct (16) zero-ref "spilled call-like call argument" <System.ReadOnlySpan`1[ubyte]>
+;* V12 tmp10 [V12 ] ( 0, 0 ) struct (16) zero-ref "Inline return value spill temp" <System.Span`1[ubyte]>
+; V13 tmp11 [V13,T03] ( 4, 4 ) ref -> rdi class-hnd single-def "Inlining Arg" <ubyte[]>
+; V14 tmp12 [V14,T01] ( 5, 5 ) int -> rax "Inlining Arg"
+;* V15 tmp13 [V15 ] ( 0, 0 ) struct (16) zero-ref ld-addr-op "NewObj constructor temp" <System.Span`1[ubyte]>
+;* V16 tmp14 [V16 ] ( 0, 0 ) struct (16) zero-ref ld-addr-op "Inline ldloca(s) first use temp" <System.Span`1[ubyte]>
+; V17 tmp15 [V17,T05] ( 2, 2 ) byref -> rdi single-def "Inlining Arg"
+; V18 tmp16 [V18,T07] ( 2, 2 ) int -> rcx "Inlining Arg"
+;* V19 tmp17 [V19 ] ( 0, 0 ) struct (16) zero-ref ld-addr-op "Inlining Arg" <System.Span`1[ubyte]>
+;* V20 tmp18 [V20 ] ( 0, 0 ) struct (16) zero-ref ld-addr-op "NewObj constructor temp" <System.ReadOnlySpan`1[ubyte]>
+;* V21 tmp19 [V21 ] ( 0, 0 ) byref -> zero-ref single-def "Inlining Arg"
+;* V22 tmp20 [V22 ] ( 0, 0 ) int -> zero-ref "Inlining Arg"
+;* V23 tmp21 [V23 ] ( 0, 0 ) struct (16) zero-ref ld-addr-op "Inlining Arg" <System.ReadOnlySpan`1[ubyte]>
;* 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
-;* 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"
+;* V25 tmp23 [V25 ] ( 0, 0 ) byref -> zero-ref "field V10._reference (fldOffset=0x0)" P-INDEP
+;* V26 tmp24 [V26 ] ( 0, 0 ) int -> zero-ref "field V10._length (fldOffset=0x8)" P-INDEP
+;* V27 tmp25 [V27 ] ( 0, 0 ) byref -> zero-ref "field V11._reference (fldOffset=0x0)" P-INDEP
+;* V28 tmp26 [V28 ] ( 0, 0 ) int -> zero-ref "field V11._length (fldOffset=0x8)" P-INDEP
+; V29 tmp27 [V29,T09] ( 3, 1.50) byref -> rdi "field V12._reference (fldOffset=0x0)" P-INDEP
+; V30 tmp28 [V30,T11] ( 3, 1.50) int -> rcx "field V12._length (fldOffset=0x8)" P-INDEP
+; V31 tmp29 [V31,T13] ( 2, 1 ) byref -> rdi single-def "field V15._reference (fldOffset=0x0)" P-INDEP
+; V32 tmp30 [V32,T14] ( 2, 1 ) int -> rcx "field V15._length (fldOffset=0x8)" P-INDEP
+;* V33 tmp31 [V33 ] ( 0, 0 ) byref -> zero-ref single-def "field V16._reference (fldOffset=0x0)" P-INDEP
+;* V34 tmp32 [V34 ] ( 0, 0 ) int -> zero-ref "field V16._length (fldOffset=0x8)" P-INDEP
+;* V35 tmp33 [V35 ] ( 0, 0 ) byref -> zero-ref single-def "field V19._reference (fldOffset=0x0)" P-INDEP
+;* V36 tmp34 [V36 ] ( 0, 0 ) int -> zero-ref "field V19._length (fldOffset=0x8)" P-INDEP
+;* V37 tmp35 [V37 ] ( 0, 0 ) byref -> zero-ref single-def "field V20._reference (fldOffset=0x0)" P-INDEP
+;* V38 tmp36 [V38 ] ( 0, 0 ) int -> zero-ref "field V20._length (fldOffset=0x8)" P-INDEP
+;* V39 tmp37 [V39 ] ( 0, 0 ) byref -> zero-ref single-def "field V23._reference (fldOffset=0x0)" P-INDEP
+;* V40 tmp38 [V40 ] ( 0, 0 ) int -> zero-ref "field V23._length (fldOffset=0x8)" P-INDEP
+;* V41 tmp39 [V41 ] ( 0, 0 ) byref -> zero-ref single-def "field V24._reference (fldOffset=0x0)" P-INDEP
+;* V42 tmp40 [V42 ] ( 0, 0 ) int -> zero-ref "field V24._length (fldOffset=0x8)" P-INDEP
+; V43 tmp41 [V43,T08] ( 2, 2 ) int -> rdi "argument with side effect"
+; V44 cse0 [V44,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
lea rsi, [rbp-0x10]
mov rdi, rbx
- call rax
+ mov rax, 0xD1FFAB1E ; code for System.Text.Json.Nodes.JsonValueOfElement:TryGetValue[long](byref):ubyte:this
+ cmp dword ptr [rdi], edi
+ 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>
+; V00 this [V00,T00] ( 4, 3.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"
-; 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"
+; V03 tmp1 [V03,T04] ( 3, 3 ) byref -> rbx single-def "Inlining Arg"
+; V04 tmp2 [V04,T10] ( 3, 1.50) ubyte -> rdi "Inline return value spill temp"
+; V05 tmp3 [V05,T02] ( 4, 4 ) ref -> rdi class-hnd exact single-def "dup spill" <System.Text.Json.JsonDocument>
+;* V06 tmp4 [V06 ] ( 0, 0 ) ref -> zero-ref single-def
+; V07 tmp5 [V07,T06] ( 2, 2 ) int -> rax "Inlining Arg"
+;* V08 tmp6 [V08 ] ( 0, 0 ) byref -> zero-ref "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"
-;* 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"
+;* V10 tmp8 [V10 ] ( 0, 0 ) struct (16) zero-ref "spilled call-like call argument" <System.Span`1[ubyte]>
+;* V11 tmp9 [V11 ] ( 0, 0 ) struct (16) zero-ref "spilled call-like call argument" <System.ReadOnlySpan`1[ubyte]>
+;* V12 tmp10 [V12 ] ( 0, 0 ) struct (16) zero-ref "Inline return value spill temp" <System.Span`1[ubyte]>
+; V13 tmp11 [V13,T03] ( 4, 4 ) ref -> rdi class-hnd single-def "Inlining Arg" <ubyte[]>
+; V14 tmp12 [V14,T01] ( 5, 5 ) int -> rax "Inlining Arg"
+;* V15 tmp13 [V15 ] ( 0, 0 ) struct (16) zero-ref ld-addr-op "NewObj constructor temp" <System.Span`1[ubyte]>
+;* V16 tmp14 [V16 ] ( 0, 0 ) struct (16) zero-ref ld-addr-op "Inline ldloca(s) first use temp" <System.Span`1[ubyte]>
+; V17 tmp15 [V17,T05] ( 2, 2 ) byref -> rdi single-def "Inlining Arg"
+; V18 tmp16 [V18,T07] ( 2, 2 ) int -> rcx "Inlining Arg"
+;* V19 tmp17 [V19 ] ( 0, 0 ) struct (16) zero-ref ld-addr-op "Inlining Arg" <System.Span`1[ubyte]>
+;* V20 tmp18 [V20 ] ( 0, 0 ) struct (16) zero-ref ld-addr-op "NewObj constructor temp" <System.ReadOnlySpan`1[ubyte]>
+;* V21 tmp19 [V21 ] ( 0, 0 ) byref -> zero-ref single-def "Inlining Arg"
+;* V22 tmp20 [V22 ] ( 0, 0 ) int -> zero-ref "Inlining Arg"
+;* V23 tmp21 [V23 ] ( 0, 0 ) struct (16) zero-ref ld-addr-op "Inlining Arg" <System.ReadOnlySpan`1[ubyte]>
;* 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
-;* 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"
+;* V25 tmp23 [V25 ] ( 0, 0 ) byref -> zero-ref "field V10._reference (fldOffset=0x0)" P-INDEP
+;* V26 tmp24 [V26 ] ( 0, 0 ) int -> zero-ref "field V10._length (fldOffset=0x8)" P-INDEP
+;* V27 tmp25 [V27 ] ( 0, 0 ) byref -> zero-ref "field V11._reference (fldOffset=0x0)" P-INDEP
+;* V28 tmp26 [V28 ] ( 0, 0 ) int -> zero-ref "field V11._length (fldOffset=0x8)" P-INDEP
+; V29 tmp27 [V29,T09] ( 3, 1.50) byref -> rdi "field V12._reference (fldOffset=0x0)" P-INDEP
+; V30 tmp28 [V30,T11] ( 3, 1.50) int -> rcx "field V12._length (fldOffset=0x8)" P-INDEP
+; V31 tmp29 [V31,T13] ( 2, 1 ) byref -> rdi single-def "field V15._reference (fldOffset=0x0)" P-INDEP
+; V32 tmp30 [V32,T14] ( 2, 1 ) int -> rcx "field V15._length (fldOffset=0x8)" P-INDEP
+;* V33 tmp31 [V33 ] ( 0, 0 ) byref -> zero-ref single-def "field V16._reference (fldOffset=0x0)" P-INDEP
+;* V34 tmp32 [V34 ] ( 0, 0 ) int -> zero-ref "field V16._length (fldOffset=0x8)" P-INDEP
+;* V35 tmp33 [V35 ] ( 0, 0 ) byref -> zero-ref single-def "field V19._reference (fldOffset=0x0)" P-INDEP
+;* V36 tmp34 [V36 ] ( 0, 0 ) int -> zero-ref "field V19._length (fldOffset=0x8)" P-INDEP
+;* V37 tmp35 [V37 ] ( 0, 0 ) byref -> zero-ref single-def "field V20._reference (fldOffset=0x0)" P-INDEP
+;* V38 tmp36 [V38 ] ( 0, 0 ) int -> zero-ref "field V20._length (fldOffset=0x8)" P-INDEP
+;* V39 tmp37 [V39 ] ( 0, 0 ) byref -> zero-ref single-def "field V23._reference (fldOffset=0x0)" P-INDEP
+;* V40 tmp38 [V40 ] ( 0, 0 ) int -> zero-ref "field V23._length (fldOffset=0x8)" P-INDEP
+;* V41 tmp39 [V41 ] ( 0, 0 ) byref -> zero-ref single-def "field V24._reference (fldOffset=0x0)" P-INDEP
+;* V42 tmp40 [V42 ] ( 0, 0 ) int -> zero-ref "field V24._length (fldOffset=0x8)" P-INDEP
+; V43 tmp41 [V43,T08] ( 2, 2 ) int -> rdi "argument with side effect"
+; V44 cse0 [V44,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
lea rsi, [rbp-0x10]
mov rdi, rbx
- call rax
+ mov rax, 0xD1FFAB1E ; code for System.Text.Json.Nodes.JsonValueOfElement:TryGetValue[short](byref):ubyte:this
+ cmp dword ptr [rdi], edi
+ 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)
; ============================================================ Note: some changes were skipped as they were too large to fit into a comment. Larger list of diffs: https://gist.github.com/MihuBot/0941e63eb9120b7c0c49e209e1670385 |
7 tasks
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Job completed in 16 minutes 57 seconds (remote runner delay: 1 minute 26 seconds).
dotnet/runtime#112353
Diffs
Diffs
Artifacts:
The text was updated successfully, but these errors were encountered: