Runtime: JIT : Optimiser boxing(x) == boxing(y) à false.

Créé le 23 nov. 2019  ·  3Commentaires  ·  Source: 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 pour 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 entier
+--* Réf COFFRET
| --* LCL_VAR réf V03 tmp1
--* Réf COFFRET
--* LCL_VAR réf V04 tmp2

Expected codegen:
```asm
; Method Program:Test():bool
       xor      eax, eax  ; return false 
       ret     

Je ne sais pas si les gens utilisent réellement ce modèle. Mais devrait être une solution simple car CoreCLR optimise déjà la boxe pour des cas similaires (par exemple boxing(x) == null à false etc, voir https://github.com/mono/mono/issues/17858 pour les liens) .

catégorie:cq
thème:optimisation
niveau de compétence : intermédiaire
coût :moyen

area-CodeGen-coreclr optimization

Commentaire le plus utile

@jkotas J'ai fait un prototype rapide et le jit-diff a trouvé quelques ko de diff pour BCL, par exemple https://github.com/dotnet/corefx/blob/master/src/System.Data.Common/src/System/Data /RbTree.cs#L1581

UPD : eh bien, il semblerait que pmi le dope et n'arrivera pas dans le monde réel.

Tous les 3 commentaires

Je ne sais pas si les gens utilisent réellement ce modèle

Il ne sert à rien d'ajouter des optimisations pour des modèles qui n'apparaissent jamais dans le code du monde réel...

@jkotas J'ai fait un prototype rapide et le jit-diff a trouvé quelques ko de diff pour BCL, par exemple https://github.com/dotnet/corefx/blob/master/src/System.Data.Common/src/System/Data /RbTree.cs#L1581

UPD : eh bien, il semblerait que pmi le dope et n'arrivera pas dans le monde réel.

Étant donné que l'on s'attend à ce que cela ne se produise pas dans le code du monde réel, je vais fermer ceci jusqu'à ce que nous voyions un exemple motivant du monde réel.

Cette page vous a été utile?
0 / 5 - 0 notes