Skip to content

JIT: Improve inlining functions with EH in .NET 10 #108900

@BruceForstall

Description

@BruceForstall

This item tracks work to improve inlining in RyuJIT in .NET 10.

Inline functions containing exception handling (EH)

The JIT currently will not inline a function with exception handling (EH) clauses (try/catch, try/finally, etc.). This work item is to remove that limitation.

A mechanical aspect of the implementation is simply to allow the insertion of the inlinee function EH information into the inliner EH table. Related, the inlinee must create and use its own EH table and not share the root EH table.

One specific note is that we still will not be able to inline any code with EH into an EH filter clause – that is not supported by the runtime. (I think this limitation goes back to Windows SEH, so maybe it can be considered for loosening?)

Specific work:

@SingleAccretion points out that for dynamic methods (which don't have useful tokens) the VM has a mechanism for storing a type handle in the reported EH clause (see SetHasCachedTypeHandle) and it looks like this is queried unconditionally by the code manager. So we should consider using that.

if (m_pMethodBeingCompiled->IsDynamicMethod() &&
((pEHClause->Flags & COR_ILEXCEPTION_CLAUSE_FILTER) == 0) &&
(clause->ClassToken != mdTokenNil))
{
ResolvedToken resolved{};
m_pMethodBeingCompiled->AsDynamicMethodDesc()->GetResolver()->ResolveToken(clause->ClassToken, &resolved);
pEHClause->TypeHandle = (void*)resolved.TypeHandle.AsPtr();
SetHasCachedTypeHandle(pEHClause);
LOG((LF_EH, LL_INFO1000000, " CachedTypeHandle: 0x%08x -> %p\n", clause->ClassToken, pEHClause->TypeHandle));
}

Related

#62038

Metadata

Metadata

Assignees

Labels

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

Type

No type

Projects

Status

Done

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions