static bool Generic<T1, T2>(T1 a, T2 b)
{
return (object)a == (object)b;
}
static bool Test()
{
return Generic(42, 3.14);
}
Kodegen untuk 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 ke
+--* BOX ref
| --* LCL_VAR ref V03 tmp1
--* BOX ref
--* LCL_VAR ref V04 tmp2
Expected codegen:
```asm
; Method Program:Test():bool
xor eax, eax ; return false
ret
Tidak yakin apakah orang benar-benar menggunakan pola ini. Tetapi harus menjadi perbaikan sederhana karena CoreCLR sudah mengoptimalkan tinju untuk kasus serupa (misalnya boxing(x) == null
hingga false
dll, lihat https://github.com/mono/mono/issues/17858 untuk tautan) .
kategori:cq
tema: pengoptimalan
tingkat keahlian: menengah
biaya: sedang
Tidak yakin apakah orang benar-benar menggunakan pola ini
Tidak ada gunanya menambahkan pengoptimalan untuk pola daripada tidak pernah muncul dalam kode dunia nyata....
@jkotas Saya membuat prototipe cepat dan jit-diff menemukan beberapa perbedaan kb untuk BCL, misalnya https://github.com/dotnet/corefx/blob/master/src/System.Data.Common/src/System/Data /RbTree.cs#L1581
UPD: yah, sepertinya pmi
sedang melakukannya dan tidak akan terjadi di dunia nyata.
Mengingat harapan bahwa ini tidak terjadi dalam kode dunia nyata, saya akan menutup ini sampai kita melihat contoh motivasi dunia nyata.
Komentar yang paling membantu
@jkotas Saya membuat prototipe cepat dan jit-diff menemukan beberapa perbedaan kb untuk BCL, misalnya https://github.com/dotnet/corefx/blob/master/src/System.Data.Common/src/System/Data /RbTree.cs#L1581
UPD: yah, sepertinya
pmi
sedang melakukannya dan tidak akan terjadi di dunia nyata.