static bool Generic<T1, T2>(T1 a, T2 b)
{
return (object)a == (object)b;
}
static bool Test()
{
return Generic(42, 3.14);
}
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 整数
+--* 框参考
| --* LCL_VAR 参考 V03 tmp1
--* 框参考
--* LCL_VAR 参考 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 /RbTree.cs#L1581
UPD:嗯,似乎是pmi
正在处理它,并且不会在现实世界中发生。
考虑到这不会发生在现实世界的代码中,我将关闭它,直到我们看到一个现实世界的激励示例。
最有用的评论
@jkotas我做了一个快速原型,jit-diff 为 BCL 找到了几 kb 的差异,例如https://github.com/dotnet/corefx/blob/master/src/System.Data.Common/src/System/Data /RbTree.cs#L1581
UPD:嗯,似乎是
pmi
正在处理它,并且不会在现实世界中发生。