Skip to content

PGO: simple generic method is not inlined #88299

@EgorBo

Description

@EgorBo
for (int i = 0; i < 100; i++)
{
    Test(new ObjImpl<string>());
    Thread.Sleep(16);
}

[MethodImpl(MethodImplOptions.NoInlining)]
static object Test(IObj o) => o.GetObj();


public interface IObj
{
    object GetObj();
}

public class ObjImpl<T> : IObj
{
    public object GetObj() => typeof(T);
}

Codegen for Test in Tier1:

; Assembly listing for method Program:<<Main>$>g__Test|0_0(IObj):System.Object (Tier1)
       sub      rsp, 40
       mov      rax, 0xD1FFAB1E  ; ObjImpl`1[System.String]
       cmp      qword ptr [rcx], rax
       jne      SHORT G_M33634_IG06
       call     [ObjImpl`1[System.__Canon]:GetObj():System.Object:this]
G_M33634_IG04:
       nop      
       add      rsp, 40
       ret      
G_M33634_IG06:
       mov      r11, 0xD1FFAB1E      ; code for IObj:GetObj():System.Object:this
       call     [r11]IObj:GetObj():System.Object:this
       jmp      SHORT G_M33634_IG04
; Total bytes of code 46,

GDV is applied but the method is not inlined, presumably, the root cause is the same as in #87597 - generic context from the GDV candidate is not kept (but I am not sure, decided to file since I noticed a similiar pattern in real code)

Metadata

Metadata

Assignees

Labels

area-CodeGen-coreclrCLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI

Type

No type

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions