static bool Generic<T1, T2>(T1 a, T2 b)
{
return (object)a == (object)b;
}
static bool Test()
{
return Generic(42, 3.14);
}
Test
のCodegen:
; 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
+-* 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
しかし、人々が実際にこのパターンを使用しているかどうかはわかりません。 ただし、CoreCLRはすでに同様のケースのボクシングを最適化しているため、簡単な修正である必要があります(たとえば、 boxing(x) == null
からfalse
など。リンクについてはhttps://github.com/mono/mono/issues/17858を参照してください)。 。
人々が実際にこのパターンを使用しているかどうかはわかりませんが
パターンの最適化を追加する意味はありませんが、実際のコードには表示されません。
@jkotas簡単なプロトタイプを作成し、jit-diffがBCLの数kbの差分を見つけました(例: https ://github.com/dotnet/corefx/blob/master/src/System.Data.Common/src/System/Data)
UPD:ええと、 pmi
がそれを飲んでいたようで、現実の世界では起こりません。
これは実際のコードでは発生しないと予想されるため、実際の動機付けの例が表示されるまで、これを閉じます。
最も参考になるコメント
@jkotas簡単なプロトタイプを作成し、jit-diffがBCLの数kbの差分を見つけました(例: https ://github.com/dotnet/corefx/blob/master/src/System.Data.Common/src/System/Data)
UPD:ええと、
pmi
がそれを飲んでいたようで、現実の世界では起こりません。