Runtime: JIT: Boxing(x) == Boxing(y) auf false optimieren.

Erstellt am 23. Nov. 2019  ·  3Kommentare  ·  Quelle: dotnet/runtime

static bool Generic<T1, T2>(T1 a, T2 b)
{
    return (object)a == (object)b;
}

static bool Test()
{
    return Generic(42, 3.14);
}

Codegen für 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 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     

Ich bin mir jedoch nicht sicher, ob die Leute dieses Muster tatsächlich verwenden. Sollte aber eine einfache Lösung sein, da CoreCLR das Boxen bereits für ähnliche Fälle optimiert (z. B. boxing(x) == null bis false usw., siehe https://github.com/mono/mono/issues/17858 für Links). .

Kategorie:cq
Thema: Optimierung
Schwierigkeitsgrad : Mittelstufe
Kosten: mittel

area-CodeGen-coreclr optimization

Hilfreichster Kommentar

@jkotas Ich habe einen schnellen Prototyp erstellt und der Jit-Diff hat ein paar kb Diff für BCL gefunden, zB https://github.com/dotnet/corefx/blob/master/src/System.Data.Common/src/System/Data /RbTree.cs#L1581

UPD: Nun, es scheint, dass pmi es dosiert hat und in der realen Welt nicht passieren wird.

Alle 3 Kommentare

Ich bin mir jedoch nicht sicher, ob die Leute dieses Muster tatsächlich verwenden

Es hat keinen Sinn, Optimierungen für Muster hinzuzufügen, die niemals im Code der realen Welt auftauchen....

@jkotas Ich habe einen schnellen Prototyp erstellt und der Jit-Diff hat ein paar kb Diff für BCL gefunden, zB https://github.com/dotnet/corefx/blob/master/src/System.Data.Common/src/System/Data /RbTree.cs#L1581

UPD: Nun, es scheint, dass pmi es dosiert hat und in der realen Welt nicht passieren wird.

Angesichts der Erwartung, dass dies im realen Code nicht vorkommt, werde ich dies schließen, bis wir ein motivierendes Beispiel aus der realen Welt sehen.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen

Verwandte Themen

omajid picture omajid  ·  3Kommentare

chunseoklee picture chunseoklee  ·  3Kommentare

noahfalk picture noahfalk  ·  3Kommentare

GitAntoinee picture GitAntoinee  ·  3Kommentare

jzabroski picture jzabroski  ·  3Kommentare