From 04e4bd05684b8c83bf95496363adfb5f66f851fa Mon Sep 17 00:00:00 2001 From: Huo Yaoyuan Date: Fri, 24 Jul 2026 13:11:58 +0800 Subject: [PATCH 1/2] Enable benchmark --- src/coreclr/vm/comdelegate.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/coreclr/vm/comdelegate.cpp b/src/coreclr/vm/comdelegate.cpp index f33fcf994e1cfb..1b30005242e712 100644 --- a/src/coreclr/vm/comdelegate.cpp +++ b/src/coreclr/vm/comdelegate.cpp @@ -910,7 +910,7 @@ static PCODE SetupShuffleThunk(MethodTable * pDelMT, MethodDesc *pTargetMeth) MethodDesc *pMD = pClass->GetInvokeMethod(); -#if defined(FEATURE_PORTABLE_SHUFFLE_THUNKS) || defined(TARGET_X86) +#if 0 // We haven't already setup a shuffle thunk, go do it now (which will cache the result automatically). StackSArray rShuffleEntryArray; if (GenerateShuffleArray(pMD, pTargetMeth, &rShuffleEntryArray)) From 1e269bf658a65ff0b867a4c3d9ebbddaab2134fd Mon Sep 17 00:00:00 2001 From: Huo Yaoyuan Date: Fri, 24 Jul 2026 14:56:07 +0800 Subject: [PATCH 2/2] Apply IL pattern optimization --- src/coreclr/vm/comdelegate.cpp | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/coreclr/vm/comdelegate.cpp b/src/coreclr/vm/comdelegate.cpp index 1b30005242e712..57b4c5f0b27b79 100644 --- a/src/coreclr/vm/comdelegate.cpp +++ b/src/coreclr/vm/comdelegate.cpp @@ -846,11 +846,16 @@ static Stub* CreateILDelegateShuffleThunk(MethodDesc* pDelegateMD, bool callTarg ILStubLinker stubLinker(pModule, signature, &typeContext, pDelegateMD, flags); ILCodeStream *pCode = stubLinker.NewCodeStream(ILStubLinker::kDispatch); + // Store the function pointer into local variable to avoid unnecessary register usage by JIT + DWORD methodPtr = pCode->NewLocal(ELEMENT_TYPE_I); + pCode->EmitLoadThis(); + pCode->EmitLDFLD(pCode->GetToken(CoreLibBinder::GetField(FIELD__DELEGATE__METHOD_PTR_AUX))); + pCode->EmitSTLOC(methodPtr); + for (unsigned i = 0; i < sig.NumFixedArgs(); ++i) pCode->EmitLDARG(i); - pCode->EmitLoadThis(); - pCode->EmitLDFLD(pCode->GetToken(CoreLibBinder::GetField(FIELD__DELEGATE__METHOD_PTR_AUX))); + pCode->EmitLDLOC(methodPtr); pCode->EmitCALLI(TOKEN_ILSTUB_TARGET_SIG, sig.NumFixedArgs(), sig.IsReturnTypeVoid() ? 0 : 1); pCode->EmitRET();