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
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.
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.