Skip to content

[Perf] Burgers.Test3 Regression on x64 #49071

Description

@alexcovington

Description

The Burgers.Test3 scenario from dotnet/performance is regressing in 6.0. I can reproduce by running the following after cloning dotnet/performance:

$ py scripts\benchmarks_ci.py -c Release -f netcoreapp5.0 net6.0 --filter Burgers.Test3

Configuration

Configuration below in Data.

Regression?

Regression from .NET 5.0 -> .NET 6.0.

Data

AMD Ryzen 7 5800

.NET 5.0 Results

// * Summary *

BenchmarkDotNet=v0.12.1.1466-nightly, OS=Windows 10.0.19041.804 (2004/May2020Update/20H1)
AMD Ryzen 7 5800, 1 CPU, 16 logical and 8 physical cores
.NET SDK=6.0.100-preview.3.21153.9
  [Host]     : .NET 5.0.3 (5.0.321.7212), X64 RyuJIT
  Job-TDIWMD : .NET 5.0.3 (5.0.321.7212), X64 RyuJIT

 PowerPlanMode=00000000-0000-0000-0000-000000000000  Arguments=/p:DebugType=portable  IterationTime=250.0000 ms
 MaxIterationCount=20  MinIterationCount=15  WarmupCount=1
 |    Method |     Mean |    Error |   StdDev |   Median |      Min |      Max | Gen 0 | Gen 1 | Gen 2 | Allocated |
 |---------- |---------:|---------:|---------:|---------:|---------:|---------:|------:|------:|------:|----------:|
 | Burgers_3 | 87.11 ms | 0.200 ms | 0.167 ms | 87.15 ms | 86.82 ms | 87.44 ms |     - |     - |     - |    156 KB |

.NET 6.0 Results

// * Summary *

BenchmarkDotNet=v0.12.1.1466-nightly, OS=Windows 10.0.19041.804 (2004/May2020Update/20H1)
AMD Ryzen 7 5800, 1 CPU, 16 logical and 8 physical cores
.NET SDK=6.0.100-preview.3.21153.9
[Host]     : .NET 6.0.0 (6.0.21.15201), X64 RyuJIT
Job-HJLOTG : .NET 6.0.0 (6.0.21.15201), X64 RyuJIT

PowerPlanMode=00000000-0000-0000-0000-000000000000  Arguments=/p:DebugType=portable  IterationTime=250.0000 ms
MaxIterationCount=20  MinIterationCount=15  WarmupCount=1

|    Method |    Mean |    Error |   StdDev |  Median |     Min |     Max | Gen 0 | Gen 1 | Gen 2 | Allocated |
|---------- |--------:|---------:|---------:|--------:|--------:|--------:|------:|------:|------:|----------:|
| Burgers_3 | 1.443 s | 0.0050 s | 0.0047 s | 1.442 s | 1.438 s | 1.455 s |     - |     - |     - |    156 KB |
Intel i9 10900k

.NET 5.0

// * Summary *
 
BenchmarkDotNet=v0.12.1.1466-nightly, OS=Windows 10.0.19042
Intel Core i9-10900K CPU 3.70GHz, 1 CPU, 20 logical and 10 physical cores
.NET SDK=6.0.100-preview.3.21153.9
   [Host]     : .NET 5.0.3 (5.0.321.7212), X64 RyuJIT
   Job-QBUPZJ : .NET 5.0.3 (5.0.321.7212), X64 RyuJIT
 
PowerPlanMode=00000000-0000-0000-0000-000000000000  Arguments=/p:DebugType=portable  IterationTime=250.0000 ms
MaxIterationCount=20  MinIterationCount=15  WarmupCount=1
 
|    Method |     Mean |   Error |  StdDev |   Median |      Min |      Max | Gen 0 | Gen 1 | Gen 2 | Allocated |
|---------- |---------:|--------:|--------:|---------:|---------:|---------:|------:|------:|------:|----------:|
| Burgers_3 | 117.2 ms | 1.50 ms | 1.25 ms | 117.2 ms | 116.1 ms | 120.2 ms |     - |     - |     - |    159 KB |

.NET 6.0

// * Summary *
 
BenchmarkDotNet=v0.12.1.1466-nightly, OS=Windows 10.0.19042
Intel Core i9-10900K CPU 3.70GHz, 1 CPU, 20 logical and 10 physical cores
.NET SDK=6.0.100-preview.3.21153.9
  [Host]     : .NET 6.0.0 (6.0.21.15201), X64 RyuJIT
  Job-JFEUYZ : .NET 6.0.0 (6.0.21.15201), X64 RyuJIT
 
PowerPlanMode=00000000-0000-0000-0000-000000000000  Arguments=/p:DebugType=portable  IterationTime=250.0000 ms
MaxIterationCount=20  MinIterationCount=15  WarmupCount=1
 
|    Method |    Mean |    Error |   StdDev |  Median |     Min |     Max | Gen 0 | Gen 1 | Gen 2 | Allocated |
|---------- |--------:|---------:|---------:|--------:|--------:|--------:|------:|------:|------:|----------:|
| Burgers_3 | 1.450 s | 0.0006 s | 0.0005 s | 1.450 s | 1.449 s | 1.451 s |     - |     - |     - |    156 KB |

Analysis

This looks to be a SIMD issue of some kind, but I'm not exactly sure where the issue is. The following analysis was done on the Ryzen 7 machine but holds true for both machines I tested on.

I collected some ETW traces and found that the benchmark was spending most of its time in the GetCalculated3 method, which looks like this:

private static double[] GetCalculated3(int nt, int nx, double dx, double dt, double nu, double[] initial)
    {
        var nx2 = nx + (Vector<double>.Count - (nx % Vector<double>.Count));

        double[] u = new double[nx2];
        double[] un = new double[nx2];
        Array.Copy(initial, un, initial.Length);

        double factor = Math.Pow(nu * dt / dx, 2.0);

        for (int tStep = 0; tStep < nt; tStep++)
        {
            for (int i = 1; i < nx2 - Vector<double>.Count + 1; i += Vector<double>.Count)
            {
                var vectorIn0 = new Vector<double>(un, i);
                var vectorInPrev = new Vector<double>(un, i - 1);
                var vectorInNext = new Vector<double>(un, i + 1);

                var vectorOut = vectorIn0 - vectorIn0 * (dt / dx) * (vectorIn0 - vectorInPrev) + factor *
                    (vectorInNext - 2.0 * vectorIn0 + vectorInPrev);

                vectorOut.CopyTo(u, i);
            }

            u[0] = un[0] - un[0] * dt / dx * (un[0] - un[nx - 1]) + factor *
                        (un[1] - 2 * un[0] + un[nx - 1]);

            u[nx - 1] = un[nx - 1] - un[nx - 1] * dt / dx * (un[nx - 1] - un[nx - 2]) + factor *
                        (un[0] - 2 * un[nx - 1] + un[nx - 2]);

            double[] swap = u;
            u = un;
            un = swap;
        }

        return un;
    }

Lots of vectorization, so I had BDN generate the disassembly for both .NET 5.0 and 6.0 to see if the issue was with codegen.

BDN Disassembly

.NET 5.0.3 (5.0.321.7212), X64 RyuJIT

; Burgers.Test3()
       sub       rsp,38
       vzeroupper
       vmovsd    xmm2,qword ptr [7FFDE628E770]
       vmovsd    qword ptr [rsp+20],xmm2
       mov       rdx,[rcx+10]
       mov       [rsp+28],rdx
       vmovsd    xmm2,qword ptr [rcx+18]
       vmovsd    xmm3,qword ptr [rcx+20]
       mov       ecx,4E20
       mov       edx,2711
       call      Burgers.GetCalculated3(Int32, Int32, Double, Double, Double, Double[])
       nop
       add       rsp,38
       ret
; Total bytes of code 61
; Burgers.GetCalculated3(Int32, Int32, Double, Double, Double, Double[])
       push      r15
       push      r14
       push      r12
       push      rdi
       push      rsi
       push      rbp
       push      rbx
       sub       rsp,50
       vzeroupper
       vmovaps   [rsp+40],xmm6
       vmovaps   [rsp+30],xmm7
       vmovaps   [rsp+20],xmm8
       mov       edi,ecx
       mov       esi,edx
       vmovaps   xmm6,xmm2
       vmovaps   xmm7,xmm3
       mov       rbx,[rsp+0B8]
       mov       edx,esi
       sar       edx,1F
       and       edx,3
       add       edx,esi
       and       edx,0FFFFFFFC
       mov       ecx,esi
       sub       ecx,edx
       mov       edx,ecx
       neg       edx
       lea       ebp,[rdx+rsi+4]
       movsxd    rdx,ebp
       mov       rcx,offset MT_System.Double[]
       call      CORINFO_HELP_NEWARR_1_VC
       mov       r14,rax
       movsxd    rdx,ebp
       mov       rcx,offset MT_System.Double[]
       call      CORINFO_HELP_NEWARR_1_VC
       mov       r15,rax
       mov       r8d,[rbx+8]
       mov       rcx,rbx
       mov       rdx,r15
       call      System.Array.Copy(System.Array, System.Array, Int32)
       vmulsd    xmm0,xmm7,qword ptr [rsp+0B0]
       vdivsd    xmm0,xmm0,xmm6
       vmovsd    xmm1,qword ptr [7FFDE6281AD8]
       call      System.Math.Pow(Double, Double)
       xor       edx,edx
       test      edi,edi
       jle       near ptr M01_L03
       add       ebp,0FFFFFFFD
       lea       eax,[rsi+0FFFF]
       movsxd    rcx,eax
       add       esi,0FFFFFFFE
       movsxd    r8,esi
M01_L00:
       mov       r9d,1
       cmp       ebp,1
       jle       near ptr M01_L02
       mov       r10d,[r15+8]
       vdivsd    xmm1,xmm7,xmm6
M01_L01:
       cmp       r9d,r10d
       jae       near ptr M01_L05
       lea       ebx,[r9+3]
       cmp       ebx,r10d
       jae       near ptr M01_L05
       vmovupd   ymm2,[r15+r9*8+10]
       lea       r11d,[r9+0FFFF]
       cmp       r11d,r10d
       jae       near ptr M01_L05
       lea       r12d,[r9+2]
       cmp       r12d,r10d
       jae       near ptr M01_L05
       vmovupd   ymm3,[r15+r11*8+10]
       lea       r11d,[r9+1]
       cmp       r11d,r10d
       jae       near ptr M01_L05
       lea       r12d,[r9+4]
       cmp       r12d,r10d
       jae       near ptr M01_L05
       vmovupd   ymm4,[r15+r11*8+10]
       vbroadcastsd ymm5,xmm1
       vmulpd    ymm5,ymm5,ymm2
       vsubpd    ymm8,ymm2,ymm3
       vmulpd    ymm5,ymm5,ymm8
       vsubpd    ymm5,ymm2,ymm5
       vbroadcastsd ymm8,qword ptr [7FFDE6281AE8]
       vmulpd    ymm2,ymm8,ymm2
       vsubpd    ymm2,ymm4,ymm2
       vaddpd    ymm2,ymm2,ymm3
       vbroadcastsd ymm3,xmm0
       vmulpd    ymm2,ymm3,ymm2
       vaddpd    ymm2,ymm5,ymm2
       mov       r11d,[r14+8]
       cmp       r9d,r11d
       jae       near ptr M01_L06
       cmp       ebx,r11d
       jae       near ptr M01_L07
       vmovupd   [r14+r9*8+10],ymm2
       mov       r9d,r12d
       cmp       r9d,ebp
       jl        near ptr M01_L01
M01_L02:
       mov       r10d,[r15+8]
       cmp       r10d,0
       jbe       near ptr M01_L05
       vmovsd    xmm1,qword ptr [r15+10]
       vmulsd    xmm2,xmm1,xmm7
       vdivsd    xmm2,xmm2,xmm6
       cmp       eax,r10d
       jae       near ptr M01_L05
       vmovsd    xmm3,qword ptr [r15+rcx*8+10]
       vsubsd    xmm4,xmm1,xmm3
       vmulsd    xmm2,xmm2,xmm4
       vsubsd    xmm2,xmm1,xmm2
       cmp       r10d,1
       jbe       near ptr M01_L05
       vmovsd    xmm4,qword ptr [r15+18]
       vmulsd    xmm1,xmm1,qword ptr [7FFDE6281AF8]
       vsubsd    xmm1,xmm4,xmm1
       vaddsd    xmm1,xmm1,xmm3
       vmulsd    xmm1,xmm1,xmm0
       vaddsd    xmm1,xmm2,xmm1
       mov       r11d,[r14+8]
       cmp       r11d,0
       jbe       near ptr M01_L05
       vmovsd    qword ptr [r14+10],xmm1
       vmovsd    xmm1,qword ptr [r15+rcx*8+10]
       vmulsd    xmm2,xmm1,xmm7
       vdivsd    xmm2,xmm2,xmm6
       cmp       esi,r10d
       jae       near ptr M01_L05
       vmovsd    xmm3,qword ptr [r15+r8*8+10]
       vsubsd    xmm4,xmm1,xmm3
       vmulsd    xmm2,xmm2,xmm4
       vsubsd    xmm2,xmm1,xmm2
       vaddsd    xmm1,xmm1,xmm1
       vmovsd    xmm4,qword ptr [r15+10]
       vsubsd    xmm1,xmm4,xmm1
       vaddsd    xmm1,xmm1,xmm3
       vmulsd    xmm1,xmm1,xmm0
       vaddsd    xmm1,xmm2,xmm1
       cmp       eax,r11d
       jae       short M01_L05
       vmovsd    qword ptr [r14+rcx*8+10],xmm1
       inc       edx
       cmp       edx,edi
       jl        short M01_L04
       mov       r15,r14
M01_L03:
       mov       rax,r15
       vmovaps   xmm6,[rsp+40]
       vmovaps   xmm7,[rsp+30]
       vmovaps   xmm8,[rsp+20]
       vzeroupper
       add       rsp,50
       pop       rbx
       pop       rbp
       pop       rsi
       pop       rdi
       pop       r12
       pop       r14
       pop       r15
       ret
M01_L04:
       xchg      r14,r15
       jmp       near ptr M01_L00
M01_L05:
       call      CORINFO_HELP_RNGCHKFAIL
M01_L06:
       call      CORINFO_HELP_THROW_ARGUMENTOUTOFRANGEEXCEPTION
M01_L07:
       call      CORINFO_HELP_THROW_ARGUMENTEXCEPTION
       int       3
; Total bytes of code 672

.NET 6.0.0 (6.0.21.15201), X64 RyuJIT

; Burgers.Test3()
       push      rbp
       sub       rsp,30
       vzeroupper
       lea       rbp,[rsp+30]
       mov       [rbp+10],rcx
       vmovsd    xmm2,qword ptr [7FFDE8B4C1F8]
       vmovsd    qword ptr [rsp+20],xmm2
       mov       rcx,[rbp+10]
       mov       rcx,[rcx+10]
       mov       [rsp+28],rcx
       mov       rcx,[rbp+10]
       vmovsd    xmm2,qword ptr [rcx+18]
       mov       rcx,[rbp+10]
       vmovsd    xmm3,qword ptr [rcx+20]
       mov       ecx,4E20
       mov       edx,2711
       call      Burgers.GetCalculated3(Int32, Int32, Double, Double, Double, Double[])
       nop
       lea       rsp,[rbp]
       pop       rbp
       ret
; Total bytes of code 84
; Burgers.GetCalculated3(Int32, Int32, Double, Double, Double, Double[])
       push      r15
       push      r14
       push      rdi
       push      rsi
       push      rbp
       push      rbx
       sub       rsp,148
       vzeroupper
       vmovaps   [rsp+130],xmm6
       vmovaps   [rsp+120],xmm7
       vmovaps   [rsp+110],xmm8
       vmovaps   [rsp+100],xmm9
       vmovaps   [rsp+0F0],xmm10
       vxorps    xmm4,xmm4,xmm4
       vmovdqa   xmmword ptr [rsp+40],xmm4
       mov       rax,0FFFFFFFFFF70
M01_L00:
       vmovdqa   xmmword ptr [rsp+rax+0E0],xmm4
       vmovdqa   xmmword ptr [rsp+rax+0F0],xmm4
       vmovdqa   xmmword ptr [rsp+rax+100],xmm4
       add       rax,30
       jne       short M01_L00
       mov       edi,ecx
       mov       esi,edx
       vmovaps   xmm6,xmm2
       vmovaps   xmm7,xmm3
       mov       rbx,[rsp+1A8]
       mov       edx,esi
       sar       edx,1F
       and       edx,3
       add       edx,esi
       and       edx,0FFFFFFFC
       mov       ecx,esi
       sub       ecx,edx
       mov       edx,ecx
       neg       edx
       lea       ebp,[rdx+rsi+4]
       movsxd    rdx,ebp
       mov       rcx,offset MT_System.Double[]
       call      CORINFO_HELP_NEWARR_1_VC
       mov       r14,rax
       movsxd    rdx,ebp
       mov       rcx,offset MT_System.Double[]
       call      CORINFO_HELP_NEWARR_1_VC
       mov       r15,rax
       mov       r8d,[rbx+8]
       mov       rcx,rbx
       mov       rdx,r15
       call      System.Array.Copy(System.Array, System.Array, Int32)
       vmulsd    xmm0,xmm7,qword ptr [rsp+1A0]
       vdivsd    xmm0,xmm0,xmm6
       vmovsd    xmm8,qword ptr [7FFDE8B4C8B8]
       vmovaps   xmm1,xmm8
       call      System.Math.Pow(Double, Double)
       xor       edx,edx
       test      edi,edi
       jle       near ptr M01_L07
M01_L01:
       mov       eax,1
       lea       ecx,[rbp+0FFFD]
       cmp       ecx,1
       jle       near ptr M01_L06
M01_L02:
       mov       r8d,[r15+8]
       cmp       eax,r8d
       jae       near ptr M01_L09
       lea       r9d,[rax+3]
       cmp       r9d,r8d
       jae       near ptr M01_L09
       vmovupd   ymm1,[r15+rax*8+10]
       lea       r10d,[rax+0FFFF]
       cmp       r10d,r8d
       jae       near ptr M01_L09
       lea       r11d,[rax+2]
       cmp       r11d,r8d
       jae       near ptr M01_L09
       vmovupd   ymm2,[r15+r10*8+10]
       lea       r10d,[rax+1]
       cmp       r10d,r8d
       jae       near ptr M01_L09
       lea       r11d,[rax+4]
       cmp       r11d,r8d
       jae       near ptr M01_L09
       vmovupd   ymm3,[r15+r10*8+10]
       vmovaps   ymm4,ymm1
       vmovupd   [rsp+0A0],ymm4
       vxorps    ymm5,ymm5,ymm5
       vmovupd   [rsp+0C0],ymm5
       xor       r10d,r10d
       vdivsd    xmm9,xmm7,xmm6
M01_L03:
       lea       r8,[rsp+0A0]
       vmovsd    xmm10,qword ptr [r8+r10*8]
       vmulsd    xmm10,xmm9,xmm10
       lea       r8,[rsp+0C0]
       vmovsd    qword ptr [r8+r10*8],xmm10
       inc       r10
       cmp       r10,4
       jl        short M01_L03
       vmovupd   ymm9,[rsp+0C0]
       vsubpd    ymm4,ymm4,ymm2
       vmulpd    ymm4,ymm9,ymm4
       vsubpd    ymm4,ymm1,ymm4
       vmovupd   [rsp+60],ymm1
       vmovupd   [rsp+80],ymm5
       xor       r8d,r8d
M01_L04:
       lea       r10,[rsp+60]
       vmovsd    xmm1,qword ptr [r10+r8*8]
       vaddsd    xmm1,xmm1,xmm1
       lea       r10,[rsp+80]
       vmovsd    qword ptr [r10+r8*8],xmm1
       inc       r8
       cmp       r8,4
       jl        short M01_L04
       vmovupd   ymm1,[rsp+80]
       vsubpd    ymm1,ymm3,ymm1
       vaddpd    ymm1,ymm1,ymm2
       vmovupd   [rsp+20],ymm1
       vmovupd   [rsp+40],ymm5
       xor       r8d,r8d
M01_L05:
       lea       r10,[rsp+20]
       vmovsd    xmm1,qword ptr [r10+r8*8]
       vmulsd    xmm1,xmm1,xmm0
       lea       r10,[rsp+40]
       vmovsd    qword ptr [r10+r8*8],xmm1
       inc       r8
       cmp       r8,4
       jl        short M01_L05
       vmovupd   ymm1,[rsp+40]
       vaddpd    ymm1,ymm4,ymm1
       mov       r8d,[r14+8]
       cmp       eax,r8d
       jae       near ptr M01_L10
       cmp       r9d,r8d
       jae       near ptr M01_L11
       vmovupd   [r14+rax*8+10],ymm1
       mov       eax,r11d
       cmp       eax,ecx
       jl        near ptr M01_L02
M01_L06:
       mov       r8d,[r15+8]
       test      r8d,r8d
       je        near ptr M01_L09
       vmovsd    xmm2,qword ptr [r15+10]
       vmulsd    xmm4,xmm2,xmm7
       vdivsd    xmm1,xmm4,xmm6
       lea       r10d,[rsi+0FFFF]
       cmp       r10d,r8d
       jae       near ptr M01_L09
       movsxd    rax,r10d
       vmovsd    xmm3,qword ptr [r15+rax*8+10]
       vsubsd    xmm5,xmm2,xmm3
       vmulsd    xmm1,xmm1,xmm5
       vsubsd    xmm1,xmm2,xmm1
       cmp       r8d,1
       jbe       near ptr M01_L09
       vmovsd    xmm4,qword ptr [r15+18]
       vmulsd    xmm2,xmm2,xmm8
       vsubsd    xmm2,xmm4,xmm2
       vaddsd    xmm2,xmm2,xmm3
       vmulsd    xmm2,xmm2,xmm0
       vaddsd    xmm1,xmm1,xmm2
       mov       r11d,[r14+8]
       test      r11d,r11d
       je        near ptr M01_L09
       vmovsd    qword ptr [r14+10],xmm1
       vmovsd    xmm1,qword ptr [r15+rax*8+10]
       vmulsd    xmm2,xmm1,xmm7
       vdivsd    xmm2,xmm2,xmm6
       lea       r9d,[rsi+0FFFE]
       cmp       r9d,r8d
       jae       near ptr M01_L09
       movsxd    rcx,r9d
       vmovsd    xmm3,qword ptr [r15+rcx*8+10]
       vsubsd    xmm4,xmm1,xmm3
       vmulsd    xmm2,xmm2,xmm4
       vsubsd    xmm2,xmm1,xmm2
       vmovsd    xmm4,qword ptr [r15+10]
       vmulsd    xmm1,xmm1,xmm8
       vsubsd    xmm1,xmm4,xmm1
       vaddsd    xmm1,xmm1,xmm3
       vmulsd    xmm1,xmm1,xmm0
       vaddsd    xmm1,xmm2,xmm1
       cmp       r10d,r11d
       jae       short M01_L09
       vmovsd    qword ptr [r14+rax*8+10],xmm1
       inc       edx
       cmp       edx,edi
       jl        short M01_L08
       mov       r15,r14
M01_L07:
       mov       rax,r15
       vmovaps   xmm6,[rsp+130]
       vmovaps   xmm7,[rsp+120]
       vmovaps   xmm8,[rsp+110]
       vmovaps   xmm9,[rsp+100]
       vmovaps   xmm10,[rsp+0F0]
       vzeroupper
       add       rsp,148
       pop       rbx
       pop       rbp
       pop       rsi
       pop       rdi
       pop       r14
       pop       r15
       ret
M01_L08:
       xchg      r14,r15
       jmp       near ptr M01_L01
M01_L09:
       call      CORINFO_HELP_RNGCHKFAIL
M01_L10:
       call      CORINFO_HELP_THROW_ARGUMENTOUTOFRANGEEXCEPTION
M01_L11:
       call      CORINFO_HELP_THROW_ARGUMENTEXCEPTION
       int       3
; Total bytes of code 951

There are a few things that jump out to me as possibly causing the regression:

  • Mixing SSE+AVX in the hot loop. The .NET 6.0 dump shows use of both SSE and AVX features in the hot loop and alternates between them. The .NET 5.0 dump seems to be scheduling these a little better and keeping the AVX instructions together and then moving to the SSE instructions. I know that on some CPU architectures switching between these modes can cause a significant perf drop, so I'm wondering if that's what I'm seeing here because that transition happens inside the hot loop.
  • Some kind of alignment issue, although when running the repro and collecting a profile with AMDuProf, I didn't see very many reported misaligned accesses for the duration of the benchmark. I have been having some issues getting AMDuProf to properly collect information on managed stack frames/function calls though, so this may need more investigation.

Please let me know if there is any other information I can provide or if I can clarify any of the above.

Metadata

Metadata

Assignees

Labels

area-CodeGen-coreclrCLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMItenet-performancePerformance related issue

Type

No type

Projects

Status
Done

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions