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
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:
GT_END_LFINrecords the handler nesting depth. Since this value can change as the method is optimized, we now link theGT_END_LFINto a durable EH region, and use this to look up the region's nesting depth during codegen.@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.runtime/src/coreclr/vm/jitinterface.cpp
Lines 12684 to 12693 in ed3081f
Related
#62038