Runtime: JIT: Otimizar boxing(x) == boxing(y) para false.

Criado em 23 nov. 2019  ·  3Comentários  ·  Fonte: 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 para 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
+--* CAIXA ref
| --* LCL_VAR ref V03 tmp1
--* CAIXA ref
--* LCL_VAR ref V04 tmp2

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

Não tenho certeza se as pessoas realmente usam esse padrão. Mas deve ser uma correção simples porque o CoreCLR já otimiza o boxe para casos semelhantes (por exemplo boxing(x) == null para false etc, consulte https://github.com/mono/mono/issues/17858 para links) .

categoria: cq
tema: otimização
nível de habilidade: intermediário
custo: médio

area-CodeGen-coreclr optimization

Comentários muito úteis

@jkotas Fiz um protótipo rápido e o jit-diff encontrou alguns kb diff para BCL, por exemplo https://github.com/dotnet/corefx/blob/master/src/System.Data.Common/src/System/Data /RbTree.cs#L1581

UPD: bem, parece que pmi estava usando e não vai acontecer no mundo real.

Todos 3 comentários

Não tenho certeza se as pessoas realmente usam esse padrão

Não faz sentido adicionar otimizações para padrões do que nunca aparecer no código do mundo real....

@jkotas Fiz um protótipo rápido e o jit-diff encontrou alguns kb diff para BCL, por exemplo https://github.com/dotnet/corefx/blob/master/src/System.Data.Common/src/System/Data /RbTree.cs#L1581

UPD: bem, parece que pmi estava usando e não vai acontecer no mundo real.

Dada a expectativa de que isso não ocorra no código do mundo real, vou fechar isso até vermos um exemplo motivador do mundo real.

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

sahithreddyk picture sahithreddyk  ·  3Comentários

omajid picture omajid  ·  3Comentários

nalywa picture nalywa  ·  3Comentários

bencz picture bencz  ·  3Comentários

noahfalk picture noahfalk  ·  3Comentários