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

Regressions in Devirtualization.EqualityComparer #88667

Closed
performanceautofiler bot opened this issue Jul 11, 2023 · 12 comments · Fixed by #88749
Closed

Regressions in Devirtualization.EqualityComparer #88667

performanceautofiler bot opened this issue Jul 11, 2023 · 12 comments · Fixed by #88749
Assignees
Labels
arch-x64 area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI os-windows PGO runtime-coreclr specific to the CoreCLR runtime

Comments

@performanceautofiler
Copy link

Run Information

Name Value
Architecture x64
OS Windows 10.0.19042
Queue OwlWindows
Baseline e3ae9042413a0a43e13e4272f7d8fb5d977edceb
Compare 9ea317f17d1ef5988921f611f80834d15a3e8070
Diff Diff
Configs CompilationMode:tiered, RunKind:micro

Regressions in Devirtualization.EqualityComparer

Benchmark Baseline Test Test/Base Test Quality Edge Detector Baseline IR Compare IR IR Ratio
ValueTupleCompare - Duration of single invocation 1.84 ns 3.84 ns 2.08 0.01 True
ValueTupleCompareNoOpt - Duration of single invocation 4.47 ns 6.09 ns 1.36 0.04 True
ValueTupleCompareCached - Duration of single invocation 3.12 ns 4.34 ns 1.39 0.20 False
ValueTupleCompareWrapped - Duration of single invocation 1.86 ns 3.81 ns 2.05 0.16 False

graph
graph
graph
graph
Test Report

Repro

General Docs link: https://github.com/dotnet/performance/blob/main/docs/benchmarking-workflow-dotnet-runtime.md

git clone https://github.com/dotnet/performance.git
py .\performance\scripts\benchmarks_ci.py -f net8.0 --filter 'Devirtualization.EqualityComparer*'

Payloads

Baseline
Compare

Devirtualization.EqualityComparer.ValueTupleCompare

ETL Files

Histogram


Description of detection logic

IsRegressionBase: Marked as regression because the compare was 5% greater than the baseline, and the value was not too small.
IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsRegressionBase: Marked as regression because the compare was 5% greater than the baseline, and the value was not too small.
IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsRegressionWindowed: Marked as regression because 3.843112840283866 > 2.2906849067852604.
IsChangePoint: Marked as a change because one of 5/19/2023 10:30:38 AM, 7/5/2023 3:16:33 PM, 7/10/2023 4:47:56 PM falls between 7/1/2023 10:14:52 PM and 7/10/2023 4:47:56 PM.
IsRegressionStdDev: Marked as regression because -57.42751590463879 (T) = (0 -3.8374712675164275) / Math.Sqrt((0.026791380736852954 / (26)) + (1.1981683562958218E-05 / (15))) is less than -2.0226909200346674 = MathNet.Numerics.Distributions.StudentT.InvCDF(0, 1, (26) + (15) - 2, .025) and -0.92517646236273 = (1.9933088433913102 - 3.8374712675164275) / 1.9933088433913102 is less than -0.05.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsChangeEdgeDetector: Marked as regression because Edge Detector said so.

JIT Disasms

Devirtualization.EqualityComparer.ValueTupleCompareNoOpt

ETL Files

Histogram


Description of detection logic

IsRegressionBase: Marked as regression because the compare was 5% greater than the baseline, and the value was not too small.
IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsRegressionBase: Marked as regression because the compare was 5% greater than the baseline, and the value was not too small.
IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsRegressionWindowed: Marked as regression because 6.092543341559851 > 4.704558109630318.
IsChangePoint: Marked as a change because one of 7/5/2023 3:16:33 PM, 7/10/2023 4:47:56 PM falls between 7/1/2023 10:14:52 PM and 7/10/2023 4:47:56 PM.
IsRegressionStdDev: Marked as regression because -848.1624026883707 (T) = (0 -6.094328851821734) / Math.Sqrt((5.678715287955347E-05 / (26)) + (2.235689394598058E-05 / (15))) is less than -2.0226909200346674 = MathNet.Numerics.Distributions.StudentT.InvCDF(0, 1, (26) + (15) - 2, .025) and -0.36385144554699234 = (4.4684696942030335 - 6.094328851821734) / 4.4684696942030335 is less than -0.05.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsChangeEdgeDetector: Marked as regression because Edge Detector said so.

JIT Disasms

Devirtualization.EqualityComparer.ValueTupleCompareCached

ETL Files

Histogram


Description of detection logic

IsRegressionBase: Marked as regression because the compare was 5% greater than the baseline, and the value was not too small.
IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsRegressionBase: Marked as regression because the compare was 5% greater than the baseline, and the value was not too small.
IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsRegressionWindowed: Marked as regression because 4.340094943627221 > 2.9171170060329317.
IsChangePoint: Marked as a change because one of 5/23/2023 1:41:12 PM, 7/5/2023 3:16:33 PM, 7/10/2023 4:47:56 PM falls between 7/1/2023 10:14:52 PM and 7/10/2023 4:47:56 PM.
IsRegressionStdDev: Marked as regression because -33.57170136745841 (T) = (0 -4.339886342672489) / Math.Sqrt((0.04238543685962824 / (26)) + (6.660613160837092E-06 / (15))) is less than -2.0226909200346674 = MathNet.Numerics.Distributions.StudentT.InvCDF(0, 1, (26) + (15) - 2, .025) and -0.4542803144749973 = (2.984215834785064 - 4.339886342672489) / 2.984215834785064 is less than -0.05.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsChangeEdgeDetector: Marked not as a regression because Edge Detector said so.

JIT Disasms

Devirtualization.EqualityComparer.ValueTupleCompareWrapped

ETL Files

Histogram


Description of detection logic

IsRegressionBase: Marked as regression because the compare was 5% greater than the baseline, and the value was not too small.
IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsRegressionBase: Marked as regression because the compare was 5% greater than the baseline, and the value was not too small.
IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsRegressionWindowed: Marked as regression because 3.8107148712347003 > 2.5720030080921883.
IsChangePoint: Marked as a change because one of 5/19/2023 10:55:27 PM, 7/1/2023 6:36:20 PM, 7/5/2023 3:16:33 PM, 7/10/2023 4:47:56 PM falls between 7/1/2023 10:14:52 PM and 7/10/2023 4:47:56 PM.
IsRegressionStdDev: Marked as regression because -26.814634495440476 (T) = (0 -3.81425130162482) / Math.Sqrt((0.10037157665979843 / (26)) + (1.4754199600727505E-05 / (15))) is less than -2.0226909200346674 = MathNet.Numerics.Distributions.StudentT.InvCDF(0, 1, (26) + (15) - 2, .025) and -0.7757393334723831 = (2.1479792837421767 - 3.81425130162482) / 2.1479792837421767 is less than -0.05.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsChangeEdgeDetector: Marked not as a regression because Edge Detector said so.

JIT Disasms

Docs

Profiling workflow for dotnet/runtime repository
Benchmarking workflow for dotnet/runtime repository

@performanceautofiler performanceautofiler bot added arch-x64 os-windows PGO runtime-coreclr specific to the CoreCLR runtime untriaged New issue has not been triaged by the area owner labels Jul 11, 2023
@cincuranet cincuranet removed the untriaged New issue has not been triaged by the area owner label Jul 11, 2023
@cincuranet cincuranet changed the title [Perf] Windows/x64: 4 Regressions on 7/5/2023 7:07:19 PM Regressions in Devirtualization.EqualityComparer Jul 11, 2023
@cincuranet cincuranet transferred this issue from dotnet/perf-autofiling-issues Jul 11, 2023
@dotnet-issue-labeler dotnet-issue-labeler bot added the needs-area-label An area label is needed to ensure this gets routed to the appropriate area owners label Jul 11, 2023
@ghost ghost added the untriaged New issue has not been triaged by the area owner label Jul 11, 2023
@cincuranet
Copy link
Contributor

Probably caused by #88006. cc @MichalPetryka

@AndyAyersMS
Copy link
Member

Seems to have cross-platform impact:

image

@MichalPetryka
Copy link
Contributor

@jkotas Could this maybe be the removal of the ByteEqualityComparer? Nothing else comes to my mind here.

@jkotas
Copy link
Member

jkotas commented Jul 11, 2023

Are you able to reproduce it on your machine? What is the asm before/after?

@EgorBo
Copy link
Member

EgorBo commented Jul 11, 2023

public enum IntEnum { }

public class Foo
{
    [MethodImpl(MethodImplOptions.NoInlining)]
    public static bool A((byte, IntEnum, int) a, (byte, IntEnum, int) b)
    {
        return EqualityComparer<(byte, IntEnum, int)>.Default.Equals(a, b);
    }
}

New codegen:

; Assembly listing for method Foo:A(System.ValueTuple`3[ubyte,int,int],System.ValueTuple`3[ubyte,int,int]):bool (Tier1)
G_M44446_IG01:  ;; offset=0000H
       push     rdi
       push     rsi
       push     rbx
       sub      rsp, 32
       mov      rbx, rdx
						;; size=10 bbWeight=1 PerfScore 3.50
G_M44446_IG02:  ;; offset=000AH
       mov      esi, dword ptr [rcx]
       mov      edi, dword ptr [rcx+04H]
       movzx    rdx, byte  ptr [rcx+08H]
       movzx    r8, byte  ptr [rbx+08H]
       mov      rcx, 0x209F1C01D80      ; const ptr
       mov      rcx, gword ptr [rcx]
       call     [System.Collections.Generic.GenericEqualityComparer`1[ubyte]:Equals(ubyte,ubyte):bool:this]
       test     eax, eax
       je       SHORT G_M44446_IG06
						;; size=37 bbWeight=1 PerfScore 14.50
G_M44446_IG03:  ;; offset=002FH
       cmp      esi, dword ptr [rbx]
       jne      SHORT G_M44446_IG06
       mov      r8d, dword ptr [rbx+04H]
       mov      rcx, 0x209F1C01D90      ; const ptr
       mov      rcx, gword ptr [rcx]
       mov      edx, edi
       call     [System.Collections.Generic.GenericEqualityComparer`1[int]:Equals(int,int):bool:this]
						;; size=29 bbWeight=0.50 PerfScore 5.75
G_M44446_IG04:  ;; offset=004CH
       nop      
						;; size=1 bbWeight=1 PerfScore 0.25
G_M44446_IG05:  ;; offset=004DH
       add      rsp, 32
       pop      rbx
       pop      rsi
       pop      rdi
       ret      
						;; size=8 bbWeight=1 PerfScore 2.75
G_M44446_IG06:  ;; offset=0055H
       xor      eax, eax
       jmp      SHORT G_M44446_IG04
						;; size=4 bbWeight=0 PerfScore 0.00

; Total bytes of code 89

Perhaps, the specialized byte comparer had more inline-friendly Equals..

@EgorBo
Copy link
Member

EgorBo commented Jul 11, 2023

[FAILED: recursive DEVIRT] System.Collections.Generic.GenericEqualityComparer`1[ubyte]:Equals(ubyte,ubyte):bool:this

@MichalPetryka
Copy link
Contributor

Before:

; Devirtualization.EqualityComparerFixture`1[[System.ValueTuple`3[[System.Byte, System.Private.CoreLib],[Devirtualization.EqualityComparer+E, MicroBenchmarks],[System.Int32, System.Private.CoreLib]], System.Private.CoreLib]].Compare(System.ValueTuple`3<Byte,E,Int32> ByRef, System.ValueTuple`3<Byte,E,Int32> ByRef)
       sub       rsp,28
       mov       ecx,[rdx]
       mov       eax,[rdx+4]
       movzx     edx,byte ptr [rdx+8]
       mov       r10d,[r8]
       mov       r9d,[r8+4]
       movzx     r8d,byte ptr [r8+8]
       cmp       dl,r8b
       jne       short M01_L01
       cmp       ecx,r10d
       jne       short M01_L01
       mov       rcx,0C7C0001E30
       mov       rcx,[rcx]
       mov       edx,eax
       mov       r8d,r9d
       call      qword ptr [7FFA767517E8]; System.Collections.Generic.GenericEqualityComparer`1[[System.Int32, System.Private.CoreLib]].Equals(Int32, Int32)
M01_L00:
       nop
       add       rsp,28
       ret
M01_L01:
       xor       eax,eax
       jmp       short M01_L00
; Total bytes of code 69

After:

; Devirtualization.EqualityComparerFixture`1[[System.ValueTuple`3[[System.Byte, System.Private.CoreLib],[Devirtualization.EqualityComparer+E, MicroBenchmarks],[System.Int32, System.Private.CoreLib]], System.Private.CoreLib]].Compare(System.ValueTuple`3<Byte,E,Int32> ByRef, System.ValueTuple`3<Byte,E,Int32> ByRef)
       push      rdi
       push      rsi
       push      rbp
       push      rbx
       sub       rsp,28
       mov       ebx,[rdx]
       mov       esi,[rdx+4]
       movzx     edx,byte ptr [rdx+8]
       mov       edi,[r8]
       mov       ebp,[r8+4]
       movzx     r8d,byte ptr [r8+8]
       mov       rcx,0F521001F00
       mov       rcx,[rcx]
       call      qword ptr [7FFA76B8FDC0]; System.Collections.Generic.GenericEqualityComparer`1[[System.Byte, System.Private.CoreLib]].Equals(Byte, Byte)
       test      eax,eax
       je        short M01_L01
       cmp       ebx,edi
       jne       short M01_L01
       mov       rcx,0F521001E30
       mov       rcx,[rcx]
       mov       edx,esi
       mov       r8d,ebp
       call      qword ptr [7FFA76761B10]; System.Collections.Generic.GenericEqualityComparer`1[[System.Int32, System.Private.CoreLib]].Equals(Int32, Int32)
M01_L00:
       nop
       add       rsp,28
       pop       rbx
       pop       rbp
       pop       rsi
       pop       rdi
       ret
M01_L01:
       xor       eax,eax
       jmp       short M01_L00
; Total bytes of code 94

@MichalPetryka
Copy link
Contributor

Should I restore ByteEqualityComparer or do we want to look into the inlining block here?

[FAILED: recursive DEVIRT] System.Collections.Generic.GenericEqualityComparer`1[ubyte]:Equals(ubyte,ubyte):bool:this

I think that this recursion check should be changed to only block on the same generic instantiation.

@AndyAyersMS
Copy link
Member

I think that this recursion check should be changed to only block on the same generic instantiation.

Yes, this is caused by a variation of #58824: the IL is the same but the method is a different instantiation.

I will look into fixing that. It may not be very surgical though.

@jkotas jkotas added area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI and removed needs-area-label An area label is needed to ensure this gets routed to the appropriate area owners labels Jul 12, 2023
@ghost
Copy link

ghost commented Jul 12, 2023

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

Issue Details

Run Information

Name Value
Architecture x64
OS Windows 10.0.19042
Queue OwlWindows
Baseline e3ae9042413a0a43e13e4272f7d8fb5d977edceb
Compare 9ea317f17d1ef5988921f611f80834d15a3e8070
Diff Diff
Configs CompilationMode:tiered, RunKind:micro

Regressions in Devirtualization.EqualityComparer

Benchmark Baseline Test Test/Base Test Quality Edge Detector Baseline IR Compare IR IR Ratio
ValueTupleCompare - Duration of single invocation 1.84 ns 3.84 ns 2.08 0.01 True
ValueTupleCompareNoOpt - Duration of single invocation 4.47 ns 6.09 ns 1.36 0.04 True
ValueTupleCompareCached - Duration of single invocation 3.12 ns 4.34 ns 1.39 0.20 False
ValueTupleCompareWrapped - Duration of single invocation 1.86 ns 3.81 ns 2.05 0.16 False

graph
graph
graph
graph
Test Report

Repro

General Docs link: https://github.com/dotnet/performance/blob/main/docs/benchmarking-workflow-dotnet-runtime.md

git clone https://github.com/dotnet/performance.git
py .\performance\scripts\benchmarks_ci.py -f net8.0 --filter 'Devirtualization.EqualityComparer*'

Payloads

Baseline
Compare

Devirtualization.EqualityComparer.ValueTupleCompare

ETL Files

Histogram


Description of detection logic

IsRegressionBase: Marked as regression because the compare was 5% greater than the baseline, and the value was not too small.
IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsRegressionBase: Marked as regression because the compare was 5% greater than the baseline, and the value was not too small.
IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsRegressionWindowed: Marked as regression because 3.843112840283866 > 2.2906849067852604.
IsChangePoint: Marked as a change because one of 5/19/2023 10:30:38 AM, 7/5/2023 3:16:33 PM, 7/10/2023 4:47:56 PM falls between 7/1/2023 10:14:52 PM and 7/10/2023 4:47:56 PM.
IsRegressionStdDev: Marked as regression because -57.42751590463879 (T) = (0 -3.8374712675164275) / Math.Sqrt((0.026791380736852954 / (26)) + (1.1981683562958218E-05 / (15))) is less than -2.0226909200346674 = MathNet.Numerics.Distributions.StudentT.InvCDF(0, 1, (26) + (15) - 2, .025) and -0.92517646236273 = (1.9933088433913102 - 3.8374712675164275) / 1.9933088433913102 is less than -0.05.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsChangeEdgeDetector: Marked as regression because Edge Detector said so.

JIT Disasms

Devirtualization.EqualityComparer.ValueTupleCompareNoOpt

ETL Files

Histogram


Description of detection logic

IsRegressionBase: Marked as regression because the compare was 5% greater than the baseline, and the value was not too small.
IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsRegressionBase: Marked as regression because the compare was 5% greater than the baseline, and the value was not too small.
IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsRegressionWindowed: Marked as regression because 6.092543341559851 > 4.704558109630318.
IsChangePoint: Marked as a change because one of 7/5/2023 3:16:33 PM, 7/10/2023 4:47:56 PM falls between 7/1/2023 10:14:52 PM and 7/10/2023 4:47:56 PM.
IsRegressionStdDev: Marked as regression because -848.1624026883707 (T) = (0 -6.094328851821734) / Math.Sqrt((5.678715287955347E-05 / (26)) + (2.235689394598058E-05 / (15))) is less than -2.0226909200346674 = MathNet.Numerics.Distributions.StudentT.InvCDF(0, 1, (26) + (15) - 2, .025) and -0.36385144554699234 = (4.4684696942030335 - 6.094328851821734) / 4.4684696942030335 is less than -0.05.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsChangeEdgeDetector: Marked as regression because Edge Detector said so.

JIT Disasms

Devirtualization.EqualityComparer.ValueTupleCompareCached

ETL Files

Histogram


Description of detection logic

IsRegressionBase: Marked as regression because the compare was 5% greater than the baseline, and the value was not too small.
IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsRegressionBase: Marked as regression because the compare was 5% greater than the baseline, and the value was not too small.
IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsRegressionWindowed: Marked as regression because 4.340094943627221 > 2.9171170060329317.
IsChangePoint: Marked as a change because one of 5/23/2023 1:41:12 PM, 7/5/2023 3:16:33 PM, 7/10/2023 4:47:56 PM falls between 7/1/2023 10:14:52 PM and 7/10/2023 4:47:56 PM.
IsRegressionStdDev: Marked as regression because -33.57170136745841 (T) = (0 -4.339886342672489) / Math.Sqrt((0.04238543685962824 / (26)) + (6.660613160837092E-06 / (15))) is less than -2.0226909200346674 = MathNet.Numerics.Distributions.StudentT.InvCDF(0, 1, (26) + (15) - 2, .025) and -0.4542803144749973 = (2.984215834785064 - 4.339886342672489) / 2.984215834785064 is less than -0.05.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsChangeEdgeDetector: Marked not as a regression because Edge Detector said so.

JIT Disasms

Devirtualization.EqualityComparer.ValueTupleCompareWrapped

ETL Files

Histogram


Description of detection logic

IsRegressionBase: Marked as regression because the compare was 5% greater than the baseline, and the value was not too small.
IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsRegressionBase: Marked as regression because the compare was 5% greater than the baseline, and the value was not too small.
IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsRegressionWindowed: Marked as regression because 3.8107148712347003 > 2.5720030080921883.
IsChangePoint: Marked as a change because one of 5/19/2023 10:55:27 PM, 7/1/2023 6:36:20 PM, 7/5/2023 3:16:33 PM, 7/10/2023 4:47:56 PM falls between 7/1/2023 10:14:52 PM and 7/10/2023 4:47:56 PM.
IsRegressionStdDev: Marked as regression because -26.814634495440476 (T) = (0 -3.81425130162482) / Math.Sqrt((0.10037157665979843 / (26)) + (1.4754199600727505E-05 / (15))) is less than -2.0226909200346674 = MathNet.Numerics.Distributions.StudentT.InvCDF(0, 1, (26) + (15) - 2, .025) and -0.7757393334723831 = (2.1479792837421767 - 3.81425130162482) / 2.1479792837421767 is less than -0.05.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsChangeEdgeDetector: Marked not as a regression because Edge Detector said so.

JIT Disasms

Docs

Profiling workflow for dotnet/runtime repository
Benchmarking workflow for dotnet/runtime repository

Author: performanceautofiler[bot]
Assignees: -
Labels:

os-windows, arch-x64, area-CodeGen-coreclr, untriaged, runtime-coreclr, PGO, needs-area-label

Milestone: -

@AndyAyersMS AndyAyersMS self-assigned this Jul 12, 2023
@AndyAyersMS AndyAyersMS removed the untriaged New issue has not been triaged by the area owner label Jul 12, 2023
AndyAyersMS added a commit to AndyAyersMS/runtime that referenced this issue Jul 12, 2023
The existing check was too conservative, and blocked inlines of one instantation
of a generic method into a different instantiation of the same method, or of two
different methods that share the exact same IL stream.

Generalize the check to also compare the method handle and runtime context.

Fixes dotnet#88667
Fixes dotnet#58824
@ghost ghost added the in-pr There is an active PR which will close this issue when it is merged label Jul 12, 2023
AndyAyersMS added a commit that referenced this issue Jul 12, 2023
The existing check was too conservative, and blocked inlines of one instantation
of a generic method into a different instantiation of the same method, or of two
different methods that share the exact same IL stream.

Generalize the check to also compare the method handle and runtime context.

Fixes #88667
Fixes #58824
@ghost ghost removed the in-pr There is an active PR which will close this issue when it is merged label Jul 12, 2023
@AndyAyersMS
Copy link
Member

image

@ghost ghost locked as resolved and limited conversation to collaborators Aug 13, 2023
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
arch-x64 area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI os-windows PGO runtime-coreclr specific to the CoreCLR runtime
Projects
None yet
Development

Successfully merging a pull request may close this issue.

5 participants