From 485a40527d4907c89eb7b3a589273a23888564b5 Mon Sep 17 00:00:00 2001 From: Jan Kotas Date: Wed, 16 Oct 2019 13:24:28 -0700 Subject: [PATCH] ldtoken shortcut --- src/jit/gentree.cpp | 2 +- src/vm/jithelpers.cpp | 3 +++ src/vm/jitinterface.cpp | 7 ++++++- 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/jit/gentree.cpp b/src/jit/gentree.cpp index 818946b20713..755c2e139c89 100644 --- a/src/jit/gentree.cpp +++ b/src/jit/gentree.cpp @@ -12337,7 +12337,7 @@ GenTree* Compiler::gtFoldTypeCompare(GenTree* tree) } // We can't answer the equality comparison definitively at jit - // time, but can still simplify the comparison. + // time, but can still simplfy the comparison. // // Find out how we can compare the two handles. // NOTE: We're potentially passing NO_CLASS_HANDLE, but the runtime knows what to do with it here. diff --git a/src/vm/jithelpers.cpp b/src/vm/jithelpers.cpp index 820e47c7b463..413b929cb9b7 100644 --- a/src/vm/jithelpers.cpp +++ b/src/vm/jithelpers.cpp @@ -4103,6 +4103,9 @@ NOINLINE HCIMPL1(Object*, JIT_GetRuntimeType_Framed, CORINFO_CLASS_HANDLE type) if (refType == NULL) { HELPER_METHOD_FRAME_BEGIN_RET_1(refType); + // Compensate for CORINFO_TOKENKIND_Ldtoken optimization done by CEEInfo::embedGenericHandle + if (!typeHandle.IsTypeDesc() && typeHandle.AsMethodTable()->IsArray()) + typeHandle = ArrayBase::GetTypeHandle(typeHandle.AsMethodTable()); refType = typeHandle.GetManagedClassObject(); HELPER_METHOD_FRAME_END(); } diff --git a/src/vm/jitinterface.cpp b/src/vm/jitinterface.cpp index 2eca213316f9..190be7029c73 100644 --- a/src/vm/jitinterface.cpp +++ b/src/vm/jitinterface.cpp @@ -2625,7 +2625,12 @@ void CEEInfo::embedGenericHandle( pResult->handleType = CORINFO_HANDLETYPE_CLASS; - if (pResolvedToken->tokenType == CORINFO_TOKENKIND_Newarr) + if (pResolvedToken->tokenType == CORINFO_TOKENKIND_Newarr +#ifndef FEATURE_READYTORUN_COMPILER + // This enables use of MethodTable fast-path through JIT_GetRuntimeTypeHandle helper + || (pResolvedToken->tokenType == CORINFO_TOKENKIND_Ldtoken && th.IsArray()) +#endif + ) { pResult->compileTimeHandle = (CORINFO_GENERIC_HANDLE)th.AsArray()->GetTemplateMethodTable(); }