Runtime: JIT:优化 boxing(x) == boxing(y) 为 false。

创建于 2019-11-23  ·  3评论  ·  资料来源: dotnet/runtime

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) == nullfalse等,有关链接,请参见 https://github.com/mono/mono/issues/17858) .

类别:cq
主题:优化
技能水平:中级
成本:中等

area-CodeGen-coreclr optimization

最有用的评论

@jkotas我做了一个快速原型,jit-diff 为 BCL 找到了几 kb 的差异,例如https://github.com/dotnet/corefx/blob/master/src/System.Data.Common/src/System/Data /RbTree.cs#L1581

UPD:嗯,似乎是pmi正在处理它,并且不会在现实世界中发生。

所有3条评论

不确定人们是否真的使用这种模式

没有必要为模式添加优化,而不是永远不会出现在现实世界的代码中......

@jkotas我做了一个快速原型,jit-diff 为 BCL 找到了几 kb 的差异,例如https://github.com/dotnet/corefx/blob/master/src/System.Data.Common/src/System/Data /RbTree.cs#L1581

UPD:嗯,似乎是pmi正在处理它,并且不会在现实世界中发生。

考虑到这不会发生在现实世界的代码中,我将关闭它,直到我们看到一个现实世界的激励示例。

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

omajid picture omajid  ·  3评论

GitAntoinee picture GitAntoinee  ·  3评论

bencz picture bencz  ·  3评论

jzabroski picture jzabroski  ·  3评论

btecu picture btecu  ·  3评论