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の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を参照してください)。 。

カテゴリ:cq
テーマ:最適化
スキルレベル:中級
費用:中

area-CodeGen-coreclr optimization

最も参考になるコメント

@jkotas簡単なプロトタイプを作成し、jit-diffがBCLの数kbの差分を見つけました(例: https ://github.com/dotnet/corefx/blob/master/src/System.Data.Common/src/System/Data)

UPD:ええと、 pmiがそれを飲んでいたようで、現実の世界では起こりません。

全てのコメント3件

人々が実際にこのパターンを使用しているかどうかはわかりませんが

パターンの最適化を追加する意味はありませんが、実際のコードには表示されません。

@jkotas簡単なプロトタイプを作成し、jit-diffがBCLの数kbの差分を見つけました(例: https ://github.com/dotnet/corefx/blob/master/src/System.Data.Common/src/System/Data)

UPD:ええと、 pmiがそれを飲んでいたようで、現実の世界では起こりません。

これは実際のコードでは発生しないと予想されるため、実際の動機付けの例が表示されるまで、これを閉じます。

このページは役に立ちましたか?
0 / 5 - 0 評価