Runtime: JIT: Optimizar boxeo (x) == boxeo (y) a falso.

Creado en 23 nov. 2019  ·  3Comentarios  ·  Fuente: dotnet/runtime

static bool Generic<T1, T2>(T1 a, T2 b)
{
    return (object)a == (object)b;
}

static bool Test()
{
    return Generic(42, 3.14);
}

Codegen por Test :

; Method Program:Test():bool
G_M11853_IG01:
       push     rsi
       sub      rsp, 32
       vzeroupper 
G_M11853_IG02:
       mov      rcx, 0xD1FFAB1E
       call     CORINFO_HELP_NEWSFAST
       mov      rsi, rax
       mov      dword ptr [rsi+8], 42
       mov      rcx, 0xD1FFAB1E
       call     CORINFO_HELP_NEWSFAST
       vmovsd   xmm0, qword ptr [reloc @RWD00]
       vmovsd   qword ptr [rax+8], xmm0
       cmp      rsi, rax
       sete     al
       movzx    rax, al
G_M11853_IG03:
       add      rsp, 32
       pop      rsi
       ret      
RWD00  dq   40091EB851EB851Fh

```
--* EQ\NE int
+--* Ref. CUADRO
| --* LCL_VAR ref V03 tmp1
--* Ref. CAJA
--* LCL_VAR ref V04 tmp2

Expected codegen:
```asm
; Method Program:Test():bool
       xor      eax, eax  ; return false 
       ret     

Sin embargo, no estoy seguro de si la gente realmente usa este patrón. Pero debería ser una solución simple porque CoreCLR ya optimiza el boxeo para casos similares (por ejemplo boxing(x) == null a false , etc., consulte https://github.com/mono/mono/issues/17858 para ver los enlaces) .

categoría:cq
tema:optimización
nivel de habilidad:intermedio
costo: medio

area-CodeGen-coreclr optimization

Comentario más útil

@jkotas Hice un prototipo rápido y el jit-diff encontró una diferencia de algunos kb para BCL, por ejemplo, https://github.com/dotnet/corefx/blob/master/src/System.Data.Common/src/System/Data /RbTree.cs#L1581

UPD: bueno, parece que pmi lo estaba haciendo y no sucederá en el mundo real.

Todos 3 comentarios

Sin embargo, no estoy seguro de si la gente realmente usa este patrón.

No tiene sentido agregar optimizaciones para patrones que nunca aparecen en el código del mundo real...

@jkotas Hice un prototipo rápido y el jit-diff encontró una diferencia de algunos kb para BCL, por ejemplo, https://github.com/dotnet/corefx/blob/master/src/System.Data.Common/src/System/Data /RbTree.cs#L1581

UPD: bueno, parece que pmi lo estaba haciendo y no sucederá en el mundo real.

Dada la expectativa de que esto no ocurra en el código del mundo real, cerraré esto hasta que veamos un ejemplo motivador del mundo real.

¿Fue útil esta página
0 / 5 - 0 calificaciones