Skip to content
New issue

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

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

Already on GitHub? Sign in to your account

[JIT] Fix re-use val zero on GC tracking #84051

Merged
merged 3 commits into from
Apr 4, 2023

Conversation

TIHan
Copy link
Contributor

@TIHan TIHan commented Mar 29, 2023

Resolves #83963

Will need to run GC and JIT stress.

@dotnet-issue-labeler dotnet-issue-labeler bot added the area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI label Mar 29, 2023
@ghost ghost assigned TIHan Mar 29, 2023
@ghost
Copy link

ghost commented Mar 29, 2023

Tagging subscribers to this area: @JulieLeeMSFT, @jakobbotsch, @kunalspathak
See info in area-owners.md if you want to be subscribed.

Issue Details

Resolves #83963

Will need to run GC and JIT stress.

Author: TIHan
Assignees: -
Labels:

area-CodeGen-coreclr

Milestone: -

@TIHan
Copy link
Contributor Author

TIHan commented Mar 29, 2023

/azp run runtime-coreclr jitstress

@TIHan
Copy link
Contributor Author

TIHan commented Mar 29, 2023

/azp run runtime-coreclr gcstress-extra

@azure-pipelines
Copy link

Azure Pipelines successfully started running 1 pipeline(s).

1 similar comment
@azure-pipelines
Copy link

Azure Pipelines successfully started running 1 pipeline(s).

@TIHan TIHan changed the title [JIT] Do not immediately GC track a register that is initially null [JIT] Fix re-use val zero on GC tracking Mar 29, 2023
@TIHan
Copy link
Contributor Author

TIHan commented Mar 29, 2023

/azp run runtime-coreclr jitstress

@azure-pipelines
Copy link

Azure Pipelines successfully started running 1 pipeline(s).

@TIHan
Copy link
Contributor Author

TIHan commented Mar 29, 2023

/azp run runtime-coreclr gcstress-extra

@azure-pipelines
Copy link

Azure Pipelines successfully started running 1 pipeline(s).


if (treeNode->IsIntegralConst(0))
{
genDefineTempLabel(genCreateTempLabel());
Copy link
Contributor Author

@TIHan TIHan Mar 29, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This appears to be the only way to propagate GC info properly.

Copy link
Contributor Author

@TIHan TIHan Mar 30, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@BruceForstall you are probably best to look at this.

The main issue is that we have a null node and a cns_int 0 node re-using the same register, but when that register is being used for cns_int 0, there are circumstances where the GC info hasn't propagated yet and that register is still seen as GC tracked even if it's for an integer. This happens if both the null and cns_int 0 node live within the same IG.

Originally I wanted to simply not GC track a reg that is initially null but that caused many seg faults. I tried that here: 346b9fe
If that worked, then we wouldn't have to worry about GC tracking when registers get re-used.

The only other option, I think, is to propagate the GC info by creating a new label, which creates a new IG; serves as a snapshot of the GC info.

You have any thoughts?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I would think the right fix is something like

gcInfo.gcMarkRegPtrVal(tree->getRegNum(), tree->TypeGet());

Copy link
Contributor Author

@TIHan TIHan Apr 3, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@AndyAyersMS In order for the state of gcInfo to be reflected in the actual emitting of instructions, it has to be propagated via instruction groups, which is what the creation of the label is doing. In this case, the state of gcInfo has already marked the register as a non-pointer, but that information wasn't propagated. gcMarkRegPtrVal doesn't propagate the info, it just sets the state.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It does propagate it, but only during codegen. I suspect the emitter GC tracking doesn't handle a case like this where the gcness of a register can change without writing to the register.

In which case, you might consider introducing a fake instruction that just reinterprets the register with its new GC type and acts like a write; that might convey intention of changing GC type more clearly than forcing a label, which seems a bit fragile and obscure.

Or it might gum up other things. Hard to say.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

you might consider introducing a fake instruction

Ah, I see Bruce had similar comments below.

I agree we can take this fix for now, but we should seriously consider something a bit more explicit. Ideally the code generator would not need to be aware of the peculiar aspects of emitter gc tracking.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I agree that we should introduce a fake instruction, this is what @BruceForstall and I talked about. Seems Bruce beat me to making an issue about it. :)

@TIHan
Copy link
Contributor Author

TIHan commented Mar 29, 2023

/azp run runtime-coreclr jitstress

@azure-pipelines
Copy link

Azure Pipelines successfully started running 1 pipeline(s).

@TIHan
Copy link
Contributor Author

TIHan commented Mar 29, 2023

/azp run runtime-coreclr gcstress-extra

@azure-pipelines
Copy link

Azure Pipelines successfully started running 1 pipeline(s).

@TIHan
Copy link
Contributor Author

TIHan commented Mar 29, 2023

@BruceForstall BruceForstall self-requested a review April 1, 2023 22:11
@TIHan TIHan marked this pull request as ready for review April 3, 2023 19:38
@BruceForstall
Copy link
Member

Should LSRA stop allowing re-use of constant zero? It already prevents re-use of different GC type int constants, but exempts zero. Maybe that exemption should be removed. E.g., in LinearScan::isMatchingConstant():

            if ((v1 == v2) && (varTypeGCtype(refPosition->treeNode) == varTypeGCtype(otherTreeNode) || v1 == 0))

@TIHan
Copy link
Contributor Author

TIHan commented Apr 3, 2023

Should LSRA stop allowing re-use of constant zero?

I tried this last week and there were regressions, I can do it again to get the numbers.

@TIHan
Copy link
Contributor Author

TIHan commented Apr 3, 2023

@BruceForstall Here are the results if we stop allowing re-use:
Diffs are based on 1,521,115 contexts (425,789 MinOpts, 1,095,326 FullOpts).

MISSED contexts: 13 (0.00%)

Overall (+114,574 bytes)
Collection Base size (bytes) Diff size (bytes)
aspnet.run.windows.x64.checked.mch 37,492,990 +6,102
benchmarks.run.windows.x64.checked.mch 10,536,943 +2,046
coreclr_tests.run.windows.x64.checked.mch 381,624,194 +3,413
libraries.crossgen2.windows.x64.checked.mch 34,077,056 +8,682
libraries.pmi.windows.x64.checked.mch 51,913,763 +11,557
libraries_tests.pmi.windows.x64.checked.mch 122,916,830 +82,774
MinOpts (-4 bytes)
Collection Base size (bytes) Diff size (bytes)
aspnet.run.windows.x64.checked.mch 21,984,124 -2
coreclr_tests.run.windows.x64.checked.mch 277,843,251 -2
libraries_tests.pmi.windows.x64.checked.mch 5,062,333 +0
FullOpts (+114,578 bytes)
Collection Base size (bytes) Diff size (bytes)
aspnet.run.windows.x64.checked.mch 15,508,866 +6,104
benchmarks.run.windows.x64.checked.mch 10,080,654 +2,046
coreclr_tests.run.windows.x64.checked.mch 103,780,943 +3,415
libraries.crossgen2.windows.x64.checked.mch 34,075,867 +8,682
libraries.pmi.windows.x64.checked.mch 50,509,418 +11,557
libraries_tests.pmi.windows.x64.checked.mch 117,854,497 +82,774
Example diffs
aspnet.run.windows.x64.checked.mch
-3 (-0.58%) : 51329.dasm - Microsoft.AspNetCore.Mvc.Routing.NormalizedRouteValue:GetNormalizedRouteValue(Microsoft.AspNetCore.Mvc.ActionContext,System.String):System.String
@@ -18,9 +18,9 @@
 ;  V07 tmp1         [V07,T12] (  2,  2   )     ref  ->  rcx         class-hnd single-def "impAppendStmt"
 ;  V08 tmp2         [V08,T03] (  4,  7   )     ref  ->  rbx         class-hnd single-def "Inlining Arg"
 ;  V09 tmp3         [V09,T07] (  3,  3   )     ref  ->  rbp         class-hnd exact single-def "NewObj constructor temp"
-;  V10 tmp4         [V10,T11] (  3,  2   )    bool  ->   r8         "Inline return value spill temp"
+;  V10 tmp4         [V10,T11] (  3,  2   )    bool  ->  rax         "Inline return value spill temp"
 ;  V11 tmp5         [V11,T02] (  6,  9   )     ref  ->  rcx         class-hnd single-def "Inlining Arg"
-;  V12 tmp6         [V12,T14] (  3,  1.50)    bool  ->   r8         "Inline return value spill temp"
+;  V12 tmp6         [V12,T14] (  3,  1.50)    bool  ->  rax         "Inline return value spill temp"
 ;  V13 tmp7         [V13,T06] (  5,  5.50)     ref  ->  rbx         class-hnd single-def "Inline stloc first use temp"
 ;  V14 tmp8         [V14,T05] (  6,  6   )     int  ->  rbp         single-def "Inline stloc first use temp"
 ;  V15 tmp9         [V15,T00] ( 12, 17.54)     int  ->  r15         "Inline stloc first use temp"
@@ -150,22 +150,22 @@ G_M43058_IG09:        ; bbWeight=0.50, gcrefRegs=00C0 {rsi rdi}, byrefRegs=0000
        xor      r8, r8
        ; gcrRegs +[r8]
        mov      gword ptr [rsp+30H], r8
+       xor      eax, eax
        jmp      SHORT G_M43058_IG11
-						;; size=10 bbWeight=0.50 PerfScore 1.62
+						;; size=12 bbWeight=0.50 PerfScore 1.75
 G_M43058_IG10:        ; bbWeight=0.50, gcrefRegs=00C8 {rbx rsi rdi}, byrefRegs=0000 {}, byref
        ; gcrRegs -[r8] +[rbx]
        cmp      r15d, r14d
        jae      G_M43058_IG22
-       mov      r8d, r15d
-       shl      r8, 4
-       mov      r8, gword ptr [rbx+r8+18H]
+       mov      eax, r15d
+       shl      rax, 4
+       mov      r8, gword ptr [rbx+rax+18H]
        ; gcrRegs +[r8]
        mov      gword ptr [rsp+30H], r8
-       mov      r8d, 1
-       ; gcrRegs -[r8]
-						;; size=32 bbWeight=0.50 PerfScore 2.62
+       mov      eax, 1
+						;; size=31 bbWeight=0.50 PerfScore 2.62
 G_M43058_IG11:        ; bbWeight=0.50, gcrefRegs=00C0 {rsi rdi}, byrefRegs=0000 {}, byref, isz
-       ; gcrRegs -[rbx]
+       ; gcrRegs -[rbx r8]
        jmp      SHORT G_M43058_IG13
 						;; size=2 bbWeight=0.50 PerfScore 1.00
 G_M43058_IG12:        ; bbWeight=0.50, gcrefRegs=00C2 {rcx rsi rdi}, byrefRegs=0000 {}, byref
@@ -176,12 +176,11 @@ G_M43058_IG12:        ; bbWeight=0.50, gcrefRegs=00C2 {rcx rsi rdi}, byrefRegs=0
        call     [Microsoft.AspNetCore.Routing.RouteValueDictionary:TryGetValueSlow(System.String,byref):bool:this]
        ; gcrRegs -[rcx rdx]
        ; gcr arg pop 0
-       mov      r8d, eax
-						;; size=17 bbWeight=0.50 PerfScore 2.00
+						;; size=14 bbWeight=0.50 PerfScore 1.88
 G_M43058_IG13:        ; bbWeight=1, gcrefRegs=00C0 {rsi rdi}, byrefRegs=0000 {}, byref, isz
-       test     r8d, r8d
+       test     eax, eax
        jne      SHORT G_M43058_IG16
-						;; size=5 bbWeight=1 PerfScore 1.25
+						;; size=4 bbWeight=1 PerfScore 1.25
 G_M43058_IG14:        ; bbWeight=0.50, gcrefRegs=0000 {}, byrefRegs=0000 {}, byref
        ; gcrRegs -[rsi rdi]
        xor      rax, rax
@@ -290,7 +289,7 @@ G_M43058_IG22:        ; bbWeight=0, gcrefRegs=0000 {}, byrefRegs=0000 {}, byref
        int3     
 						;; size=6 bbWeight=0 PerfScore 0.00
 
-; Total bytes of code 514, prolog size 24, PerfScore 150.00, instruction count 142, allocated bytes for code 514 (MethodHash=96c157cd) for method Microsoft.AspNetCore.Mvc.Routing.NormalizedRouteValue:GetNormalizedRouteValue(Microsoft.AspNetCore.Mvc.ActionContext,System.String):System.String
+; Total bytes of code 511, prolog size 24, PerfScore 149.70, instruction count 142, allocated bytes for code 511 (MethodHash=96c157cd) for method Microsoft.AspNetCore.Mvc.Routing.NormalizedRouteValue:GetNormalizedRouteValue(Microsoft.AspNetCore.Mvc.ActionContext,System.String):System.String
 ; ============================================================
 
 Unwind Info:
-3 (-0.53%) : 51038.dasm - Microsoft.AspNetCore.Mvc.ModelBinding.RouteValueProvider:GetValue(System.String):Microsoft.AspNetCore.Mvc.ModelBinding.ValueProviderResult:this
@@ -19,9 +19,9 @@
 ;  V08 tmp4         [V08    ] (  4,  4   )  struct (16) [rsp+28H]   do-not-enreg[XS] must-init addr-exposed ld-addr-op "NewObj constructor temp"
 ;  V09 tmp5         [V09,T11] (  2,  2   )     ref  ->  rcx         class-hnd single-def "impAppendStmt"
 ;  V10 tmp6         [V10,T12] (  2,  2   )     ref  ->  rsi         class-hnd single-def "dup spill"
-;  V11 tmp7         [V11,T14] (  3,  1.50)    bool  ->   r8         "Inline return value spill temp"
+;  V11 tmp7         [V11,T14] (  3,  1.50)    bool  ->  rax         "Inline return value spill temp"
 ;  V12 tmp8         [V12,T03] (  6,  6   )     ref  ->  rcx         class-hnd single-def "Inlining Arg"
-;  V13 tmp9         [V13,T15] (  3,  1.50)    bool  ->   r8         "Inline return value spill temp"
+;  V13 tmp9         [V13,T15] (  3,  1.50)    bool  ->  rax         "Inline return value spill temp"
 ;  V14 tmp10        [V14,T06] (  5,  5.50)     ref  ->  rsi         class-hnd single-def "Inline stloc first use temp"
 ;  V15 tmp11        [V15,T04] (  6,  6   )     int  ->  rdi         single-def "Inline stloc first use temp"
 ;  V16 tmp12        [V16,T00] ( 12, 17.54)     int  ->  r12         "Inline stloc first use temp"
@@ -158,22 +158,22 @@ G_M18260_IG09:        ; bbWeight=0.50, gcrefRegs=4000 {r14}, byrefRegs=0020 {rbp
        xor      r8, r8
        ; gcrRegs +[r8]
        mov      gword ptr [rsp+38H], r8
+       xor      eax, eax
        jmp      SHORT G_M18260_IG11
-						;; size=10 bbWeight=0.50 PerfScore 1.62
+						;; size=12 bbWeight=0.50 PerfScore 1.75
 G_M18260_IG10:        ; bbWeight=0.50, gcrefRegs=4040 {rsi r14}, byrefRegs=0020 {rbp}, byref
        ; gcrRegs -[r8] +[rsi]
        cmp      r12d, r15d
        jae      G_M18260_IG21
-       mov      r8d, r12d
-       shl      r8, 4
-       mov      r8, gword ptr [rsi+r8+18H]
+       mov      eax, r12d
+       shl      rax, 4
+       mov      r8, gword ptr [rsi+rax+18H]
        ; gcrRegs +[r8]
        mov      gword ptr [rsp+38H], r8
-       mov      r8d, 1
-       ; gcrRegs -[r8]
-						;; size=32 bbWeight=0.50 PerfScore 2.62
+       mov      eax, 1
+						;; size=31 bbWeight=0.50 PerfScore 2.62
 G_M18260_IG11:        ; bbWeight=0.50, gcrefRegs=4000 {r14}, byrefRegs=0020 {rbp}, byref, isz
-       ; gcrRegs -[rsi]
+       ; gcrRegs -[rsi r8]
        jmp      SHORT G_M18260_IG13
 						;; size=2 bbWeight=0.50 PerfScore 1.00
 G_M18260_IG12:        ; bbWeight=0.50, gcrefRegs=400A {rcx rbx r14}, byrefRegs=0020 {rbp}, byref
@@ -184,16 +184,15 @@ G_M18260_IG12:        ; bbWeight=0.50, gcrefRegs=400A {rcx rbx r14}, byrefRegs=0
        call     [Microsoft.AspNetCore.Routing.RouteValueDictionary:TryGetValueSlow(System.String,byref):bool:this]
        ; gcrRegs -[rcx rdx rbx]
        ; gcr arg pop 0
-       mov      r8d, eax
-						;; size=17 bbWeight=0.50 PerfScore 2.00
+						;; size=14 bbWeight=0.50 PerfScore 1.88
 G_M18260_IG13:        ; bbWeight=0.50, gcrefRegs=4000 {r14}, byrefRegs=0020 {rbp}, byref, isz
-       test     r8d, r8d
+       test     eax, eax
        je       G_M18260_IG18
        mov      rdx, gword ptr [rsp+38H]
        ; gcrRegs +[rdx]
        cmp      gword ptr [rsp+38H], 0
        je       SHORT G_M18260_IG15
-						;; size=22 bbWeight=0.50 PerfScore 2.62
+						;; size=21 bbWeight=0.50 PerfScore 2.62
 G_M18260_IG14:        ; bbWeight=0.25, gcrefRegs=4004 {rdx r14}, byrefRegs=0020 {rbp}, byref
        mov      rcx, gword ptr [rsp+38H]
        ; gcrRegs +[rcx]
@@ -315,7 +314,7 @@ G_M18260_IG21:        ; bbWeight=0, gcrefRegs=0000 {}, byrefRegs=0000 {}, byref
        int3     
 						;; size=6 bbWeight=0 PerfScore 0.00
 
-; Total bytes of code 562, prolog size 31, PerfScore 153.90, instruction count 159, allocated bytes for code 562 (MethodHash=88c5b8ab) for method Microsoft.AspNetCore.Mvc.ModelBinding.RouteValueProvider:GetValue(System.String):Microsoft.AspNetCore.Mvc.ModelBinding.ValueProviderResult:this
+; Total bytes of code 559, prolog size 31, PerfScore 153.60, instruction count 159, allocated bytes for code 559 (MethodHash=88c5b8ab) for method Microsoft.AspNetCore.Mvc.ModelBinding.RouteValueProvider:GetValue(System.String):Microsoft.AspNetCore.Mvc.ModelBinding.ValueProviderResult:this
 ; ============================================================
 
 Unwind Info:
-1 (-0.53%) : 107846.dasm - System.Security.Cryptography.X509Certificates.ChainPal:Verify(int,byref):System.Nullable`1[bool]:this
@@ -39,16 +39,16 @@ G_M2737_IG02:        ; bbWeight=1, gcrefRegs=0000 {}, byrefRegs=0000 {}, byref,
        mov      edx, dword ptr [rbp+18H]
        ; byrRegs -[rdx]
        mov      dword ptr [rbp-0CH], edx
-       xor      r9d, r9d
-       ; gcrRegs -[r9]
+       xor      edx, edx
        vxorps   xmm0, xmm0
        vmovdqu  xmmword ptr [rbp-28H], xmm0
-       mov      qword ptr [rbp-18H], r9
+       mov      qword ptr [rbp-18H], rdx
        mov      dword ptr [rbp-28H], 24
        mov      rdx, gword ptr [rbp+10H]
        ; gcrRegs +[rdx]
        mov      rdx, gword ptr [rdx+08H]
        lea      r9, [rbp-28H]
+       ; gcrRegs -[r9]
        lea      r8, [rbp-10H]
        mov      ecx, 1
        call     [<unknown method>]
@@ -69,7 +69,7 @@ G_M2737_IG02:        ; bbWeight=1, gcrefRegs=0000 {}, byrefRegs=0000 {}, byref,
        ; byrRegs -[rcx]
        mov      word  ptr [rbp-38H], 0
        mov      eax, dword ptr [rbp-38H]
-						;; size=124 bbWeight=1 PerfScore 28.92
+						;; size=123 bbWeight=1 PerfScore 28.92
 G_M2737_IG03:        ; bbWeight=1, epilog, nogc, extend
        add      rsp, 96
        pop      rbp
@@ -90,7 +90,7 @@ G_M2737_IG05:        ; bbWeight=1, epilog, nogc, extend
        ret      
 						;; size=6 bbWeight=1 PerfScore 1.75
 
-; Total bytes of code 188, prolog size 13, PerfScore 65.72, instruction count 50, allocated bytes for code 188 (MethodHash=47d7f54e) for method System.Security.Cryptography.X509Certificates.ChainPal:Verify(int,byref):System.Nullable`1[bool]:this
+; Total bytes of code 187, prolog size 13, PerfScore 65.62, instruction count 50, allocated bytes for code 187 (MethodHash=47d7f54e) for method System.Security.Cryptography.X509Certificates.ChainPal:Verify(int,byref):System.Nullable`1[bool]:this
 ; ============================================================
 
 Unwind Info:
+2 (+20.00%) : 78920.dasm - System.Collections.Specialized.OrderedDictionary:.ctor():this
@@ -20,13 +20,15 @@ G_M25491_IG02:        ; bbWeight=1, gcrefRegs=0002 {rcx}, byrefRegs=0000 {}, byr
        ; gcrRegs +[rcx]
        xor      eax, eax
        mov      dword ptr [rcx+28H], eax
+       xor      rax, rax
+       ; gcrRegs +[rax]
        mov      gword ptr [rcx+18H], rax
-						;; size=9 bbWeight=1 PerfScore 2.25
+						;; size=11 bbWeight=1 PerfScore 2.50
 G_M25491_IG03:        ; bbWeight=1, epilog, nogc, extend
        ret      
 						;; size=1 bbWeight=1 PerfScore 1.00
 
-; Total bytes of code 10, prolog size 0, PerfScore 4.25, instruction count 4, allocated bytes for code 10 (MethodHash=111b9c6c) for method System.Collections.Specialized.OrderedDictionary:.ctor():this
+; Total bytes of code 12, prolog size 0, PerfScore 4.70, instruction count 5, allocated bytes for code 12 (MethodHash=111b9c6c) for method System.Collections.Specialized.OrderedDictionary:.ctor():this
 ; ============================================================
 
 Unwind Info:
+2 (+20.00%) : 63025.dasm - System.IO.StringReader:Dispose(bool):this
@@ -21,13 +21,15 @@ G_M32759_IG02:        ; bbWeight=1, gcrefRegs=0002 {rcx}, byrefRegs=0000 {}, byr
        xor      rax, rax
        ; gcrRegs +[rax]
        mov      gword ptr [rcx+08H], rax
+       xor      eax, eax
+       ; gcrRegs -[rax]
        mov      dword ptr [rcx+10H], eax
-						;; size=9 bbWeight=1 PerfScore 2.25
+						;; size=11 bbWeight=1 PerfScore 2.50
 G_M32759_IG03:        ; bbWeight=1, epilog, nogc, extend
        ret      
 						;; size=1 bbWeight=1 PerfScore 1.00
 
-; Total bytes of code 10, prolog size 0, PerfScore 4.25, instruction count 4, allocated bytes for code 10 (MethodHash=28148008) for method System.IO.StringReader:Dispose(bool):this
+; Total bytes of code 12, prolog size 0, PerfScore 4.70, instruction count 5, allocated bytes for code 12 (MethodHash=28148008) for method System.IO.StringReader:Dispose(bool):this
 ; ============================================================
 
 Unwind Info:
+2 (+20.00%) : 51320.dasm - System.Collections.Specialized.OrderedDictionary:.ctor():this
@@ -19,13 +19,15 @@ G_M25491_IG02:        ; bbWeight=1, gcrefRegs=0002 {rcx}, byrefRegs=0000 {}, byr
        ; gcrRegs +[rcx]
        xor      eax, eax
        mov      dword ptr [rcx+28H], eax
+       xor      rax, rax
+       ; gcrRegs +[rax]
        mov      gword ptr [rcx+18H], rax
-						;; size=9 bbWeight=1 PerfScore 2.25
+						;; size=11 bbWeight=1 PerfScore 2.50
 G_M25491_IG03:        ; bbWeight=1, epilog, nogc, extend
        ret      
 						;; size=1 bbWeight=1 PerfScore 1.00
 
-; Total bytes of code 10, prolog size 0, PerfScore 4.25, instruction count 4, allocated bytes for code 10 (MethodHash=111b9c6c) for method System.Collections.Specialized.OrderedDictionary:.ctor():this
+; Total bytes of code 12, prolog size 0, PerfScore 4.70, instruction count 5, allocated bytes for code 12 (MethodHash=111b9c6c) for method System.Collections.Specialized.OrderedDictionary:.ctor():this
 ; ============================================================
 
 Unwind Info:
benchmarks.run.windows.x64.checked.mch
+2 (+0.02%) : 27954.dasm - Microsoft.CodeAnalysis.CSharp.Imports:FromSyntax(Microsoft.CodeAnalysis.CSharp.CSharpSyntaxNode,Microsoft.CodeAnalysis.CSharp.InContainerBinder,Roslyn.Utilities.ConsList`1[Microsoft.CodeAnalysis.CSharp.Symbols.TypeSymbol],bool):Microsoft.CodeAnalysis.CSharp.Imports
@@ -3890,8 +3890,11 @@ G_M52814_IG139:        ; bbWeight=2, gcrefRegs=D0EA {rcx rbx rbp rsi rdi r12 r14
        mov      gword ptr [rsp+388H], rcx
        mov      dword ptr [rsp+390H], edx
        mov      dword ptr [rsp+394H], -1
+       xor      ecx, ecx
+       ; gcrRegs -[rcx]
        mov      dword ptr [rsp+20H], ecx
        mov      rcx, r8
+       ; gcrRegs +[rcx]
        mov      rdx, rbp
        ; gcrRegs +[rdx]
        mov      r8, gword ptr [rsp+338H]
@@ -3937,7 +3940,7 @@ G_M52814_IG139:        ; bbWeight=2, gcrefRegs=D0EA {rcx rbx rbp rsi rdi r12 r14
        mov      edx, r10d
        mov      gword ptr [rsp+58H], rax
        jmp      SHORT G_M52814_IG142
-						;; size=197 bbWeight=2 PerfScore 82.00
+						;; size=199 bbWeight=2 PerfScore 82.50
 G_M52814_IG140:        ; bbWeight=1, gcVars=000000000000000000000000040000000000000000000000000000000000000000000000000000000000010000000080 {V10 V371 V493}, gcrefRegs=F2E9 {rax rbx rbp rsi rdi r9 r12 r13 r14 r15}, byrefRegs=0000 {}, gcvars, byref, isz
        ; gcrRegs -[rcx r8]
        ; GC ptr vars -{V09 V18 V25 V492}
@@ -4455,7 +4458,7 @@ G_M52814_IG169:        ; bbWeight=0, gcrefRegs=0000 {}, byrefRegs=0000 {}, byref
        int3     
 						;; size=6 bbWeight=0 PerfScore 0.00
 
-; Total bytes of code 9960, prolog size 98, PerfScore 5021.75, instruction count 1953, allocated bytes for code 9960 (MethodHash=ca8231b1) for method Microsoft.CodeAnalysis.CSharp.Imports:FromSyntax(Microsoft.CodeAnalysis.CSharp.CSharpSyntaxNode,Microsoft.CodeAnalysis.CSharp.InContainerBinder,Roslyn.Utilities.ConsList`1[Microsoft.CodeAnalysis.CSharp.Symbols.TypeSymbol],bool):Microsoft.CodeAnalysis.CSharp.Imports
+; Total bytes of code 9962, prolog size 98, PerfScore 5022.45, instruction count 1954, allocated bytes for code 9962 (MethodHash=ca8231b1) for method Microsoft.CodeAnalysis.CSharp.Imports:FromSyntax(Microsoft.CodeAnalysis.CSharp.CSharpSyntaxNode,Microsoft.CodeAnalysis.CSharp.InContainerBinder,Roslyn.Utilities.ConsList`1[Microsoft.CodeAnalysis.CSharp.Symbols.TypeSymbol],bool):Microsoft.CodeAnalysis.CSharp.Imports
 ; ============================================================
 
 Unwind Info:
+2 (+0.02%) : 34318.dasm - System.Net.WebSockets.ManagedWebSocket+d__63`1[System.Net.WebSockets.ValueWebSocketReceiveResult]:MoveNext():this
@@ -1450,9 +1450,12 @@ G_M39768_IG52:        ; bbWeight=4, gcrefRegs=0080 {rdi}, byrefRegs=0040 {rsi},
        mov      dword ptr [rbp-16CH], 0x3EA
        mov      dword ptr [rbp-168H], 2
        mov      gword ptr [rbp-180H], rax
+       xor      rcx, rcx
+       ; gcrRegs +[rcx]
        mov      gword ptr [rbp-178H], rcx
        mov      dword ptr [rbp-170H], -1
        lea      rcx, [rbp-188H]
+       ; gcrRegs -[rcx]
        call     [<unknown method>]
        ; gcrRegs -[rax rdi]
        ; gcr arg pop 0
@@ -1487,7 +1490,7 @@ G_M39768_IG52:        ; bbWeight=4, gcrefRegs=0080 {rdi}, byrefRegs=0040 {rsi},
        test     rax, rax
        setne    cl
        jmp      SHORT G_M39768_IG54
-						;; size=207 bbWeight=4 PerfScore 163.00
+						;; size=209 bbWeight=4 PerfScore 164.00
 G_M39768_IG53:        ; bbWeight=4, gcrefRegs=0008 {rbx}, byrefRegs=0040 {rsi}, byref
        ; gcrRegs -[rax]
        mov      ecx, 1
@@ -4020,7 +4023,7 @@ RWD00  	dd	G_M39768_IG19 - G_M39768_IG02
        	dd	G_M39768_IG174 - G_M39768_IG02
 
 
-; Total bytes of code 8460, prolog size 98, PerfScore 4543.42, instruction count 1963, allocated bytes for code 8460 (MethodHash=70b364a7) for method System.Net.WebSockets.ManagedWebSocket+<ReceiveAsyncPrivate>d__63`1[System.Net.WebSockets.ValueWebSocketReceiveResult]:MoveNext():this
+; Total bytes of code 8462, prolog size 98, PerfScore 4544.62, instruction count 1964, allocated bytes for code 8462 (MethodHash=70b364a7) for method System.Net.WebSockets.ManagedWebSocket+<ReceiveAsyncPrivate>d__63`1[System.Net.WebSockets.ValueWebSocketReceiveResult]:MoveNext():this
 ; ============================================================
 
 Unwind Info:
+2 (+0.03%) : 6903.dasm - System.Text.Json.Serialization.Converters.ObjectWithParameterizedConstructorConverter`1[System.__Canon]:OnTryRead(byref,System.Type,System.Text.Json.JsonSerializerOptions,byref,byref):bool:this
@@ -2435,7 +2435,9 @@ G_M31224_IG146:        ; bbWeight=0.50, gcVars=000000000000000000000000000000000
        xor      rax, rax
        ; gcrRegs +[rax]
        mov      gword ptr [r12], rax
-						;; size=6 bbWeight=0.50 PerfScore 0.62
+       xor      eax, eax
+       ; gcrRegs -[rax]
+						;; size=8 bbWeight=0.50 PerfScore 0.75
 G_M31224_IG147:        ; bbWeight=0.50, epilog, nogc, extend
        add      rsp, 0x6F8
        pop      rbx
@@ -2449,7 +2451,7 @@ G_M31224_IG147:        ; bbWeight=0.50, epilog, nogc, extend
        ret      
 						;; size=20 bbWeight=0.50 PerfScore 2.62
 G_M31224_IG148:        ; bbWeight=2, gcVars=0000000000000000000000000000000000000000002000000000009022000000 {V06 V25 V26 V27 V348}, gcrefRegs=E6C0 {rsi rdi r9 r10 r13 r14 r15}, byrefRegs=1020 {rbp r12}, gcvars, byref, isz
-       ; gcrRegs -[rax] +[rsi rdi r9-r10 r13 r15]
+       ; gcrRegs +[rsi rdi r9-r10 r13 r15]
        ; byrRegs +[rbp]
        ; GC ptr vars +{V06 V25 V26 V27 V29 V85 V348}
        mov      rcx, rdi
@@ -2926,7 +2928,7 @@ G_M31224_IG183:        ; bbWeight=0, gcrefRegs=4000 {r14}, byrefRegs=0000 {}, by
        int3     
 						;; size=6 bbWeight=0 PerfScore 0.00
 
-; Total bytes of code 6622, prolog size 110, PerfScore 3112.20, instruction count 1364, allocated bytes for code 6624 (MethodHash=3e6d8607) for method System.Text.Json.Serialization.Converters.ObjectWithParameterizedConstructorConverter`1[System.__Canon]:OnTryRead(byref,System.Type,System.Text.Json.JsonSerializerOptions,byref,byref):bool:this
+; Total bytes of code 6624, prolog size 110, PerfScore 3112.52, instruction count 1365, allocated bytes for code 6626 (MethodHash=3e6d8607) for method System.Text.Json.Serialization.Converters.ObjectWithParameterizedConstructorConverter`1[System.__Canon]:OnTryRead(byref,System.Type,System.Text.Json.JsonSerializerOptions,byref,byref):bool:this
 ; ============================================================
 
 Unwind Info:
+14 (+18.67%) : 8122.dasm - System.Runtime.Serialization.Formatters.Binary.ObjectProgress:Init():this
@@ -19,28 +19,42 @@ G_M29322_IG02:        ; bbWeight=1, gcrefRegs=0002 {rcx}, byrefRegs=0000 {}, byr
        xor      eax, eax
        mov      dword ptr [rcx+50H], eax
        mov      dword ptr [rcx+54H], 3
+       xor      rax, rax
+       ; gcrRegs +[rax]
        mov      gword ptr [rcx+08H], rax
        mov      gword ptr [rcx+10H], rax
+       xor      eax, eax
+       ; gcrRegs -[rax]
        mov      dword ptr [rcx+58H], eax
        mov      dword ptr [rcx+5CH], eax
        mov      dword ptr [rcx+60H], eax
+       xor      rax, rax
+       ; gcrRegs +[rax]
        mov      gword ptr [rcx+18H], rax
+       xor      eax, eax
+       ; gcrRegs -[rax]
        mov      dword ptr [rcx+64H], eax
+       xor      rax, rax
+       ; gcrRegs +[rax]
        mov      gword ptr [rcx+20H], rax
+       xor      eax, eax
+       ; gcrRegs -[rax]
        mov      dword ptr [rcx+6CH], eax
+       xor      rax, rax
+       ; gcrRegs +[rax]
        mov      gword ptr [rcx+28H], rax
        mov      gword ptr [rcx+30H], rax
        mov      gword ptr [rcx+38H], rax
        mov      gword ptr [rcx+40H], rax
        mov      rcx, gword ptr [rcx+48H]
        cmp      dword ptr [rcx], ecx
-						;; size=69 bbWeight=1 PerfScore 21.25
+						;; size=83 bbWeight=1 PerfScore 23.00
 G_M29322_IG03:        ; bbWeight=1, epilog, nogc, extend
        tail.jmp [<unknown method>]
        ; gcr arg pop 0
 						;; size=6 bbWeight=1 PerfScore 2.00
 
-; Total bytes of code 75, prolog size 0, PerfScore 30.75, instruction count 20, allocated bytes for code 75 (MethodHash=1b918d75) for method System.Runtime.Serialization.Formatters.Binary.ObjectProgress:Init():this
+; Total bytes of code 89, prolog size 0, PerfScore 33.90, instruction count 27, allocated bytes for code 89 (MethodHash=1b918d75) for method System.Runtime.Serialization.Formatters.Binary.ObjectProgress:Init():this
 ; ============================================================
 
 Unwind Info:
+2 (+20.00%) : 3518.dasm - System.IO.StringReader:Dispose(bool):this
@@ -20,13 +20,15 @@ G_M32759_IG02:        ; bbWeight=1, gcrefRegs=0002 {rcx}, byrefRegs=0000 {}, byr
        xor      rax, rax
        ; gcrRegs +[rax]
        mov      gword ptr [rcx+08H], rax
+       xor      eax, eax
+       ; gcrRegs -[rax]
        mov      dword ptr [rcx+10H], eax
-						;; size=9 bbWeight=1 PerfScore 2.25
+						;; size=11 bbWeight=1 PerfScore 2.50
 G_M32759_IG03:        ; bbWeight=1, epilog, nogc, extend
        ret      
 						;; size=1 bbWeight=1 PerfScore 1.00
 
-; Total bytes of code 10, prolog size 0, PerfScore 4.25, instruction count 4, allocated bytes for code 10 (MethodHash=28148008) for method System.IO.StringReader:Dispose(bool):this
+; Total bytes of code 12, prolog size 0, PerfScore 4.70, instruction count 5, allocated bytes for code 12 (MethodHash=28148008) for method System.IO.StringReader:Dispose(bool):this
 ; ============================================================
 
 Unwind Info:
+2 (+33.33%) : 31227.dasm - System.Net.CredentialCache+CredentialEnumerator:MoveNext(byref):bool:this
@@ -19,12 +19,14 @@ G_M60932_IG02:        ; bbWeight=1, gcrefRegs=0000 {}, byrefRegs=0004 {rdx}, byr
        xor      rax, rax
        ; gcrRegs +[rax]
        mov      gword ptr [rdx], rax
-						;; size=5 bbWeight=1 PerfScore 1.25
+       xor      eax, eax
+       ; gcrRegs -[rax]
+						;; size=7 bbWeight=1 PerfScore 1.50
 G_M60932_IG03:        ; bbWeight=1, epilog, nogc, extend
        ret      
 						;; size=1 bbWeight=1 PerfScore 1.00
 
-; Total bytes of code 6, prolog size 0, PerfScore 2.85, instruction count 3, allocated bytes for code 6 (MethodHash=f85b11fb) for method System.Net.CredentialCache+CredentialEnumerator:MoveNext(byref):bool:this
+; Total bytes of code 8, prolog size 0, PerfScore 3.30, instruction count 4, allocated bytes for code 8 (MethodHash=f85b11fb) for method System.Net.CredentialCache+CredentialEnumerator:MoveNext(byref):bool:this
 ; ============================================================
 
 Unwind Info:
coreclr_tests.run.windows.x64.checked.mch
-2 (-0.11%) : 431188.dasm - System.Xml.Xsl.Xslt.XslAstAnalyzer+XPathAnalyzer:Function(System.String,System.String,System.Collections.Generic.IList`1[int]):int:this
@@ -61,17 +61,19 @@ G_M43217_IG02:        ; bbWeight=1, gcrefRegs=0000 {}, byrefRegs=0000 {}, byref
        xor      r11, r11
        ; gcrRegs +[r11]
        mov      gword ptr [rcx+20H], r11
-       xor      r11d, r11d
-       ; gcrRegs -[r11]
-       mov      dword ptr [rbp-3CH], r11d
+       xor      ecx, ecx
+       ; gcrRegs -[rcx]
+       mov      dword ptr [rbp-3CH], ecx
        mov      rcx, gword ptr [rbp+28H]
+       ; gcrRegs +[rcx]
        mov      r11, 0xD1FFAB1E      ; code for <unknown method>
+       ; gcrRegs -[r11]
        call     [r11]<unknown method>
        ; gcrRegs -[rcx] +[rax]
        ; gcr arg pop 0
        mov      gword ptr [rbp-48H], rax
        mov      dword ptr [rbp-A8H], 0x3E8
-						;; size=49 bbWeight=1 PerfScore 9.75
+						;; size=47 bbWeight=1 PerfScore 9.75
 G_M43217_IG03:        ; bbWeight=1, gcrefRegs=0000 {}, byrefRegs=0000 {}, byref, isz
        ; gcrRegs -[rax]
        jmp      SHORT G_M43217_IG05
@@ -700,7 +702,7 @@ RWD00  	dd	G_M43217_IG20 - G_M43217_IG02
        	dd	G_M43217_IG19 - G_M43217_IG02
 
 
-; Total bytes of code 1881, prolog size 93, PerfScore 667.45, instruction count 395, allocated bytes for code 1881 (MethodHash=68d1572e) for method System.Xml.Xsl.Xslt.XslAstAnalyzer+XPathAnalyzer:Function(System.String,System.String,System.Collections.Generic.IList`1[int]):int:this
+; Total bytes of code 1879, prolog size 93, PerfScore 667.25, instruction count 395, allocated bytes for code 1879 (MethodHash=68d1572e) for method System.Xml.Xsl.Xslt.XslAstAnalyzer+XPathAnalyzer:Function(System.String,System.String,System.Collections.Generic.IList`1[int]):int:this
 ; ============================================================
 
 Unwind Info:
+0 (0.00%) : 470401.dasm - System.Collections.Concurrent.ConcurrentDictionary`2[int,System.__Canon]:TryRemoveInternal(int,byref,bool,System.__Canon):bool:this
@@ -311,13 +311,13 @@ G_M9585_IG18:        ; bbWeight=1, gcrefRegs=0000 {}, byrefRegs=0000 {}, byref,
        xor      rdx, rdx
        ; gcrRegs +[rdx]
        mov      gword ptr [rcx], rdx
-       xor      edx, edx
-       ; gcrRegs -[rdx]
-       mov      dword ptr [rbp-98H], edx
+       xor      ecx, ecx
+       ; byrRegs -[rcx]
+       mov      dword ptr [rbp-98H], ecx
        jmp      G_M9585_IG34
 						;; size=96 bbWeight=1 PerfScore 27.50
 G_M9585_IG19:        ; bbWeight=1, gcrefRegs=0000 {}, byrefRegs=0000 {}, byref, isz
-       ; byrRegs -[rcx]
+       ; gcrRegs -[rdx]
        cmp      gword ptr [rbp-88H], 0
        jne      SHORT G_M9585_IG23
        mov      rdx, gword ptr [rbp+10H]
+0 (0.00%) : 459939.dasm - ILGEN_0x97f1b6bf:Method_0xda70a253():uint
@@ -196,13 +196,12 @@ G_M58389_IG03:        ; bbWeight=1, extend
        mov      dword ptr [rcx], eax
 						;; size=318 bbWeight=1 PerfScore 38.25
 G_M58389_IG04:        ; bbWeight=1, isz, extend
-       xor      rdx, rdx
-       ; gcrRegs +[rdx]
-       mov      gword ptr [rbp-58H], rdx
-       mov      dword ptr [rbp-5CH], 4
-       mov      rcx, gword ptr [rbp-48H]
+       xor      rcx, rcx
        ; gcrRegs +[rcx]
        ; byrRegs -[rcx]
+       mov      gword ptr [rbp-58H], rcx
+       mov      dword ptr [rbp-5CH], 4
+       mov      rcx, gword ptr [rbp-48H]
        mov      gword ptr [rbp-68H], rcx
        mov      dword ptr [rbp-6CH], 2
        cmp      qword ptr [rbp-10H], 0
@@ -223,7 +222,6 @@ G_M58389_IG04:        ; bbWeight=1, isz, extend
        jmp      SHORT G_M58389_IG06
 						;; size=80 bbWeight=1 PerfScore 20.25
 G_M58389_IG05:        ; bbWeight=1, gcrefRegs=0000 {}, byrefRegs=0000 {}, byref
-       ; gcrRegs -[rdx]
        mov      rcx, gword ptr [rbp-58H]
        ; gcrRegs +[rcx]
        mov      gword ptr [rbp-78H], rcx
+2 (+11.76%) : 297211.dasm - System.RuntimeType+ListBuilder`1[System.__Canon]:.ctor(int):this
@@ -21,14 +21,16 @@ G_M14044_IG02:        ; bbWeight=1, gcrefRegs=0000 {}, byrefRegs=0002 {rcx}, byr
        ; gcrRegs +[rax]
        mov      gword ptr [rcx], rax
        mov      gword ptr [rcx+08H], rax
+       xor      eax, eax
+       ; gcrRegs -[rax]
        mov      dword ptr [rcx+10H], eax
        mov      dword ptr [rcx+14H], r8d
-						;; size=16 bbWeight=1 PerfScore 4.25
+						;; size=18 bbWeight=1 PerfScore 4.50
 G_M14044_IG03:        ; bbWeight=1, epilog, nogc, extend
        ret      
 						;; size=1 bbWeight=1 PerfScore 1.00
 
-; Total bytes of code 17, prolog size 0, PerfScore 6.95, instruction count 6, allocated bytes for code 17 (MethodHash=3bacc923) for method System.RuntimeType+ListBuilder`1[System.__Canon]:.ctor(int):this
+; Total bytes of code 19, prolog size 0, PerfScore 7.40, instruction count 7, allocated bytes for code 19 (MethodHash=3bacc923) for method System.RuntimeType+ListBuilder`1[System.__Canon]:.ctor(int):this
 ; ============================================================
 
 Unwind Info:
+3 (+12.50%) : 4693.dasm - System.Collections.Concurrent.ConcurrentDictionary`2[System.Text.RegularExpressions.RegexCache+Key,System.__Canon]:.ctor(int,int):this
@@ -22,17 +22,19 @@ G_M24429_IG02:        ; bbWeight=1, gcrefRegs=0002 {rcx}, byrefRegs=0000 {}, byr
        ; gcrRegs +[r9]
        mov      gword ptr [rsp+20H], r9
        ; gcr arg write
+       xor      r9d, r9d
+       ; gcrRegs -[r9]
        call     [<unknown method>]
-       ; gcrRegs -[rcx r9]
+       ; gcrRegs -[rcx]
        ; gcr arg pop 0
        nop      
-						;; size=15 bbWeight=1 PerfScore 4.50
+						;; size=18 bbWeight=1 PerfScore 4.75
 G_M24429_IG03:        ; bbWeight=1, epilog, nogc, extend
        add      rsp, 40
        ret      
 						;; size=5 bbWeight=1 PerfScore 1.25
 
-; Total bytes of code 24, prolog size 4, PerfScore 8.40, instruction count 7, allocated bytes for code 24 (MethodHash=aebda092) for method System.Collections.Concurrent.ConcurrentDictionary`2[System.Text.RegularExpressions.RegexCache+Key,System.__Canon]:.ctor(int,int):this
+; Total bytes of code 27, prolog size 4, PerfScore 8.95, instruction count 8, allocated bytes for code 27 (MethodHash=aebda092) for method System.Collections.Concurrent.ConcurrentDictionary`2[System.Text.RegularExpressions.RegexCache+Key,System.__Canon]:.ctor(int,int):this
 ; ============================================================
 
 Unwind Info:
+6 (+16.22%) : 478651.dasm - System.Reflection.Emit.ModuleBuilder:DefineType(System.String,int):System.Reflection.Emit.TypeBuilder:this
@@ -24,21 +24,25 @@ G_M31449_IG02:        ; bbWeight=1, gcrefRegs=0006 {rcx rdx}, byrefRegs=0000 {},
        ; gcrRegs +[r9]
        mov      gword ptr [rsp+20H], r9
        ; gcr arg write
+       xor      r9d, r9d
+       ; gcrRegs -[r9]
        mov      dword ptr [rsp+28H], r9d
        mov      dword ptr [rsp+30H], r9d
+       xor      r9, r9
+       ; gcrRegs +[r9]
        mov      rax, qword ptr [rcx]
        mov      rax, qword ptr [rax+70H]
        call     [rax]<unknown method>
        ; gcrRegs -[rcx rdx r9] +[rax]
        ; gcr arg pop 0
        nop      
-						;; size=28 bbWeight=1 PerfScore 10.50
+						;; size=34 bbWeight=1 PerfScore 11.00
 G_M31449_IG03:        ; bbWeight=1, epilog, nogc, extend
        add      rsp, 56
        ret      
 						;; size=5 bbWeight=1 PerfScore 1.25
 
-; Total bytes of code 37, prolog size 4, PerfScore 15.70, instruction count 11, allocated bytes for code 37 (MethodHash=67998526) for method System.Reflection.Emit.ModuleBuilder:DefineType(System.String,int):System.Reflection.Emit.TypeBuilder:this
+; Total bytes of code 43, prolog size 4, PerfScore 16.80, instruction count 13, allocated bytes for code 43 (MethodHash=67998526) for method System.Reflection.Emit.ModuleBuilder:DefineType(System.String,int):System.Reflection.Emit.TypeBuilder:this
 ; ============================================================
 
 Unwind Info:
libraries.crossgen2.windows.x64.checked.mch
-18 (-2.02%) : 34933.dasm - Microsoft.CodeAnalysis.VisualBasic.Syntax.InternalSyntax.Parser:ParseOnErrorGoto(Microsoft.CodeAnalysis.VisualBasic.Syntax.InternalSyntax.KeywordSyntax,Microsoft.CodeAnalysis.VisualBasic.Syntax.InternalSyntax.KeywordSyntax):Microsoft.CodeAnalysis.VisualBasic.Syntax.InternalSyntax.OnErrorGoToStatementSyntax:this
@@ -12,18 +12,18 @@
 ;  V01 arg1         [V01,T06] (  3,  3   )     ref  ->  rdi         class-hnd single-def
 ;  V02 arg2         [V02,T07] (  3,  3   )     ref  ->  rbx         class-hnd single-def
 ;  V03 loc0         [V03,T20] (  2,  2   )     ref  ->  r15         class-hnd single-def
-;  V04 loc1         [V04,T19] (  3,  2.50)     ref  ->  [rbp-58H]   class-hnd
-;  V05 loc2         [V05,T17] (  4,  2.50)     ref  ->  [rbp-60H]   class-hnd
+;  V04 loc1         [V04,T19] (  3,  2.50)     ref  ->  [rbp-50H]   class-hnd
+;  V05 loc2         [V05,T17] (  4,  2.50)     ref  ->  [rbp-58H]   class-hnd
 ;  V06 loc3         [V06,T18] (  4,  2.50)  ushort  ->  [rbp-3CH]  
-;  V07 loc4         [V07,T05] (  7,  5   )     ref  ->  [rbp-68H]   class-hnd spill-single-def
+;  V07 loc4         [V07,T05] (  7,  5   )     ref  ->  [rbp-60H]   class-hnd spill-single-def
 ;  V08 OutArgs      [V08    ] (  1,  1   )  struct (64) [rsp+00H]   do-not-enreg[XS] addr-exposed "OutgoingArgSpace"
-;  V09 tmp1         [V09,T21] (  2,  2   )     ref  ->  [rbp-70H]   class-hnd single-def "impAppendStmt"
+;  V09 tmp1         [V09,T21] (  2,  2   )     ref  ->  [rbp-68H]   class-hnd single-def "impAppendStmt"
 ;* V10 tmp2         [V10    ] (  0,  0   )     ref  ->  zero-ref    class-hnd "Inline return value spill temp"
 ;  V11 tmp3         [V11,T08] (  5,  4   )     ref  ->  r15         class-hnd "Inline stloc first use temp"
 ;  V12 tmp4         [V12,T27] (  2,  2   )     int  ->   r8        
 ;* V13 tmp5         [V13    ] (  0,  0   )     int  ->  zero-ref    "Inline stloc first use temp"
 ;  V14 tmp6         [V14,T09] (  4,  4   )     int  ->  rdx         "Inlining Arg"
-;  V15 tmp7         [V15,T10] (  4,  4   )     int  ->  [rbp-40H]   "Inlining Arg"
+;  V15 tmp7         [V15,T10] (  4,  4   )     int  ->  rdx         "Inlining Arg"
 ;  V16 tmp8         [V16,T28] (  2,  1   )     int  ->   r8        
 ;* V17 tmp9         [V17    ] (  0,  0   )     int  ->  zero-ref    "Inline stloc first use temp"
 ;  V18 tmp10        [V18,T16] (  3,  3   )     ref  ->  rax         class-hnd single-def "Inlining Arg"
@@ -32,21 +32,21 @@
 ;  V21 tmp13        [V21,T30] (  2,  1   )     int  ->   r8        
 ;* V22 tmp14        [V22    ] (  0,  0   )     int  ->  zero-ref    "Inline stloc first use temp"
 ;  V23 tmp15        [V23,T11] (  4,  4   )     int  ->  rdx         "Inlining Arg"
-;  V24 tmp16        [V24,T12] (  4,  4   )     int  ->  [rbp-44H]   "Inlining Arg"
-;  V25 tmp17        [V25,T13] (  4,  4   )     int  ->  [rbp-48H]   "Inlining Arg"
+;  V24 tmp16        [V24,T12] (  4,  4   )     int  ->  rdx         "Inlining Arg"
+;  V25 tmp17        [V25,T13] (  4,  4   )     int  ->  rdx         "Inlining Arg"
 ;  V26 tmp18        [V26,T14] (  4,  4   )     int  ->  rdx         "Inlining Arg"
 ;  V27 tmp19        [V27,T15] (  2,  4   )     ref  ->  rsi         class-hnd single-def "Inlining Arg"
-;  V28 tmp20        [V28,T03] (  3,  6   )     ref  ->  [rbp-78H]   class-hnd exact spill-single-def "NewObj constructor temp"
+;  V28 tmp20        [V28,T03] (  3,  6   )     ref  ->  [rbp-70H]   class-hnd exact spill-single-def "NewObj constructor temp"
 ;  V29 tmp21        [V29,T22] (  2,  2   )     ref  ->  rcx         single-def "argument with side effect"
 ;  V30 tmp22        [V30,T23] (  2,  2   )     ref  ->  rcx         single-def "argument with side effect"
 ;  V31 tmp23        [V31,T24] (  2,  2   )     ref  ->  rcx         single-def "argument with side effect"
 ;  V32 tmp24        [V32,T25] (  2,  2   )     ref  ->  rdx         single-def "argument with side effect"
 ;  V33 tmp25        [V33,T26] (  2,  2   )     ref  ->  rdx         single-def "argument with side effect"
 ;  V34 cse0         [V34,T01] ( 13,  7.50)    long  ->  r13         "CSE - aggressive"
-;  V35 cse1         [V35,T02] ( 13,  7.50)    long  ->  [rbp-50H]   "CSE - aggressive"
+;  V35 cse1         [V35,T02] ( 13,  7.50)    long  ->  [rbp-48H]   "CSE - aggressive"
 ;  V36 cse2         [V36,T04] (  8,  5   )    long  ->  r14         "CSE - moderate"
 ;
-; Lcl frame size = 136
+; Lcl frame size = 120
 
 G_M47317_IG01:        ; bbWeight=1, gcrefRegs=0000 {}, byrefRegs=0000 {}, byref, nogc <-- Prolog IG
        push     rbp
@@ -57,15 +57,15 @@ G_M47317_IG01:        ; bbWeight=1, gcrefRegs=0000 {}, byrefRegs=0000 {}, byref,
        push     rdi
        push     rsi
        push     rbx
-       sub      rsp, 136
-       lea      rbp, [rsp+C0H]
+       sub      rsp, 120
+       lea      rbp, [rsp+B0H]
        mov      rsi, rcx
        ; gcrRegs +[rsi]
        mov      rdi, rdx
        ; gcrRegs +[rdi]
        mov      rbx, r8
        ; gcrRegs +[rbx]
-						;; size=36 bbWeight=1 PerfScore 9.50
+						;; size=33 bbWeight=1 PerfScore 9.50
 G_M47317_IG02:        ; bbWeight=1, gcrefRegs=00C8 {rbx rsi rdi}, byrefRegs=0000 {}, byref, isz
        mov      r14, qword ptr [(reloc)]      ; const ptr
        mov      r15, gword ptr [rsi+r14]
@@ -109,14 +109,14 @@ G_M47317_IG04:        ; bbWeight=1, gcrefRegs=80C8 {rbx rsi rdi r15}, byrefRegs=
        mov      rcx, qword ptr [(reloc)]      ; const ptr
        mov      rax, rcx
        ; gcrRegs -[rax]
-       mov      qword ptr [rbp-50H], rax
+       mov      qword ptr [rbp-48H], rax
        mov      rcx, gword ptr [rsi+rax]
        ; gcrRegs +[rcx]
        mov      edx, 1
        cmp      dword ptr [rcx], ecx
        call     [<unknown method>]
        ; gcrRegs -[rcx] +[rax]
-       mov      gword ptr [rbp-68H], rax
+       mov      gword ptr [rbp-60H], rax
        ; GC ptr vars +{V07}
        cmp      byte  ptr [rax], al
        mov      rcx, rax
@@ -128,7 +128,7 @@ G_M47317_IG04:        ; bbWeight=1, gcrefRegs=80C8 {rbx rsi rdi r15}, byrefRegs=
        jne      G_M47317_IG07
 						;; size=95 bbWeight=1 PerfScore 30.25
 G_M47317_IG05:        ; bbWeight=0.50, gcrefRegs=90C8 {rbx rsi rdi r12 r15}, byrefRegs=0000 {}, byref, isz
-       mov      rcx, gword ptr [rbp-68H]
+       mov      rcx, gword ptr [rbp-60H]
        ; gcrRegs +[rcx]
        lea      r11, [(reloc)]
        call     [r11]<unknown method>
@@ -147,19 +147,19 @@ G_M47317_IG05:        ; bbWeight=0.50, gcrefRegs=90C8 {rbx rsi rdi r12 r15}, byr
        mov      rcx, qword ptr [(reloc)]      ; const ptr
        mov      rcx, gword ptr [rsi+rcx]
        ; gcrRegs +[rcx]
-       mov      rdx, gword ptr [rbp-68H]
+       mov      rdx, gword ptr [rbp-60H]
        ; gcrRegs +[rdx]
        cmp      dword ptr [rcx], ecx
        ; GC ptr vars -{V07}
        call     [Microsoft.CodeAnalysis.VisualBasic.Syntax.InternalSyntax.ContextAwareSyntaxFactory:NumericLabel(Microsoft.CodeAnalysis.VisualBasic.Syntax.InternalSyntax.SyntaxToken):Microsoft.CodeAnalysis.VisualBasic.Syntax.InternalSyntax.LabelSyntax:this]
        ; gcrRegs -[rcx rdx] +[rax]
-       mov      gword ptr [rbp-60H], rax
+       mov      gword ptr [rbp-58H], rax
        ; GC ptr vars +{V05}
        xor      edx, edx
        mov      ecx, 1
        cmp      byte  ptr [rsi+r13], 0
        cmovne   edx, ecx
-       mov      r8, qword ptr [rbp-50H]
+       mov      r8, qword ptr [rbp-48H]
        mov      rcx, gword ptr [rsi+r8]
        ; gcrRegs +[rcx]
        cmp      dword ptr [rcx], ecx
@@ -168,19 +168,18 @@ G_M47317_IG05:        ; bbWeight=0.50, gcrefRegs=90C8 {rbx rsi rdi r12 r15}, byr
        xor      rcx, rcx
        ; gcrRegs +[rcx]
        mov      gword ptr [rsi+r14], rcx
-       mov      edx, 1
-       cmp      byte  ptr [rsi+r13], 0
-       cmovne   ecx, edx
+       xor      edx, edx
+       mov      ecx, 1
        ; gcrRegs -[rcx]
-       mov      dword ptr [rbp-40H], ecx
-       mov      r13, qword ptr [rbp-50H]
+       cmp      byte  ptr [rsi+r13], 0
+       cmovne   edx, ecx
+       mov      r13, qword ptr [rbp-48H]
        mov      rcx, gword ptr [rsi+r13]
        ; gcrRegs +[rcx]
-       mov      edx, dword ptr [rbp-40H]
        cmp      dword ptr [rcx], ecx
        call     [Microsoft.CodeAnalysis.VisualBasic.Syntax.InternalSyntax.Scanner:GetNextTokenInState(int):this]
        ; gcrRegs -[rcx]
-						;; size=146 bbWeight=0.50 PerfScore 27.38
+						;; size=142 bbWeight=0.50 PerfScore 26.50
 G_M47317_IG06:        ; bbWeight=0.50, gcrefRegs=90C8 {rbx rsi rdi r12 r15}, byrefRegs=0000 {}, byref
        xor      rcx, rcx
        ; gcrRegs +[rcx]
@@ -191,7 +190,7 @@ G_M47317_IG06:        ; bbWeight=0.50, gcrefRegs=90C8 {rbx rsi rdi r12 r15}, byr
 G_M47317_IG07:        ; bbWeight=0.50, gcVars=0000000000000020 {V07}, gcrefRegs=90C8 {rbx rsi rdi r12 r15}, byrefRegs=0000 {}, gcvars, byref
        ; gcrRegs -[rcx]
        ; GC ptr vars +{V07}
-       mov      rcx, gword ptr [rbp-68H]
+       mov      rcx, gword ptr [rbp-60H]
        ; gcrRegs +[rcx]
        call     [<unknown method>]
        ; gcrRegs -[rcx]
@@ -201,7 +200,7 @@ G_M47317_IG07:        ; bbWeight=0.50, gcVars=0000000000000020 {V07}, gcrefRegs=
        xor      r8d, r8d
        cmp      byte  ptr [rsi+r13], 0
        setne    r8b
-       mov      rax, qword ptr [rbp-50H]
+       mov      rax, qword ptr [rbp-48H]
        mov      rcx, gword ptr [rsi+rax]
        ; gcrRegs +[rcx]
        mov      edx, 2
@@ -219,7 +218,7 @@ G_M47317_IG07:        ; bbWeight=0.50, gcVars=0000000000000020 {V07}, gcrefRegs=
        xor      r8d, r8d
        cmp      byte  ptr [rsi+r13], 0
        setne    r8b
-       mov      rax, qword ptr [rbp-50H]
+       mov      rax, qword ptr [rbp-48H]
        mov      rcx, gword ptr [rsi+rax]
        ; gcrRegs +[rcx]
        mov      edx, 2
@@ -244,22 +243,22 @@ G_M47317_IG07:        ; bbWeight=0.50, gcVars=0000000000000020 {V07}, gcrefRegs=
        jne      G_M47317_IG09
        mov      r12d, 197
        ; gcrRegs -[r12]
-       mov      rcx, gword ptr [rbp-68H]
+       mov      rcx, gword ptr [rbp-60H]
        ; gcrRegs +[rcx]
        ; GC ptr vars -{V05 V07}
        call     [CORINFO_HELP_READYTORUN_CHKCAST]
        ; gcrRegs -[rcx] +[rax]
-       mov      gword ptr [rbp-58H], rax
+       mov      gword ptr [rbp-50H], rax
        ; GC ptr vars +{V04}
        mov      rcx, qword ptr [(reloc)]      ; const ptr
        mov      r9, gword ptr [rsi+rcx]
        ; gcrRegs +[r9]
-       mov      gword ptr [rbp-70H], r9
+       mov      gword ptr [rbp-68H], r9
        ; GC ptr vars +{V09}
        xor      r8d, r8d
        cmp      byte  ptr [rsi+r13], 0
        setne    r8b
-       mov      r10, qword ptr [rbp-50H]
+       mov      r10, qword ptr [rbp-48H]
        mov      rcx, gword ptr [rsi+r10]
        ; gcrRegs +[rcx]
 						;; size=217 bbWeight=0.50 PerfScore 36.62
@@ -270,19 +269,19 @@ G_M47317_IG08:        ; bbWeight=0.50, extend
        ; gcrRegs -[rcx r9]
        mov      rdx, rax
        ; gcrRegs +[rdx]
-       mov      rcx, gword ptr [rbp-70H]
+       mov      rcx, gword ptr [rbp-68H]
        ; gcrRegs +[rcx]
        cmp      dword ptr [rcx], ecx
        ; GC ptr vars -{V09}
        call     [Microsoft.CodeAnalysis.VisualBasic.Syntax.InternalSyntax.ContextAwareSyntaxFactory:NumericLabel(Microsoft.CodeAnalysis.VisualBasic.Syntax.InternalSyntax.SyntaxToken):Microsoft.CodeAnalysis.VisualBasic.Syntax.InternalSyntax.LabelSyntax:this]
        ; gcrRegs -[rcx rdx]
-       mov      gword ptr [rbp-60H], rax
+       mov      gword ptr [rbp-58H], rax
        ; GC ptr vars +{V05}
        xor      edx, edx
        mov      ecx, 1
        cmp      byte  ptr [rsi+r13], 0
        cmovne   edx, ecx
-       mov      r8, qword ptr [rbp-50H]
+       mov      r8, qword ptr [rbp-48H]
        mov      rcx, gword ptr [rsi+r8]
        ; gcrRegs +[rcx]
        cmp      dword ptr [rcx], ecx
@@ -291,45 +290,43 @@ G_M47317_IG08:        ; bbWeight=0.50, extend
        xor      rcx, rcx
        ; gcrRegs +[rcx]
        mov      gword ptr [rsi+r14], rcx
-       mov      edx, 1
-       cmp      byte  ptr [rsi+r13], 0
-       cmovne   ecx, edx
+       xor      edx, edx
+       mov      ecx, 1
        ; gcrRegs -[rcx]
-       mov      dword ptr [rbp-44H], ecx
-       mov      rax, qword ptr [rbp-50H]
+       cmp      byte  ptr [rsi+r13], 0
+       cmovne   edx, ecx
+       mov      rax, qword ptr [rbp-48H]
        mov      rcx, gword ptr [rsi+rax]
        ; gcrRegs +[rcx]
-       mov      edx, dword ptr [rbp-44H]
        cmp      dword ptr [rcx], ecx
        call     [Microsoft.CodeAnalysis.VisualBasic.Syntax.InternalSyntax.Scanner:GetNextTokenInState(int):this]
        ; gcrRegs -[rcx]
        xor      rcx, rcx
        ; gcrRegs +[rcx]
        mov      gword ptr [rsi+r14], rcx
-       mov      edx, 1
-       cmp      byte  ptr [rsi+r13], 0
-       cmovne   ecx, edx
+       xor      edx, edx
...
-6 (-1.69%) : 34796.dasm - Microsoft.CodeAnalysis.VisualBasic.Syntax.InternalSyntax.Parser:ParseGroupEndStatement():Microsoft.CodeAnalysis.VisualBasic.Syntax.InternalSyntax.StatementSyntax:this
@@ -21,7 +21,7 @@
 ;  V10 tmp4         [V10,T13] (  2,  2   )     int  ->   r8        
 ;* V11 tmp5         [V11    ] (  0,  0   )     int  ->  zero-ref    "Inline stloc first use temp"
 ;  V12 tmp6         [V12,T04] (  4,  4   )     int  ->  rdx         "Inlining Arg"
-;  V13 tmp7         [V13,T05] (  4,  4   )     int  ->  [rsp+24H]   "Inlining Arg"
+;  V13 tmp7         [V13,T05] (  4,  4   )     int  ->  rdx         "Inlining Arg"
 ;  V14 tmp8         [V14,T10] (  2,  2   )     ref  ->  rdx         single-def "argument with side effect"
 ;  V15 tmp9         [V15,T11] (  2,  2   )     ref  ->   r9         single-def "argument with side effect"
 ;  V16 tmp10        [V16,T12] (  2,  2   )     ref  ->  rsi         single-def "argument with side effect"
@@ -147,15 +147,14 @@ G_M42444_IG06:        ; bbWeight=0.50, gcrefRegs=8048 {rbx rsi r15}, byrefRegs=0
        xor      rcx, rcx
        ; gcrRegs +[rcx]
        mov      gword ptr [rsi+rdi], rcx
-       mov      edx, 1
-       cmp      byte  ptr [rsi+rbp], 0
-       cmovne   ecx, edx
+       xor      edx, edx
+       mov      ecx, 1
        ; gcrRegs -[rcx]
-       mov      dword ptr [rsp+24H], ecx
-       mov      rdx, qword ptr [(reloc)]      ; const ptr
-       mov      rcx, gword ptr [rsi+rdx]
+       cmp      byte  ptr [rsi+rbp], 0
+       cmovne   edx, ecx
+       mov      rcx, qword ptr [(reloc)]      ; const ptr
+       mov      rcx, gword ptr [rsi+rcx]
        ; gcrRegs +[rcx]
-       mov      edx, dword ptr [rsp+24H]
        cmp      dword ptr [rcx], ecx
        call     [Microsoft.CodeAnalysis.VisualBasic.Syntax.InternalSyntax.Scanner:GetNextTokenInState(int):this]
        ; gcrRegs -[rcx]
@@ -182,7 +181,7 @@ G_M42444_IG06:        ; bbWeight=0.50, gcrefRegs=8048 {rbx rsi r15}, byrefRegs=0
        call     [Microsoft.CodeAnalysis.VisualBasic.Syntax.InternalSyntax.ContextAwareSyntaxFactory:EndBlockStatement(ushort,Microsoft.CodeAnalysis.VisualBasic.Syntax.InternalSyntax.KeywordSyntax,Microsoft.CodeAnalysis.VisualBasic.Syntax.InternalSyntax.KeywordSyntax):Microsoft.CodeAnalysis.VisualBasic.Syntax.InternalSyntax.EndBlockStatementSyntax:this]
        ; gcrRegs -[rcx rbx rsi r8-r9]
        ; gcr arg pop 0
-						;; size=124 bbWeight=0.50 PerfScore 23.00
+						;; size=118 bbWeight=0.50 PerfScore 22.12
 G_M42444_IG07:        ; bbWeight=1, gcrefRegs=0001 {rax}, byrefRegs=0000 {}, byref
        nop      
 						;; size=1 bbWeight=1 PerfScore 0.25
@@ -197,7 +196,7 @@ G_M42444_IG08:        ; bbWeight=1, epilog, nogc, extend
        ret      
 						;; size=13 bbWeight=1 PerfScore 4.25
 
-; Total bytes of code 355, prolog size 12, PerfScore 124.13, instruction count 96, allocated bytes for code 355 (MethodHash=1a4a5a33) for method Microsoft.CodeAnalysis.VisualBasic.Syntax.InternalSyntax.Parser:ParseGroupEndStatement():Microsoft.CodeAnalysis.VisualBasic.Syntax.InternalSyntax.StatementSyntax:this
+; Total bytes of code 349, prolog size 12, PerfScore 122.65, instruction count 95, allocated bytes for code 349 (MethodHash=1a4a5a33) for method Microsoft.CodeAnalysis.VisualBasic.Syntax.InternalSyntax.Parser:ParseGroupEndStatement():Microsoft.CodeAnalysis.VisualBasic.Syntax.InternalSyntax.StatementSyntax:this
 ; ============================================================
 
 Unwind Info:
-10 (-1.11%) : 34832.dasm - Microsoft.CodeAnalysis.VisualBasic.Syntax.InternalSyntax.Parser:ParseDelegateStatement(Microsoft.CodeAnalysis.VisualBasic.Syntax.InternalSyntax.SyntaxList`1[Microsoft.CodeAnalysis.VisualBasic.Syntax.InternalSyntax.AttributeListSyntax],Microsoft.CodeAnalysis.VisualBasic.Syntax.InternalSyntax.SyntaxList`1[Microsoft.CodeAnalysis.VisualBasic.Syntax.InternalSyntax.KeywordSyntax]):Microsoft.CodeAnalysis.VisualBasic.Syntax.InternalSyntax.DelegateStatementSyntax:this
@@ -13,7 +13,7 @@
 ;* V02 arg2         [V02    ] (  0,  0   )  struct ( 8) zero-ref    single-def
 ;  V03 loc0         [V03,T19] (  2,  2   )     ref  ->  r15         class-hnd single-def
 ;  V04 loc1         [V04,T17] (  4,  2.50)  ushort  ->  [rbp-3CH]  
-;  V05 loc2         [V05,T16] (  4,  2.50)     ref  ->  [rbp-80H]   class-hnd
+;  V05 loc2         [V05,T16] (  4,  2.50)     ref  ->  [rbp-78H]   class-hnd
 ;  V06 loc3         [V06    ] (  4,  3   )     ref  ->  [rbp-48H]   do-not-enreg[X] must-init addr-exposed ld-addr-op class-hnd
 ;  V07 loc4         [V07    ] (  4,  3   )     ref  ->  [rbp-50H]   do-not-enreg[X] must-init addr-exposed ld-addr-op class-hnd
 ;  V08 loc5         [V08    ] (  4,  3   )     ref  ->  [rbp-58H]   do-not-enreg[X] must-init addr-exposed ld-addr-op class-hnd
@@ -28,14 +28,14 @@
 ;* V17 tmp3         [V17    ] (  0,  0   )  struct ( 8) zero-ref    "struct address for call/obj"
 ;* V18 tmp4         [V18    ] (  0,  0   )     ref  ->  zero-ref    class-hnd "Inline return value spill temp"
 ;  V19 tmp5         [V19,T08] (  5,  4   )     ref  ->  r15         class-hnd "Inline stloc first use temp"
-;  V20 tmp6         [V20,T02] (  4,  8   )     int  ->  [rbp-74H]   "Inlining Arg"
+;  V20 tmp6         [V20,T02] (  4,  8   )     int  ->  rdx         "Inlining Arg"
 ;* V21 tmp7         [V21    ] (  0,  0   )     ref  ->  zero-ref    class-hnd single-def "Inline return value spill temp"
-;  V22 tmp8         [V22,T06] (  6,  5   )     ref  ->  [rbp-88H]   class-hnd "Inline stloc first use temp"
+;  V22 tmp8         [V22,T06] (  6,  5   )     ref  ->  [rbp-80H]   class-hnd "Inline stloc first use temp"
 ;* V23 tmp9         [V23    ] (  0,  0   )     ref  ->  zero-ref    class-hnd "Inline return value spill temp"
-;  V24 tmp10        [V24,T14] (  5,  2.50)     ref  ->  [rbp-90H]   class-hnd "Inline stloc first use temp"
+;  V24 tmp10        [V24,T14] (  5,  2.50)     ref  ->  [rbp-88H]   class-hnd "Inline stloc first use temp"
 ;  V25 tmp11        [V25,T09] (  4,  4   )     int  ->  rdx         "Inlining Arg"
 ;* V26 tmp12        [V26    ] (  0,  0   )     ref  ->  zero-ref    class-hnd "Inline return value spill temp"
-;  V27 tmp13        [V27,T15] (  5,  2.50)     ref  ->  [rbp-98H]   class-hnd "Inline stloc first use temp"
+;  V27 tmp13        [V27,T15] (  5,  2.50)     ref  ->  [rbp-90H]   class-hnd "Inline stloc first use temp"
 ;  V28 tmp14        [V28,T10] (  4,  4   )     int  ->  rdx         "Inlining Arg"
 ;  V29 tmp15        [V29,T03] (  6,  6   )     ref  ->  r12         class-hnd exact single-def "NewObj constructor temp"
 ;* V30 tmp16        [V30    ] (  0,  0   )  struct ( 8) zero-ref    ld-addr-op "NewObj constructor temp"
@@ -52,7 +52,7 @@
 ;  V41 cse1         [V41,T04] (  9,  5.50)    long  ->  r13         "CSE - aggressive"
 ;  V42 cse2         [V42,T05] (  9,  5.50)    long  ->  r12         "CSE - aggressive"
 ;
-; Lcl frame size = 184
+; Lcl frame size = 168
 
 G_M41847_IG01:        ; bbWeight=1, gcrefRegs=0000 {}, byrefRegs=0000 {}, byref, nogc <-- Prolog IG
        push     rbp
@@ -63,8 +63,8 @@ G_M41847_IG01:        ; bbWeight=1, gcrefRegs=0000 {}, byrefRegs=0000 {}, byref,
        push     rdi
        push     rsi
        push     rbx
-       sub      rsp, 184
-       lea      rbp, [rsp+F0H]
+       sub      rsp, 168
+       lea      rbp, [rsp+E0H]
        xorps    xmm4, xmm4
        movaps   xmmword ptr [rbp-70H], xmm4
        movaps   xmmword ptr [rbp-60H], xmm4
@@ -118,16 +118,15 @@ G_M41847_IG04:        ; bbWeight=1, gcrefRegs=80C8 {rbx rsi rdi r15}, byrefRegs=
        mov      gword ptr [rbp-60H], rcx
        mov      gword ptr [rbp-68H], rcx
        mov      gword ptr [rbp-70H], rcx
+       xor      edx, edx
        mov      r13, qword ptr [(reloc)]      ; const ptr
-       mov      edx, 1
-       cmp      byte  ptr [rsi+r13], 0
-       cmovne   ecx, edx
+       mov      ecx, 1
        ; gcrRegs -[rcx]
-       mov      dword ptr [rbp-74H], ecx
+       cmp      byte  ptr [rsi+r13], 0
+       cmovne   edx, ecx
        mov      r12, qword ptr [(reloc)]      ; const ptr
        mov      rcx, gword ptr [rsi+r12]
        ; gcrRegs +[rcx]
-       mov      edx, dword ptr [rbp-74H]
        cmp      dword ptr [rcx], ecx
        call     [Microsoft.CodeAnalysis.VisualBasic.Syntax.InternalSyntax.Scanner:GetNextTokenInState(int):this]
        ; gcrRegs -[rax rcx]
@@ -138,7 +137,7 @@ G_M41847_IG04:        ; bbWeight=1, gcrefRegs=80C8 {rbx rsi rdi r15}, byrefRegs=
        ; gcrRegs +[rax]
        test     rax, rax
        jne      SHORT G_M41847_IG06
-						;; size=98 bbWeight=1 PerfScore 31.75
+						;; size=94 bbWeight=1 PerfScore 30.00
 G_M41847_IG05:        ; bbWeight=0.50, gcrefRegs=80C8 {rbx rsi rdi r15}, byrefRegs=0000 {}, byref
        ; gcrRegs -[rax rcx]
        mov      rcx, gword ptr [rsi+r12]
@@ -149,16 +148,16 @@ G_M41847_IG05:        ; bbWeight=0.50, gcrefRegs=80C8 {rbx rsi rdi r15}, byrefRe
        mov      byte  ptr [rsi+r13], 0
        lea      rcx, bword ptr [rsi+r14]
        ; byrRegs +[rcx]
-       mov      gword ptr [rbp-88H], rax
+       mov      gword ptr [rbp-80H], rax
        ; GC ptr vars +{V22}
        mov      rdx, rax
        ; gcrRegs +[rdx]
        call     [CORINFO_HELP_ASSIGN_REF]
        ; gcrRegs -[rax rdx]
        ; byrRegs -[rcx]
-       mov      rax, gword ptr [rbp-88H]
+       mov      rax, gword ptr [rbp-80H]
        ; gcrRegs +[rax]
-						;; size=44 bbWeight=0.50 PerfScore 7.38
+						;; size=38 bbWeight=0.50 PerfScore 7.38
 G_M41847_IG06:        ; bbWeight=1, gcVars=0000000000000000 {}, gcrefRegs=80C9 {rax rbx rsi rdi r15}, byrefRegs=0000 {}, gcvars, byref
        ; GC ptr vars -{V22}
        cmp      byte  ptr [rax], al
@@ -186,14 +185,14 @@ G_M41847_IG07:        ; bbWeight=0.50, gcrefRegs=80C8 {rbx rsi rdi r15}, byrefRe
        mov      byte  ptr [rsi+r13], 0
        lea      rcx, bword ptr [rsi+r14]
        ; byrRegs +[rcx]
-       mov      gword ptr [rbp-90H], rax
+       mov      gword ptr [rbp-88H], rax
        ; GC ptr vars +{V24}
        mov      rdx, rax
        ; gcrRegs +[rdx]
        call     [CORINFO_HELP_ASSIGN_REF]
        ; gcrRegs -[rax rdx]
        ; byrRegs -[rcx]
-       mov      rdx, gword ptr [rbp-90H]
+       mov      rdx, gword ptr [rbp-88H]
        ; gcrRegs +[rdx]
 						;; size=72 bbWeight=0.50 PerfScore 10.12
 G_M41847_IG08:        ; bbWeight=0.50, gcVars=0000000000000000 {}, gcrefRegs=80CC {rdx rbx rsi rdi r15}, byrefRegs=0000 {}, gcvars, byref
@@ -202,7 +201,7 @@ G_M41847_IG08:        ; bbWeight=0.50, gcVars=0000000000000000 {}, gcrefRegs=80C
        ; gcrRegs +[rcx]
        call     [CORINFO_HELP_READYTORUN_CHKCAST]
        ; gcrRegs -[rcx rdx] +[rax]
-       mov      gword ptr [rbp-80H], rax
+       mov      gword ptr [rbp-78H], rax
        ; GC ptr vars +{V05}
        xor      edx, edx
        mov      ecx, 1
@@ -250,14 +249,14 @@ G_M41847_IG10:        ; bbWeight=0.50, gcVars=0000000000000000 {}, gcrefRegs=80C
        mov      byte  ptr [rsi+r13], 0
        lea      rcx, bword ptr [rsi+r14]
        ; byrRegs +[rcx]
-       mov      gword ptr [rbp-98H], rax
+       mov      gword ptr [rbp-90H], rax
        ; GC ptr vars +{V27}
        mov      rdx, rax
        ; gcrRegs +[rdx]
        call     [CORINFO_HELP_ASSIGN_REF]
        ; gcrRegs -[rax rdx]
        ; byrRegs -[rcx]
-       mov      rdx, gword ptr [rbp-98H]
+       mov      rdx, gword ptr [rbp-90H]
        ; gcrRegs +[rdx]
 						;; size=60 bbWeight=0.50 PerfScore 9.50
 G_M41847_IG11:        ; bbWeight=0.50, gcVars=0000000000000000 {}, gcrefRegs=80CC {rdx rbx rsi rdi r15}, byrefRegs=0000 {}, gcvars, byref, isz
@@ -266,7 +265,7 @@ G_M41847_IG11:        ; bbWeight=0.50, gcVars=0000000000000000 {}, gcrefRegs=80C
        ; gcrRegs +[rcx]
        call     [CORINFO_HELP_READYTORUN_CHKCAST]
        ; gcrRegs -[rcx rdx] +[rax]
-       mov      gword ptr [rbp-80H], rax
+       mov      gword ptr [rbp-78H], rax
        ; GC ptr vars +{V05}
        xor      edx, edx
        mov      ecx, 1
@@ -338,7 +337,7 @@ G_M41847_IG12:        ; bbWeight=0.50, gcVars=0000000000000000 {}, gcrefRegs=80C
        ; gcrRegs -[rdx r12] +[rax]
        mov      r12, rax
        ; gcrRegs +[r12]
-       mov      gword ptr [rbp-80H], r12
+       mov      gword ptr [rbp-78H], r12
        ; GC ptr vars +{V05}
        mov      dword ptr [rbp-3CH], r14d
        jmp      G_M41847_IG09
@@ -353,7 +352,7 @@ G_M41847_IG13:        ; bbWeight=1, gcVars=0000000000010000 {V05}, gcrefRegs=80C
        mov      r9, rbx
        ; gcrRegs +[r9]
        mov      gword ptr [rsp+20H], r15
-       mov      r12, gword ptr [rbp-80H]
+       mov      r12, gword ptr [rbp-78H]
        ; gcrRegs +[r12]
        mov      gword ptr [rsp+28H], r12
        mov      rdx, gword ptr [rbp-48H]
@@ -400,7 +399,7 @@ G_M41847_IG17:        ; bbWeight=1, gcrefRegs=0001 {rax}, byrefRegs=0000 {}, byr
        nop      
 						;; size=1 bbWeight=1 PerfScore 0.25
 G_M41847_IG18:        ; bbWeight=1, epilog, nogc, extend
-       add      rsp, 184
+       add      rsp, 168
        pop      rbx
        pop      rsi
        pop      rdi
@@ -412,7 +411,7 @@ G_M41847_IG18:        ; bbWeight=1, epilog, nogc, extend
        ret      
 						;; size=20 bbWeight=1 PerfScore 5.25
 
-; Total bytes of code 903, prolog size 42, PerfScore 272.51, instruction count 217, allocated bytes for code 903 (MethodHash=45785c88) for method Microsoft.CodeAnalysis.VisualBasic.Syntax.InternalSyntax.Parser:ParseDelegateStatement(Microsoft.CodeAnalysis.VisualBasic.Syntax.InternalSyntax.SyntaxList`1[Microsoft.CodeAnalysis.VisualBasic.Syntax.InternalSyntax.AttributeListSyntax],Microsoft.CodeAnalysis.VisualBasic.Syntax.InternalSyntax.SyntaxList`1[Microsoft.CodeAnalysis.VisualBasic.Syntax.InternalSyntax.KeywordSyntax]):Microsoft.CodeAnalysis.VisualBasic.Syntax.InternalSyntax.DelegateStatementSyntax:this
+; Total bytes of code 893, prolog size 42, PerfScore 269.76, instruction count 216, allocated bytes for code 893 (MethodHash=45785c88) for method Microsoft.CodeAnalysis.VisualBasic.Syntax.InternalSyntax.Parser:ParseDelegateStatement(Microsoft.CodeAnalysis.VisualBasic.Syntax.InternalSyntax.SyntaxList`1[Microsoft.CodeAnalysis.VisualBasic.Syntax.InternalSyntax.AttributeListSyntax],Microsoft.CodeAnalysis.VisualBasic.Syntax.InternalSyntax.SyntaxList`1[Microsoft.CodeAnalysis.VisualBasic.Syntax.InternalSyntax.KeywordSyntax]):Microsoft.CodeAnalysis.VisualBasic.Syntax.InternalSyntax.DelegateStatementSyntax:this
 ; ============================================================
 
 Unwind Info:
@@ -426,7 +425,7 @@ Unwind Info:
   FrameOffset       : N/A (no FrameRegister) (Value=0)
   UnwindCodes       :
     CodeOffset: 0x13 UnwindOp: UWOP_ALLOC_LARGE (1)     OpInfo: 0 - Scaled small  
-      Size: 23 * 8 = 184 = 0x000B8
+      Size: 21 * 8 = 168 = 0x000A8
     CodeOffset: 0x0C UnwindOp: UWOP_PUSH_NONVOL (0)     OpInfo: rbx (3)
     CodeOffset: 0x0B UnwindOp: UWOP_PUSH_NONVOL (0)     OpInfo: rsi (6)
     CodeOffset: 0x0A UnwindOp: UWOP_PUSH_NONVOL (0)     OpInfo: rdi (7)
+2 (+33.33%) : 17536.dasm - System.Single:System.Numerics.INumberBase.TryConvertToChecked[System.__Canon](float,byref):bool
@@ -34,12 +34,14 @@ G_M60697_IG02:        ; bbWeight=1, gcrefRegs=0000 {}, byrefRegs=0100 {r8}, byre
        xor      rax, rax
        ; gcrRegs +[rax]
        mov      gword ptr [r8], rax
-						;; size=5 bbWeight=1 PerfScore 1.25
+       xor      eax, eax
+       ; gcrRegs -[rax]
+						;; size=7 bbWeight=1 PerfScore 1.50
 G_M60697_IG03:        ; bbWeight=1, epilog, nogc, extend
        ret      
 						;; size=1 bbWeight=1 PerfScore 1.00
 
-; Total bytes of code 6, prolog size 0, PerfScore 2.85, instruction count 3, allocated bytes for code 6 (MethodHash=2fcd12e6) for method System.Single:System.Numerics.INumberBase<System.Single>.TryConvertToChecked[System.__Canon](float,byref):bool
+; Total bytes of code 8, prolog size 0, PerfScore 3.30, instruction count 4, allocated bytes for code 8 (MethodHash=2fcd12e6) for method System.Single:System.Numerics.INumberBase<System.Single>.TryConvertToChecked[System.__Canon](float,byref):bool
 ; ============================================================
 
 Unwind Info:
+2 (+33.33%) : 17568.dasm - System.UIntPtr:System.Numerics.INumberBase.TryConvertToTruncating[System.__Canon](ulong,byref):bool
@@ -33,12 +33,14 @@ G_M43625_IG02:        ; bbWeight=1, gcrefRegs=0000 {}, byrefRegs=0100 {r8}, byre
        xor      rax, rax
        ; gcrRegs +[rax]
        mov      gword ptr [r8], rax
-						;; size=5 bbWeight=1 PerfScore 1.25
+       xor      eax, eax
+       ; gcrRegs -[rax]
+						;; size=7 bbWeight=1 PerfScore 1.50
 G_M43625_IG03:        ; bbWeight=1, epilog, nogc, extend
        ret      
 						;; size=1 bbWeight=1 PerfScore 1.00
 
-; Total bytes of code 6, prolog size 0, PerfScore 2.85, instruction count 3, allocated bytes for code 6 (MethodHash=63c95596) for method System.UIntPtr:System.Numerics.INumberBase<nuint>.TryConvertToTruncating[System.__Canon](ulong,byref):bool
+; Total bytes of code 8, prolog size 0, PerfScore 3.30, instruction count 4, allocated bytes for code 8 (MethodHash=63c95596) for method System.UIntPtr:System.Numerics.INumberBase<nuint>.TryConvertToTruncating[System.__Canon](ulong,byref):bool
 ; ============================================================
 
 Unwind Info:
+2 (+33.33%) : 210240.dasm - System.Threading.Channels.ChannelReader`1[System.__Canon]:TryPeek(byref):bool:this
@@ -20,12 +20,14 @@ G_M41029_IG02:        ; bbWeight=1, gcrefRegs=0000 {}, byrefRegs=0004 {rdx}, byr
        xor      rax, rax
        ; gcrRegs +[rax]
        mov      gword ptr [rdx], rax
-						;; size=5 bbWeight=1 PerfScore 1.25
+       xor      eax, eax
+       ; gcrRegs -[rax]
+						;; size=7 bbWeight=1 PerfScore 1.50
 G_M41029_IG03:        ; bbWeight=1, epilog, nogc, extend
        ret      
 						;; size=1 bbWeight=1 PerfScore 1.00
 
-; Total bytes of code 6, prolog size 0, PerfScore 2.85, instruction count 3, allocated bytes for code 6 (MethodHash=e8135fba) for method System.Threading.Channels.ChannelReader`1[System.__Canon]:TryPeek(byref):bool:this
+; Total bytes of code 8, prolog size 0, PerfScore 3.30, instruction count 4, allocated bytes for code 8 (MethodHash=e8135fba) for method System.Threading.Channels.ChannelReader`1[System.__Canon]:TryPeek(byref):bool:this
 ; ============================================================
 
 Unwind Info:
libraries.pmi.windows.x64.checked.mch
-18 (-2.02%) : 69373.dasm - Microsoft.CodeAnalysis.VisualBasic.Syntax.InternalSyntax.Parser:ParseOnErrorGoto(Microsoft.CodeAnalysis.VisualBasic.Syntax.InternalSyntax.KeywordSyntax,Microsoft.CodeAnalysis.VisualBasic.Syntax.InternalSyntax.KeywordSyntax):Microsoft.CodeAnalysis.VisualBasic.Syntax.InternalSyntax.OnErrorGoToStatementSyntax:this
@@ -27,7 +27,7 @@
 ;  V17 tmp9         [V17,T31] (  2,  2   )     int  ->   r8        
 ;* V18 tmp10        [V18    ] (  0,  0   )     int  ->  zero-ref    "Inline stloc first use temp"
 ;  V19 tmp11        [V19,T10] (  4,  4   )     int  ->  rdx         "Inlining Arg"
-;  V20 tmp12        [V20,T11] (  4,  4   )     int  ->  [rsp+34H]   "Inlining Arg"
+;  V20 tmp12        [V20,T11] (  4,  4   )     int  ->  rdx         "Inlining Arg"
 ;  V21 tmp13        [V21,T33] (  2,  1   )     int  ->   r8        
 ;* V22 tmp14        [V22    ] (  0,  0   )     int  ->  zero-ref    "Inline stloc first use temp"
 ;  V23 tmp15        [V23,T26] (  2,  2   )     ref  ->  rax         class-hnd single-def "Inlining Arg"
@@ -36,8 +36,8 @@
 ;  V26 tmp18        [V26,T35] (  2,  1   )     int  ->   r8        
 ;* V27 tmp19        [V27    ] (  0,  0   )     int  ->  zero-ref    "Inline stloc first use temp"
 ;  V28 tmp20        [V28,T12] (  4,  4   )     int  ->  rdx         "Inlining Arg"
-;  V29 tmp21        [V29,T13] (  4,  4   )     int  ->  [rsp+30H]   "Inlining Arg"
-;  V30 tmp22        [V30,T14] (  4,  4   )     int  ->  [rsp+2CH]   "Inlining Arg"
+;  V29 tmp21        [V29,T13] (  4,  4   )     int  ->  rdx         "Inlining Arg"
+;  V30 tmp22        [V30,T14] (  4,  4   )     int  ->  rdx         "Inlining Arg"
 ;  V31 tmp23        [V31,T15] (  4,  4   )     int  ->  rdx         "Inlining Arg"
 ;  V32 tmp24        [V32,T16] (  2,  4   )     ref  ->  rsi         class-hnd single-def "Inlining Arg"
 ;  V33 tmp25        [V33,T00] ( 27, 50   )     ref  ->  r15         class-hnd exact single-def "NewObj constructor temp"
@@ -51,7 +51,7 @@
 ;  V41 cse1         [V41,T21] (  3,  3   )     int  ->  rsi         "CSE - moderate"
 ;  V42 cse2         [V42,T23] (  3,  2.50)     int  ->  rsi         "CSE - moderate"
 ;
-; Lcl frame size = 56
+; Lcl frame size = 40
 
 G_M47317_IG01:        ; bbWeight=1, gcrefRegs=0000 {}, byrefRegs=0000 {}, byref, nogc <-- Prolog IG
        push     r15
@@ -62,7 +62,7 @@ G_M47317_IG01:        ; bbWeight=1, gcrefRegs=0000 {}, byrefRegs=0000 {}, byref,
        push     rsi
        push     rbp
        push     rbx
-       sub      rsp, 56
+       sub      rsp, 40
        mov      rsi, rcx
        ; gcrRegs +[rsi]
        mov      rdi, rdx
@@ -168,19 +168,18 @@ G_M47317_IG07:        ; bbWeight=0.50, gcrefRegs=C0E8 {rbx rbp rsi rdi r14 r15},
        xor      rcx, rcx
        ; gcrRegs +[rcx]
        mov      gword ptr [rsi+28H], rcx
-       mov      edx, 1
-       cmp      byte  ptr [rsi+38H], 0
-       cmovne   ecx, edx
+       xor      edx, edx
+       mov      ecx, 1
        ; gcrRegs -[rcx]
-       mov      dword ptr [rsp+34H], ecx
+       cmp      byte  ptr [rsi+38H], 0
+       cmovne   edx, ecx
        mov      rcx, gword ptr [rsi+08H]
        ; gcrRegs +[rcx]
-       mov      edx, dword ptr [rsp+34H]
        cmp      dword ptr [rcx], ecx
        call     [Microsoft.CodeAnalysis.VisualBasic.Syntax.InternalSyntax.Scanner:GetNextTokenInState(int):this]
        ; gcrRegs -[rcx]
        ; gcr arg pop 0
-						;; size=126 bbWeight=0.50 PerfScore 23.75
+						;; size=120 bbWeight=0.50 PerfScore 22.88
 G_M47317_IG08:        ; bbWeight=0.50, gcrefRegs=60E8 {rbx rbp rsi rdi r13 r14}, byrefRegs=0000 {}, byref
        xor      rcx, rcx
        ; gcrRegs +[rcx]
@@ -284,14 +283,13 @@ G_M47317_IG11:        ; bbWeight=0.50, gcrefRegs=40E8 {rbx rbp rsi rdi r14}, byr
        xor      rcx, rcx
        ; gcrRegs +[rcx]
        mov      gword ptr [rsi+28H], rcx
-       mov      edx, 1
-       cmp      byte  ptr [rsi+38H], 0
-       cmovne   ecx, edx
+       xor      edx, edx
+       mov      ecx, 1
        ; gcrRegs -[rcx]
-       mov      dword ptr [rsp+30H], ecx
+       cmp      byte  ptr [rsi+38H], 0
+       cmovne   edx, ecx
        mov      rcx, gword ptr [rsi+08H]
        ; gcrRegs +[rcx]
-       mov      edx, dword ptr [rsp+30H]
        cmp      dword ptr [rcx], ecx
        call     [Microsoft.CodeAnalysis.VisualBasic.Syntax.InternalSyntax.Scanner:GetNextTokenInState(int):this]
        ; gcrRegs -[rcx]
@@ -299,20 +297,19 @@ G_M47317_IG11:        ; bbWeight=0.50, gcrefRegs=40E8 {rbx rbp rsi rdi r14}, byr
        xor      rcx, rcx
        ; gcrRegs +[rcx]
        mov      gword ptr [rsi+28H], rcx
-       mov      edx, 1
-       cmp      byte  ptr [rsi+38H], 0
-       cmovne   ecx, edx
+       xor      edx, edx
+       mov      ecx, 1
        ; gcrRegs -[rcx]
-       mov      dword ptr [rsp+2CH], ecx
+       cmp      byte  ptr [rsi+38H], 0
+       cmovne   edx, ecx
        mov      rcx, gword ptr [rsi+08H]
        ; gcrRegs +[rcx]
-       mov      edx, dword ptr [rsp+2CH]
        cmp      dword ptr [rcx], ecx
        call     [Microsoft.CodeAnalysis.VisualBasic.Syntax.InternalSyntax.Scanner:GetNextTokenInState(int):this]
        ; gcrRegs -[rcx]
        ; gcr arg pop 0
        jmp      G_M47317_IG08
-						;; size=156 bbWeight=0.50 PerfScore 32.25
+						;; size=144 bbWeight=0.50 PerfScore 30.50
 G_M47317_IG12:        ; bbWeight=0.50, gcrefRegs=40E8 {rbx rbp rsi rdi r14}, byrefRegs=0000 {}, byref
        ; gcrRegs -[r13]
        xor      edx, edx
@@ -432,7 +429,7 @@ G_M47317_IG15:        ; bbWeight=1, gcrefRegs=A000 {r13 r15}, byrefRegs=0000 {},
        ; gcrRegs +[rax]
 						;; size=35 bbWeight=1 PerfScore 12.25
 G_M47317_IG16:        ; bbWeight=1, epilog, nogc, extend
-       add      rsp, 56
+       add      rsp, 40
        pop      rbx
        pop      rbp
        pop      rsi
@@ -453,7 +450,7 @@ G_M47317_IG17:        ; bbWeight=0, gcVars=0000000000000000 {}, gcrefRegs=0020 {
        int3     
 						;; size=10 bbWeight=0 PerfScore 0.00
 
-; Total bytes of code 891, prolog size 16, PerfScore 289.60, instruction count 235, allocated bytes for code 891 (MethodHash=2580472a) for method Microsoft.CodeAnalysis.VisualBasic.Syntax.InternalSyntax.Parser:ParseOnErrorGoto(Microsoft.CodeAnalysis.VisualBasic.Syntax.InternalSyntax.KeywordSyntax,Microsoft.CodeAnalysis.VisualBasic.Syntax.InternalSyntax.KeywordSyntax):Microsoft.CodeAnalysis.VisualBasic.Syntax.InternalSyntax.OnErrorGoToStatementSyntax:this
+; Total bytes of code 873, prolog size 16, PerfScore 285.18, instruction count 232, allocated bytes for code 873 (MethodHash=2580472a) for method Microsoft.CodeAnalysis.VisualBasic.Syntax.InternalSyntax.Parser:ParseOnErrorGoto(Microsoft.CodeAnalysis.VisualBasic.Syntax.InternalSyntax.KeywordSyntax,Microsoft.CodeAnalysis.VisualBasic.Syntax.InternalSyntax.KeywordSyntax):Microsoft.CodeAnalysis.VisualBasic.Syntax.InternalSyntax.OnErrorGoToStatementSyntax:this
 ; ============================================================
 
 Unwind Info:
@@ -466,7 +463,7 @@ Unwind Info:
   FrameRegister     : none (0)
   FrameOffset       : N/A (no FrameRegister) (Value=0)
   UnwindCodes       :
-    CodeOffset: 0x10 UnwindOp: UWOP_ALLOC_SMALL (2)     OpInfo: 6 * 8 + 8 = 56 = 0x38
+    CodeOffset: 0x10 UnwindOp: UWOP_ALLOC_SMALL (2)     OpInfo: 4 * 8 + 8 = 40 = 0x28
     CodeOffset: 0x0C UnwindOp: UWOP_PUSH_NONVOL (0)     OpInfo: rbx (3)
     CodeOffset: 0x0B UnwindOp: UWOP_PUSH_NONVOL (0)     OpInfo: rbp (5)
     CodeOffset: 0x0A UnwindOp: UWOP_PUSH_NONVOL (0)     OpInfo: rsi (6)
-6 (-1.32%) : 69229.dasm - Microsoft.CodeAnalysis.VisualBasic.Syntax.InternalSyntax.Parser:ParseGroupEndStatement():Microsoft.CodeAnalysis.VisualBasic.Syntax.InternalSyntax.StatementSyntax:this
@@ -32,7 +32,7 @@
 ;  V22 tmp16        [V22,T01] (  7,  7   )     ref  ->  rbp         class-hnd exact single-def "NewObj constructor temp"
 ;  V23 tmp17        [V23,T09] (  3,  3   )     ref  ->  rdi         class-hnd single-def "Inlining Arg"
 ;  V24 tmp18        [V24,T05] (  4,  4   )     int  ->  rdx         "Inlining Arg"
-;  V25 tmp19        [V25,T06] (  4,  4   )     int  ->  [rsp+24H]   "Inlining Arg"
+;  V25 tmp19        [V25,T06] (  4,  4   )     int  ->  rdx         "Inlining Arg"
 ;
 ; Lcl frame size = 40
 
@@ -193,14 +193,13 @@ G_M42444_IG10:        ; bbWeight=0.50, gcrefRegs=0068 {rbx rbp rsi}, byrefRegs=0
        xor      rcx, rcx
        ; gcrRegs +[rcx]
        mov      gword ptr [rsi+28H], rcx
-       mov      edx, 1
-       cmp      byte  ptr [rsi+38H], 0
-       cmovne   ecx, edx
+       xor      edx, edx
+       mov      ecx, 1
        ; gcrRegs -[rcx]
-       mov      dword ptr [rsp+24H], ecx
+       cmp      byte  ptr [rsi+38H], 0
+       cmovne   edx, ecx
        mov      rcx, gword ptr [rsi+08H]
        ; gcrRegs +[rcx]
-       mov      edx, dword ptr [rsp+24H]
        cmp      dword ptr [rcx], ecx
        call     [Microsoft.CodeAnalysis.VisualBasic.Syntax.InternalSyntax.Scanner:GetNextTokenInState(int):this]
        ; gcrRegs -[rcx]
@@ -213,7 +212,7 @@ G_M42444_IG10:        ; bbWeight=0.50, gcrefRegs=0068 {rbx rbp rsi}, byrefRegs=0
        ; gcrRegs +[r9]
        test     r9, r9
        je       SHORT G_M42444_IG12
-						;; size=82 bbWeight=0.50 PerfScore 15.62
+						;; size=76 bbWeight=0.50 PerfScore 14.75
 G_M42444_IG11:        ; bbWeight=0.25, gcrefRegs=022A {rcx rbx rbp r9}, byrefRegs=0000 {}, byref, isz
        ; gcrRegs -[rsi]
        mov      rax, 0xD1FFAB1E      ; Microsoft.CodeAnalysis.VisualBasic.Syntax.InternalSyntax.KeywordSyntax
@@ -269,7 +268,7 @@ G_M42444_IG17:        ; bbWeight=0, gcrefRegs=0020 {rbp}, byrefRegs=0000 {}, byr
        int3     
 						;; size=13 bbWeight=0 PerfScore 0.00
 
-; Total bytes of code 455, prolog size 8, PerfScore 125.44, instruction count 123, allocated bytes for code 455 (MethodHash=1a4a5a33) for method Microsoft.CodeAnalysis.VisualBasic.Syntax.InternalSyntax.Parser:ParseGroupEndStatement():Microsoft.CodeAnalysis.VisualBasic.Syntax.InternalSyntax.StatementSyntax:this
+; Total bytes of code 449, prolog size 8, PerfScore 123.96, instruction count 122, allocated bytes for code 449 (MethodHash=1a4a5a33) for method Microsoft.CodeAnalysis.VisualBasic.Syntax.InternalSyntax.Parser:ParseGroupEndStatement():Microsoft.CodeAnalysis.VisualBasic.Syntax.InternalSyntax.StatementSyntax:this
 ; ============================================================
 
 Unwind Info:
-19 (-0.87%) : 158122.dasm - Microsoft.CodeAnalysis.Debugging.CustomDebugInfoReader:GetCSharpGroupedImportStrings[int](int,int,System.Func`3[int,int,ubyte[]],System.Func`3[int,int,System.Collections.Immutable.ImmutableArray`1[System.String]],byref):System.Collections.Immutable.ImmutableArray`1[System.Collections.Immutable.ImmutableArray`1[System.String]]
@@ -16,9 +16,9 @@
 ;  V06 loc1         [V06,T45] (  3, 21   )    bool  ->  [rbp-3CH]   do-not-enreg[Z] EH-live
 ;  V07 loc2         [V07,T56] (  3, 12   )     ref  ->  rsi         class-hnd
 ;* V08 loc3         [V08    ] (  0,  0   )  struct ( 8) zero-ref    ld-addr-op single-def
-;  V09 loc4         [V09,T58] (  3, 10   )     ref  ->  rbx         class-hnd single-def
-;  V10 loc5         [V10,T25] (  7, 55   )     ref  ->  rdi         class-hnd single-def
-;  V11 loc6         [V11,T10] ( 10,150   )     int  ->  r14        
+;  V09 loc4         [V09,T58] (  3, 10   )     ref  ->  r14         class-hnd single-def
+;  V10 loc5         [V10,T25] (  7, 55   )     ref  ->  rbx         class-hnd single-def
+;  V11 loc6         [V11,T10] ( 10,150   )     int  ->  r15        
 ;* V12 loc7         [V12    ] (  0,  0   )  struct ( 8) zero-ref    ld-addr-op
 ;  V13 loc8         [V13,T21] (  7, 75   )     ref  ->  [rbp-78H]   do-not-enreg[Z] class-hnd EH-live
 ;  V14 loc9         [V14    ] (  5,112   )  struct (16) [rbp-50H]   do-not-enreg[XS] must-init addr-exposed
@@ -34,9 +34,9 @@
 ;  V24 loc19        [V24,T15] (  4,112   )     ref  ->  [rbp-80H]   class-hnd spill-single-def
 ;  V25 loc20        [V25,T50] (  4, 16   )     ref  ->  r13         class-hnd
 ;  V26 OutArgs      [V26    ] (  1,  1   )  struct (32) [rsp+00H]   do-not-enreg[XS] addr-exposed "OutgoingArgSpace"
-;  V27 tmp1         [V27,T67] (  3,  0   )     ref  ->  rsi         class-hnd exact "NewObj constructor temp"
-;  V28 tmp2         [V28,T68] (  3,  0   )     ref  ->  rsi         class-hnd exact "NewObj constructor temp"
-;  V29 tmp3         [V29,T69] (  3,  0   )     ref  ->  rsi         class-hnd exact "NewObj constructor temp"
+;  V27 tmp1         [V27,T67] (  3,  0   )     ref  ->  rdi         class-hnd exact "NewObj constructor temp"
+;  V28 tmp2         [V28,T68] (  3,  0   )     ref  ->  rdi         class-hnd exact "NewObj constructor temp"
+;  V29 tmp3         [V29,T69] (  3,  0   )     ref  ->  rdi         class-hnd exact "NewObj constructor temp"
 ;  V30 tmp4         [V30,T70] (  3,  0   )     ref  ->  rsi         class-hnd exact "NewObj constructor temp"
 ;  V31 tmp5         [V31,T71] (  3,  0   )     ref  ->  rsi         class-hnd exact "NewObj constructor temp"
 ;* V32 tmp6         [V32    ] (  0,  0   )  struct ( 8) zero-ref    "struct address for call/obj"
@@ -57,8 +57,8 @@
 ;  V47 tmp21        [V47,T12] (  3,128   )     int  ->   r8         "Inline return value spill temp"
 ;  V48 tmp22        [V48,T04] (  3,352.92)     int  ->   r8         "Inlining Arg"
 ;  V49 tmp23        [V49,T05] (  2,256   )     int  ->  r14         "Inline stloc first use temp"
-;  V50 tmp24        [V50,T61] (  3,  6   )     ref  ->  rbx         class-hnd single-def "dup spill"
-;  V51 tmp25        [V51,T62] (  3,  6   )     int  ->  rdi         "Inlining Arg"
+;  V50 tmp24        [V50,T61] (  3,  6   )     ref  ->  r14         class-hnd single-def "dup spill"
+;  V51 tmp25        [V51,T62] (  3,  6   )     int  ->  rbx         "Inlining Arg"
 ;* V52 tmp26        [V52    ] (  0,  0   )     ref  ->  zero-ref    class-hnd "Inlining Arg"
 ;* V53 tmp27        [V53    ] (  0,  0   )  struct ( 8) zero-ref    ld-addr-op "Inline stloc first use temp"
 ;* V54 tmp28        [V54    ] (  0,  0   )  struct (16) zero-ref    ld-addr-op "NewObj constructor temp"
@@ -80,13 +80,13 @@
 ;  V70 tmp44        [V70,T28] (  3, 48   )     ref  ->  rcx         class-hnd "Inlining Arg"
 ;  V71 tmp45        [V71,T48] (  2, 16   )     int  ->  r12         "Inline stloc first use temp"
 ;* V72 tmp46        [V72,T95] (  0,  0   )    bool  ->  zero-ref    "Inline return value spill temp"
-;  V73 tmp47        [V73,T24] (  7, 56   )     ref  ->  r15         class-hnd "Inlining Arg"
+;  V73 tmp47        [V73,T24] (  7, 56   )     ref  ->  rsi         class-hnd "Inlining Arg"
 ;  V74 tmp48        [V74,T49] (  5, 16.97)     int  ->  r12         "Inline stloc first use temp"
 ;* V75 tmp49        [V75    ] (  0,  0   )     int  ->  zero-ref    "Inline stloc first use temp"
 ;  V76 tmp50        [V76,T60] (  3,  8   )     int  ->   r8         "Inline return value spill temp"
 ;  V77 tmp51        [V77,T44] (  3, 22.06)     int  ->   r8         "Inlining Arg"
 ;  V78 tmp52        [V78,T46] (  7, 20   )     ref  ->  [rbp-98H]   must-init EH-live single-def V05.array(offs=0x00) P-INDEP "field V05.array (fldOffset=0x0)"
-;  V79 tmp53        [V79,T20] (  6, 78   )     ref  ->  rsi         V08.array(offs=0x00) P-INDEP "field V08.array (fldOffset=0x0)"
+;  V79 tmp53        [V79,T20] (  6, 78   )     ref  ->  rdi         V08.array(offs=0x00) P-INDEP "field V08.array (fldOffset=0x0)"
 ;* V80 tmp54        [V80    ] (  0,  0   )     ref  ->  zero-ref    V12.array(offs=0x00) P-INDEP "field V12.array (fldOffset=0x0)"
 ;  V81 tmp55        [V81    ] (  2, 64   )   ubyte  ->  [rbp-50H]   do-not-enreg[X] addr-exposed V14.Kind(offs=0x00) P-DEP "field V14.Kind (fldOffset=0x0)"
 ;  V82 tmp56        [V82    ] (  1, 32   )   ubyte  ->  [rbp-4FH]   do-not-enreg[X] addr-exposed V14.Version(offs=0x01) P-DEP "field V14.Version (fldOffset=0x1)"
@@ -94,7 +94,7 @@
 ;  V84 tmp58        [V84,T29] (  3, 48   )     ref  ->  rsi         V16.array(offs=0x00) P-INDEP "field V16.array (fldOffset=0x0)"
 ;  V85 tmp59        [V85,T11] (  2,144   )     ref  ->  rsi         V19._array(offs=0x00) P-INDEP "field V19._array (fldOffset=0x0)"
 ;  V86 tmp60        [V86,T01] (  5,528   )     int  ->  r14         V19._index(offs=0x08) P-INDEP "field V19._index (fldOffset=0x8)"
-;  V87 tmp61        [V87,T47] (  4, 18   )     ref  ->  r15         single-def V21._array(offs=0x00) P-INDEP "field V21._array (fldOffset=0x0)"
+;  V87 tmp61        [V87,T47] (  4, 18   )     ref  ->  rsi         single-def V21._array(offs=0x00) P-INDEP "field V21._array (fldOffset=0x0)"
 ;  V88 tmp62        [V88,T35] (  5, 33   )     int  ->  r12         V21._index(offs=0x08) P-INDEP "field V21._index (fldOffset=0x8)"
 ;  V89 tmp63        [V89,T51] (  2, 16   )     ref  ->  r13         V32.array(offs=0x00) P-INDEP "field V32.array (fldOffset=0x0)"
 ;  V90 tmp64        [V90,T37] (  2, 32   )     ref  ->  rax         V37.array(offs=0x00) P-INDEP "field V37.array (fldOffset=0x0)"
@@ -103,16 +103,16 @@
 ;  V93 tmp67        [V93,T39] (  2, 32   )     ref  ->  rsi         V41._array(offs=0x00) P-INDEP "field V41._array (fldOffset=0x0)"
 ;* V94 tmp68        [V94,T54] (  0,  0   )     int  ->  zero-ref    V41._index(offs=0x08) P-INDEP "field V41._index (fldOffset=0x8)"
 ;* V95 tmp69        [V95    ] (  0,  0   )     ref  ->  zero-ref    single-def V53.array(offs=0x00) P-INDEP "field V53.array (fldOffset=0x0)"
-;  V96 tmp70        [V96,T64] (  2,  2   )     ref  ->  r15         single-def V54._array(offs=0x00) P-INDEP "field V54._array (fldOffset=0x0)"
+;  V96 tmp70        [V96,T64] (  2,  2   )     ref  ->  rsi         single-def V54._array(offs=0x00) P-INDEP "field V54._array (fldOffset=0x0)"
 ;* V97 tmp71        [V97,T65] (  0,  0   )     int  ->  zero-ref    single-def V54._index(offs=0x08) P-INDEP "field V54._index (fldOffset=0x8)"
 ;  V98 tmp72        [V98,T52] (  2, 16   )     ref  ->  r13         V63.array(offs=0x00) P-INDEP "field V63.array (fldOffset=0x0)"
-;  V99 tmp73        [V99,T74] (  2,  0   )     ref  ->  rdi         "argument with side effect"
+;  V99 tmp73        [V99,T74] (  2,  0   )     ref  ->  rbx         "argument with side effect"
 ;  V100 tmp74       [V100,T75] (  2,  0   )     ref  ->  rdx         "argument with side effect"
 ;  V101 tmp75       [V101,T76] (  2,  0   )     ref  ->  rdx         "argument with side effect"
-;  V102 tmp76       [V102,T77] (  2,  0   )     ref  ->  rdi         "argument with side effect"
+;  V102 tmp76       [V102,T77] (  2,  0   )     ref  ->  rbx         "argument with side effect"
 ;  V103 tmp77       [V103,T78] (  2,  0   )     ref  ->  rdx         "argument with side effect"
 ;  V104 tmp78       [V104,T79] (  2,  0   )     ref  ->  rdx         "argument with side effect"
-;  V105 tmp79       [V105,T80] (  2,  0   )     ref  ->  rdi         "argument with side effect"
+;  V105 tmp79       [V105,T80] (  2,  0   )     ref  ->  rbx         "argument with side effect"
 ;  V106 tmp80       [V106,T81] (  2,  0   )     ref  ->  rdx         "argument with side effect"
 ;  V107 tmp81       [V107,T82] (  2,  0   )     ref  ->  rdx         "argument with side effect"
 ;  V108 tmp82       [V108,T22] (  2, 64   )     int  ->  rdx         "argument with side effect"
@@ -173,13 +173,14 @@ G_M8847_IG02:        ; bbWeight=1, gcVars=00000000000000000080000400000000 {V02
        ; gcrRegs +[r8-r9]
        xor      edx, edx
        mov      qword ptr [rcx], rdx
-       mov      gword ptr [rbp-98H], rdx
+       xor      rsi, rsi
+       ; gcrRegs +[rsi]
+       mov      gword ptr [rbp-98H], rsi
        ; GC ptr vars +{V78}
-       xor      r10d, r10d
-       mov      dword ptr [rbp-3CH], r10d
-						;; size=19 bbWeight=1 PerfScore 3.50
+       mov      dword ptr [rbp-3CH], edx
+						;; size=17 bbWeight=1 PerfScore 3.50
 G_M8847_IG03:        ; bbWeight=4, gcVars=00000000000000000080400400000000 {V02 V03 V78}, gcrefRegs=0000 {}, byrefRegs=0000 {}, gcvars, byref, isz
-       ; gcrRegs -[r8-r9]
+       ; gcrRegs -[rsi r8-r9]
        ; byrRegs -[rcx]
        mov      r8, gword ptr [rbp+20H]
        ; gcrRegs +[r8]
@@ -275,14 +276,14 @@ G_M8847_IG08:        ; bbWeight=32, gcrefRegs=0000 {}, byrefRegs=0000 {}, byref
        jmp      rax
 						;; size=59 bbWeight=32 PerfScore 416.00
 G_M8847_IG09:        ; bbWeight=16, gcrefRegs=0000 {}, byrefRegs=0000 {}, byref
-       mov      rdx, gword ptr [rbp-98H]
-       ; gcrRegs +[rdx]
-       test     rdx, rdx
+       mov      rsi, gword ptr [rbp-98H]
+       ; gcrRegs +[rsi]
+       test     rsi, rsi
        jne      G_M8847_IG20
        mov      rcx, gword ptr [rbp-48H]
        ; gcrRegs +[rcx]
        call     [Microsoft.CodeAnalysis.Debugging.CustomDebugInfoReader:DecodeUsingRecord(System.Collections.Immutable.ImmutableArray`1[ubyte]):System.Collections.Immutable.ImmutableArray`1[short]]
-       ; gcrRegs -[rcx rdx] +[rax]
+       ; gcrRegs -[rcx rsi] +[rax]
        ; gcr arg pop 0
        mov      gword ptr [rbp-98H], rax
        jmp      G_M8847_IG18
@@ -435,76 +436,78 @@ G_M8847_IG18:        ; bbWeight=32, gcrefRegs=0000 {}, byrefRegs=0000 {}, byref
 G_M8847_IG19:        ; bbWeight=1, gcrefRegs=0000 {}, byrefRegs=0000 {}, byref
        jmp      G_M8847_IG25
 						;; size=5 bbWeight=1 PerfScore 2.00
-G_M8847_IG20:        ; bbWeight=0, gcrefRegs=0000 {}, byrefRegs=0000 {}, byref
+G_M8847_IG20:        ; bbWeight=0, gcrefRegs=0040 {rsi}, byrefRegs=0000 {}, byref
+       ; gcrRegs +[rsi]
        mov      rcx, 0xD1FFAB1E      ; <unknown class>
        call     CORINFO_HELP_NEWSFAST
        ; gcrRegs +[rax]
        ; gcr arg pop 0
-       mov      rsi, rax
-       ; gcrRegs +[rsi]
+       mov      rdi, rax
+       ; gcrRegs +[rdi]
        mov      ecx, 0x140F0
        mov      rdx, 0xD1FFAB1E
        call     CORINFO_HELP_STRCNS
        ; gcr arg pop 0
-       mov      rdi, rax
-       ; gcrRegs +[rdi]
+       mov      rbx, rax
+       ; gcrRegs +[rbx]
        mov      ecx, dword ptr [rbp+10H]
        call     [<unknown method>]
        ; gcr arg pop 0
        mov      rdx, rax
        ; gcrRegs +[rdx]
+       mov      rcx, rbx
+       ; gcrRegs +[rcx]
+       call     [<unknown method>]
+       ; gcrRegs -[rcx rdx rbx]
+       ; gcr arg pop 0
+       mov      rdx, rax
+       ; gcrRegs +[rdx]
        mov      rcx, rdi
        ; gcrRegs +[rcx]
        call     [<unknown method>]
-       ; gcrRegs -[rcx rdx rdi]
-       ; gcr arg pop 0
-       mov      rdx, rax
-       ; gcrRegs +[rdx]
-       mov      rcx, rsi
-       ; gcrRegs +[rcx]
-       call     [<unknown method>]
        ; gcrRegs -[rax rcx rdx]
        ; gcr arg pop 0
-       mov      rcx, rsi
+       mov      rcx, rdi
        ; gcrRegs +[rcx]
        call     CORINFO_HELP_THROW
-       ; gcrRegs -[rcx rsi]
+       ; gcrRegs -[rcx rdi]
        ; gcr arg pop 0
 						;; size=82 bbWeight=0 PerfScore 0.00
 G_M8847_IG21:        ; bbWeight=0, gcrefRegs=0000 {}, byrefRegs=0000 {}, byref
+       ; gcrRegs -[rsi]
        mov      rcx, 0xD1FFAB1E      ; <unknown class>
        call     CORINFO_HELP_NEWSFAST
        ; gcrRegs +[rax]
        ; gcr arg pop 0
-       mov      rsi, rax
-       ; gcrRegs +[rsi]
+       mov      rdi, rax
+       ; gcrRegs +[rdi]
        mov      ecx, 0x14152
        mov      rdx, 0xD1FFAB1E
        call     CORINFO_HELP_STRCNS
        ; gcr arg pop 0
-       mov      rdi, rax
-       ; gcrRegs +[rdi]
+       mov      rbx, rax
+       ; gcrRegs +[rbx]
        mov      ecx, dword ptr [rbp+10H]
        call     [<unknown method>]
        ; gcr arg pop 0
        mov      rdx, rax
        ; gcrRegs +[rdx]
+       mov      rcx, rbx
+       ; gcrRegs +[rcx]
+       call     [<unknown method>]
+       ; gcrRegs -[rcx rdx rbx]
+       ; gcr arg pop 0
+       mov      rdx, rax
+       ; gcrRegs +[rdx]
        mov      rcx, rdi
        ; gcrRegs +[rcx]
        call     [<unknown method>]
-       ; gcrRegs -[rcx rdx rdi]
-       ; gcr arg pop 0
-       mov      rdx, rax
-       ; gcrRegs +[rdx]
-       mov      rcx, rsi
-       ; gcrRegs +[rcx]
-       call     [<unknown method>]
        ; gcrRegs -[rax rcx rdx]
        ; gcr arg pop 0
-       mov      rcx, rsi
+       mov      rcx, rdi
        ; gcrRegs +[rcx]
        call     CORINFO_HELP_THROW
-       ; gcrRegs -[rcx rsi]
+       ; gcrRegs -[rcx rdi]
        ; gcr arg pop 0
 						;; size=82 bbWeight=0 PerfScore 0.00
 G_M8847_IG22:        ; bbWeight=0, gcrefRegs=0000 {}, byrefRegs=0000 {}, byref
@@ -512,35 +515,35 @@ G_M8847_IG22:        ; bbWeight=0, gcrefRegs=0000 {}, byrefRegs=0000 {}, byref
        call     CORINFO_HELP_NEWSFAST
        ; gcrRegs +[rax]
        ; gcr arg pop 0
-       mov      rsi, rax
-       ; gcrRegs +[rsi]
+       mov      rdi, rax
+       ; gcrRegs +[rdi]
        mov      ecx, 0x141E1
        mov      rdx, 0xD1FFAB1E
        call     CORINFO_HELP_STRCNS
        ; gcr arg pop 0
-       mov      rdi, rax
-       ; gcrRegs +[rdi]
+       mov      rbx, rax
+       ; gcrRegs +[rbx]
        mov      ecx, dword ptr [rbp+10H]
        call     [<unknown method>]
        ; gcr arg pop 0
        mov      rdx, rax
        ; gcrRegs +[rdx]
+       mov      rcx, rbx
...
+2 (+33.33%) : 139220.dasm - Newtonsoft.Json.Utilities.DynamicProxy`1[ubyte]:TryConvert(ubyte,System.Dynamic.ConvertBinder,byref):bool:this
@@ -21,12 +21,14 @@ G_M29059_IG02:        ; bbWeight=1, gcrefRegs=0000 {}, byrefRegs=0200 {r9}, byre
        xor      rax, rax
        ; gcrRegs +[rax]
        mov      gword ptr [r9], rax
-						;; size=5 bbWeight=1 PerfScore 1.25
+       xor      eax, eax
+       ; gcrRegs -[rax]
+						;; size=7 bbWeight=1 PerfScore 1.50
 G_M29059_IG03:        ; bbWeight=1, epilog, nogc, extend
        ret      
 						;; size=1 bbWeight=1 PerfScore 1.00
 
-; Total bytes of code 6, prolog size 0, PerfScore 2.85, instruction count 3, allocated bytes for code 6 (MethodHash=4d738e7c) for method Newtonsoft.Json.Utilities.DynamicProxy`1[ubyte]:TryConvert(ubyte,System.Dynamic.ConvertBinder,byref):bool:this
+; Total bytes of code 8, prolog size 0, PerfScore 3.30, instruction count 4, allocated bytes for code 8 (MethodHash=4d738e7c) for method Newtonsoft.Json.Utilities.DynamicProxy`1[ubyte]:TryConvert(ubyte,System.Dynamic.ConvertBinder,byref):bool:this
 ; ============================================================
 
 Unwind Info:
+2 (+33.33%) : 139226.dasm - Newtonsoft.Json.Utilities.DynamicProxy`1[short]:TryConvert(short,System.Dynamic.ConvertBinder,byref):bool:this
@@ -21,12 +21,14 @@ G_M25539_IG02:        ; bbWeight=1, gcrefRegs=0000 {}, byrefRegs=0200 {r9}, byre
        xor      rax, rax
        ; gcrRegs +[rax]
        mov      gword ptr [r9], rax
-						;; size=5 bbWeight=1 PerfScore 1.25
+       xor      eax, eax
+       ; gcrRegs -[rax]
+						;; size=7 bbWeight=1 PerfScore 1.50
 G_M25539_IG03:        ; bbWeight=1, epilog, nogc, extend
        ret      
 						;; size=1 bbWeight=1 PerfScore 1.00
 
-; Total bytes of code 6, prolog size 0, PerfScore 2.85, instruction count 3, allocated bytes for code 6 (MethodHash=d1b29c3c) for method Newtonsoft.Json.Utilities.DynamicProxy`1[short]:TryConvert(short,System.Dynamic.ConvertBinder,byref):bool:this
+; Total bytes of code 8, prolog size 0, PerfScore 3.30, instruction count 4, allocated bytes for code 8 (MethodHash=d1b29c3c) for method Newtonsoft.Json.Utilities.DynamicProxy`1[short]:TryConvert(short,System.Dynamic.ConvertBinder,byref):bool:this
 ; ============================================================
 
 Unwind Info:
+2 (+33.33%) : 139232.dasm - Newtonsoft.Json.Utilities.DynamicProxy`1[int]:TryConvert(int,System.Dynamic.ConvertBinder,byref):bool:this
@@ -21,12 +21,14 @@ G_M31107_IG02:        ; bbWeight=1, gcrefRegs=0000 {}, byrefRegs=0200 {r9}, byre
        xor      rax, rax
        ; gcrRegs +[rax]
        mov      gword ptr [r9], rax
-						;; size=5 bbWeight=1 PerfScore 1.25
+       xor      eax, eax
+       ; gcrRegs -[rax]
+						;; size=7 bbWeight=1 PerfScore 1.50
 G_M31107_IG03:        ; bbWeight=1, epilog, nogc, extend
        ret      
 						;; size=1 bbWeight=1 PerfScore 1.00
 
-; Total bytes of code 6, prolog size 0, PerfScore 2.85, instruction count 3, allocated bytes for code 6 (MethodHash=a106867c) for method Newtonsoft.Json.Utilities.DynamicProxy`1[int]:TryConvert(int,System.Dynamic.ConvertBinder,byref):bool:this
+; Total bytes of code 8, prolog size 0, PerfScore 3.30, instruction count 4, allocated bytes for code 8 (MethodHash=a106867c) for method Newtonsoft.Json.Utilities.DynamicProxy`1[int]:TryConvert(int,System.Dynamic.ConvertBinder,byref):bool:this
 ; ============================================================
 
 Unwind Info:
libraries_tests.pmi.windows.x64.checked.mch
+0 (0.00%) : 183183.dasm - System.Text.RegularExpressions.Tests.RegexGroupTests+d__0:MoveNext():bool:this
@@ -65975,12 +65975,12 @@ G_M36547_IG882:        ; bbWeight=1, gcrefRegs=0000 {}, byrefRegs=0000 {}, byref
        xor      rax, rax
        ; gcrRegs +[rax]
        mov      gword ptr [rcx+10H], rax
-       xor      eax, eax
-       ; gcrRegs -[rax]
-       mov      dword ptr [rbp-04H], eax
+       xor      ecx, ecx
+       ; gcrRegs -[rcx]
+       mov      dword ptr [rbp-04H], ecx
 						;; size=54 bbWeight=1 PerfScore 15.00
 G_M36547_IG883:        ; bbWeight=1, gcrefRegs=0000 {}, byrefRegs=0000 {}, byref
-       ; gcrRegs -[rcx]
+       ; gcrRegs -[rax]
        mov      eax, dword ptr [rbp-04H]
 						;; size=3 bbWeight=1 PerfScore 1.00
 G_M36547_IG884:        ; bbWeight=1, epilog, nogc, extend
+0 (0.00%) : 287448.dasm - System.ComponentModel.Tests.DecimalConverterTests+d__2:MoveNext():bool:this
@@ -115,7 +115,7 @@
 ;* V105 tmp102      [V105    ] (  0,  0   )    long  ->  zero-ref    single-def V38._lo64(offs=0x08) P-INDEP "field V38._lo64 (fldOffset=0x8)"
 ;* V106 tmp103      [V106    ] (  0,  0   )   byref  ->  zero-ref    V39._reference(offs=0x00) P-INDEP "field V39._reference (fldOffset=0x0)"
 ;* V107 tmp104      [V107    ] (  0,  0   )     int  ->  zero-ref    V39._length(offs=0x08) P-INDEP "field V39._length (fldOffset=0x8)"
-;  V108 tmp105      [V108,T47] (  2,  1.00)   byref  ->  rdx         single-def V40._reference(offs=0x00) P-INDEP "field V40._reference (fldOffset=0x0)"
+;  V108 tmp105      [V108,T47] (  2,  1.00)   byref  ->  rax         single-def V40._reference(offs=0x00) P-INDEP "field V40._reference (fldOffset=0x0)"
 ;* V109 tmp106      [V109,T76] (  0,  0   )     int  ->  zero-ref    single-def V40._length(offs=0x08) P-INDEP "field V40._length (fldOffset=0x8)"
 ;* V110 tmp107      [V110    ] (  0,  0   )     ref  ->  zero-ref    single-def "argument with side effect"
 ;  V111 tmp108      [V111,T12] (  4,  4.00)   byref  ->  rax         single-def "BlockOp address local"
@@ -240,15 +240,15 @@ G_M49258_IG04:        ; bbWeight=0.50, gcrefRegs=0040 {rsi}, byrefRegs=0000 {},
        xor      edx, edx
        mov      dword ptr [rax+04H], edx
        mov      qword ptr [rax+08H], 11
+       xor      rax, rax
        mov      dword ptr [rsp+40H], 0x10000
-       xor      eax, eax
-       ; byrRegs -[rax]
-       mov      dword ptr [rsp+44H], eax
+       mov      dword ptr [rsp+44H], edx
        mov      qword ptr [rsp+48H], 11
-       mov      bword ptr [rsp+30H], rdx
-       mov      dword ptr [rsp+38H], eax
+       mov      bword ptr [rsp+30H], rax
+       mov      dword ptr [rsp+38H], edx
        call     [System.Globalization.NumberFormatInfo:get_CurrentInfo():System.Globalization.NumberFormatInfo]
        ; gcrRegs +[rax]
+       ; byrRegs -[rax]
        ; gcr arg pop 0
        mov      r8, rax
        ; gcrRegs +[r8]
+2 (+0.01%) : 183686.dasm - System.Text.RegularExpressions.Tests.RegexReplaceTests+d__0:MoveNext():bool:this
@@ -6862,9 +6862,11 @@ G_M48287_IG145:        ; bbWeight=0.50, gcrefRegs=0000 {}, byrefRegs=0000 {}, by
        mov      rcx, gword ptr [rbp+10H]
        ; gcrRegs +[rcx]
        mov      gword ptr [rcx+10H], rax
-						;; size=10 bbWeight=0.50 PerfScore 1.12
+       xor      eax, eax
+       ; gcrRegs -[rax]
+						;; size=12 bbWeight=0.50 PerfScore 1.25
 G_M48287_IG146:        ; bbWeight=1, gcVars=000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 {}, gcrefRegs=0000 {}, byrefRegs=0000 {}, gcvars, byref, epilog, nogc
-       ; gcrRegs -[rax rcx]
+       ; gcrRegs -[rcx]
        ; GC ptr vars -{V00}
        add      rsp, 48
        pop      rsi
@@ -6969,7 +6971,7 @@ RWD00  	dd	G_M48287_IG04 - G_M48287_IG02
        	dd	G_M48287_IG142 - G_M48287_IG02
 
 
-; Total bytes of code 18027, prolog size 20, PerfScore 3047.33, instruction count 3503, allocated bytes for code 18027 (MethodHash=03804360) for method System.Text.RegularExpressions.Tests.RegexReplaceTests+<Replace_String_TestData>d__0:MoveNext():bool:this
+; Total bytes of code 18029, prolog size 20, PerfScore 3047.65, instruction count 3504, allocated bytes for code 18029 (MethodHash=03804360) for method System.Text.RegularExpressions.Tests.RegexReplaceTests+<Replace_String_TestData>d__0:MoveNext():bool:this
 ; ============================================================
 
 Unwind Info:
+2 (+33.33%) : 92736.dasm - ManagedTests.DynamicCSharp.Conformance.dynamic.ClsCompliance.mixedmode02.mixedmode02.MyClass`1[short]:OutMethod01[System.__Canon](short,byref,byref):short
@@ -22,12 +22,14 @@ G_M48797_IG02:        ; bbWeight=1, gcrefRegs=0000 {}, byrefRegs=0200 {r9}, byre
        xor      rax, rax
        ; gcrRegs +[rax]
        mov      gword ptr [r9], rax
-						;; size=5 bbWeight=1 PerfScore 1.25
+       xor      eax, eax
+       ; gcrRegs -[rax]
+						;; size=7 bbWeight=1 PerfScore 1.50
 G_M48797_IG03:        ; bbWeight=1, epilog, nogc, extend
        ret      
 						;; size=1 bbWeight=1 PerfScore 1.00
 
-; Total bytes of code 6, prolog size 0, PerfScore 2.85, instruction count 3, allocated bytes for code 6 (MethodHash=7bdc4162) for method ManagedTests.DynamicCSharp.Conformance.dynamic.ClsCompliance.mixedmode02.mixedmode02.MyClass`1[short]:OutMethod01[System.__Canon](short,byref,byref):short
+; Total bytes of code 8, prolog size 0, PerfScore 3.30, instruction count 4, allocated bytes for code 8 (MethodHash=7bdc4162) for method ManagedTests.DynamicCSharp.Conformance.dynamic.ClsCompliance.mixedmode02.mixedmode02.MyClass`1[short]:OutMethod01[System.__Canon](short,byref,byref):short
 ; ============================================================
 
 Unwind Info:
+2 (+33.33%) : 205216.dasm - Microsoft.IdentityModel.Json.Utilities.DynamicProxy`1[System.__Canon]:TryConvert(System.__Canon,System.Dynamic.ConvertBinder,byref):bool:this
@@ -21,12 +21,14 @@ G_M17159_IG02:        ; bbWeight=1, gcrefRegs=0000 {}, byrefRegs=0200 {r9}, byre
        xor      rax, rax
        ; gcrRegs +[rax]
        mov      gword ptr [r9], rax
-						;; size=5 bbWeight=1 PerfScore 1.25
+       xor      eax, eax
+       ; gcrRegs -[rax]
+						;; size=7 bbWeight=1 PerfScore 1.50
 G_M17159_IG03:        ; bbWeight=1, epilog, nogc, extend
        ret      
 						;; size=1 bbWeight=1 PerfScore 1.00
 
-; Total bytes of code 6, prolog size 0, PerfScore 2.85, instruction count 3, allocated bytes for code 6 (MethodHash=2009bcf8) for method Microsoft.IdentityModel.Json.Utilities.DynamicProxy`1[System.__Canon]:TryConvert(System.__Canon,System.Dynamic.ConvertBinder,byref):bool:this
+; Total bytes of code 8, prolog size 0, PerfScore 3.30, instruction count 4, allocated bytes for code 8 (MethodHash=2009bcf8) for method Microsoft.IdentityModel.Json.Utilities.DynamicProxy`1[System.__Canon]:TryConvert(System.__Canon,System.Dynamic.ConvertBinder,byref):bool:this
 ; ============================================================
 
 Unwind Info:
+2 (+40.00%) : 92637.dasm - ManagedTests.DynamicCSharp.Conformance.dynamic.ClsCompliance.namingkeyword01.namingkeyword01.MyNamespace1.dynamic:Method01(byref,ManagedTests.DynamicCSharp.Conformance.dynamic.ClsCompliance.namingkeyword01.namingkeyword01.MyNamespace1.dynamic):ManagedTests.DynamicCSharp.Conformance.dynamic.ClsCompliance.namingkeyword01.namingkeyword01.MyNamespace1.dynamic:this
@@ -19,12 +19,14 @@ G_M16395_IG02:        ; bbWeight=1, gcrefRegs=0000 {}, byrefRegs=0004 {rdx}, byr
        ; byrRegs +[rdx]
        xor      eax, eax
        mov      dword ptr [rdx], eax
-						;; size=4 bbWeight=1 PerfScore 1.25
+       xor      rax, rax
+       ; gcrRegs +[rax]
+						;; size=6 bbWeight=1 PerfScore 1.50
 G_M16395_IG03:        ; bbWeight=1, epilog, nogc, extend
        ret      
 						;; size=1 bbWeight=1 PerfScore 1.00
 
-; Total bytes of code 5, prolog size 0, PerfScore 2.75, instruction count 3, allocated bytes for code 5 (MethodHash=724ebff4) for method ManagedTests.DynamicCSharp.Conformance.dynamic.ClsCompliance.namingkeyword01.namingkeyword01.MyNamespace1.dynamic:Method01(byref,ManagedTests.DynamicCSharp.Conformance.dynamic.ClsCompliance.namingkeyword01.namingkeyword01.MyNamespace1.dynamic):ManagedTests.DynamicCSharp.Conformance.dynamic.ClsCompliance.namingkeyword01.namingkeyword01.MyNamespace1.dynamic:this
+; Total bytes of code 7, prolog size 0, PerfScore 3.20, instruction count 4, allocated bytes for code 7 (MethodHash=724ebff4) for method ManagedTests.DynamicCSharp.Conformance.dynamic.ClsCompliance.namingkeyword01.namingkeyword01.MyNamespace1.dynamic:Method01(byref,ManagedTests.DynamicCSharp.Conformance.dynamic.ClsCompliance.namingkeyword01.namingkeyword01.MyNamespace1.dynamic):ManagedTests.DynamicCSharp.Conformance.dynamic.ClsCompliance.namingkeyword01.namingkeyword01.MyNamespace1.dynamic:this
 ; ============================================================
 
 Unwind Info:
Details

Improvements/regressions per collection

Collection Contexts with diffs Improvements Regressions Same size Improvements (bytes) Regressions (bytes)
aspnet.run.windows.x64.checked.mch 2,324 7 2,200 117 -16 +6,118
benchmarks.run.windows.x64.checked.mch 695 0 695 0 -0 +2,046
coreclr_tests.run.windows.x64.checked.mch 900 1 866 33 -2 +3,415
libraries.crossgen2.windows.x64.checked.mch 2,910 4 2,906 0 -37 +8,719
libraries.pmi.windows.x64.checked.mch 3,997 11 3,983 3 -163 +11,720
libraries_tests.pmi.windows.x64.checked.mch 20,145 0 20,143 2 -0 +82,774
30,971 23 30,793 155 -218 +114,792

Context information

Collection Diffed contexts MinOpts FullOpts Missed, base Missed, diff
aspnet.run.windows.x64.checked.mch 122,238 78,081 44,157 13 (0.01%) 13 (0.01%)
benchmarks.run.windows.x64.checked.mch 35,599 1,314 34,285 0 (0.00%) 0 (0.00%)
coreclr_tests.run.windows.x64.checked.mch 524,579 332,968 191,611 0 (0.00%) 0 (0.00%)
libraries.crossgen2.windows.x64.checked.mch 212,102 15 212,087 0 (0.00%) 0 (0.00%)
libraries.pmi.windows.x64.checked.mch 269,221 4,910 264,311 0 (0.00%) 0 (0.00%)
libraries_tests.pmi.windows.x64.checked.mch 357,376 8,501 348,875 0 (0.00%) 0 (0.00%)
1,521,115 425,789 1,095,326 13 (0.00%) 13 (0.00%)

jit-analyze output

@BruceForstall
Copy link
Member

This problem is similar to the "elided move" problem that at one point was solved by introducing a zero-size pseudo-instruction INS_mov_eliminated in #53684, but that PR had to be reverted (I don't think it was subsequently fixed with a similar pseudo-instruction methodology).

Here, you can imagine that a ReuseReg should at least generate a GC state update. The only place we see this issue (due to the LSRA code shown above) is when we have a zero reg, where we allow GC-ness mismatch. A "GC zero" that "becomes" a non-GC reg can still be tracked as a GC reg, and hit this assert. Presumably, a "non-GC zero" that "becomes" a GC reg wouldn't hit a problem because you would always have a write to the reg, not a RMW update.

The solution here looks ok to me, as it captures the GCInfo tracking sets into the emitter GC sets which are used (together with the instrDesc idGCref() data) during emission. Introducing the label might cause some unrelated GC vars to be reported dead earlier than before. Ideally, we'd have a generic "GC reg update" pseudo-instruction on which we could hang these kind of elided instruction GC state updates.

@BruceForstall
Copy link
Member

I opened #84313 to track the idea of adding a pseudo-instruction to track GC state changes of omitted instructions.

@TIHan TIHan merged commit 00f921d into dotnet:main Apr 4, 2023
@ghost ghost locked as resolved and limited conversation to collaborators May 4, 2023
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI
Projects
None yet
Development

Successfully merging this pull request may close these issues.

[libraries-jitstress-random] Assertion failed '(emitThisGCrefRegs & regMask) == 0' during 'Emit code'
3 participants