diff options
author | David Wrighton <davidwr@microsoft.com> | 2021-04-16 21:49:56 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-04-16 21:49:56 +0300 |
commit | 2810ae5ff692108291692dec5ac36ba698af887b (patch) | |
tree | 7d14875e50cf186036b2715342f58b4d073b93f9 /src/coreclr/ToolBox | |
parent | 33033b22eccf50550451387ac8927ad1b5f17768 (diff) |
Improve likely class handling for pgo (#51284)
- Move processing of likely class histogram into the JIT
- Fix cases where the devirtualization logic in crossgen2 behaved incorrectly in the presence of likely class histogram data
- Pre-process histogram at crossgen2 time to reduce the size of the pgo data
- This removes 3/4 of the data from System.Private.CoreLib
Diffstat (limited to 'src/coreclr/ToolBox')
8 files changed, 1 insertions, 111 deletions
diff --git a/src/coreclr/ToolBox/superpmi/superpmi-shared/agnostic.h b/src/coreclr/ToolBox/superpmi/superpmi-shared/agnostic.h index 44f3f799431..59cc7857f4c 100644 --- a/src/coreclr/ToolBox/superpmi/superpmi-shared/agnostic.h +++ b/src/coreclr/ToolBox/superpmi/superpmi-shared/agnostic.h @@ -493,20 +493,6 @@ struct Agnostic_GetPgoInstrumentationResults DWORD result; }; -struct Agnostic_GetLikelyClass -{ - DWORDLONG ftnHnd; - DWORDLONG baseHnd; - DWORD ilOffset; -}; - -struct Agnostic_GetLikelyClassResult -{ - DWORDLONG classHnd; - DWORD likelihood; - DWORD numberOfClasses; -}; - struct Agnostic_GetProfilingHandle { DWORD bHookFunction; diff --git a/src/coreclr/ToolBox/superpmi/superpmi-shared/lwmlist.h b/src/coreclr/ToolBox/superpmi/superpmi-shared/lwmlist.h index 71f9eca564a..338a4eb935e 100644 --- a/src/coreclr/ToolBox/superpmi/superpmi-shared/lwmlist.h +++ b/src/coreclr/ToolBox/superpmi/superpmi-shared/lwmlist.h @@ -99,7 +99,6 @@ LWM(GetJitFlags, DWORD, DD) LWM(GetJitTimeLogFilename, DWORD, DWORD) LWM(GetJustMyCodeHandle, DWORDLONG, DLDL) LWM(GetLazyStringLiteralHelper, DWORDLONG, DWORD) -LWM(GetLikelyClass, Agnostic_GetLikelyClass, Agnostic_GetLikelyClassResult) LWM(GetLocationOfThisType, DWORDLONG, Agnostic_CORINFO_LOOKUP_KIND) LWM(IsJitIntrinsic, DWORDLONG, DWORD) LWM(GetMethodAttribs, DWORDLONG, DWORD) diff --git a/src/coreclr/ToolBox/superpmi/superpmi-shared/methodcontext.cpp b/src/coreclr/ToolBox/superpmi/superpmi-shared/methodcontext.cpp index 0654207f281..a4badbfcae3 100644 --- a/src/coreclr/ToolBox/superpmi/superpmi-shared/methodcontext.cpp +++ b/src/coreclr/ToolBox/superpmi/superpmi-shared/methodcontext.cpp @@ -5558,48 +5558,6 @@ HRESULT MethodContext::repGetPgoInstrumentationResults(CORINFO_METHOD_HANDLE ftn return result; } -void MethodContext::recGetLikelyClass(CORINFO_METHOD_HANDLE ftnHnd, CORINFO_CLASS_HANDLE baseHnd, UINT32 ilOffset, CORINFO_CLASS_HANDLE result, UINT32* pLikelihood, UINT32* pNumberOfClasses) -{ - if (GetLikelyClass == nullptr) - GetLikelyClass = new LightWeightMap<Agnostic_GetLikelyClass, Agnostic_GetLikelyClassResult>(); - - Agnostic_GetLikelyClass key; - ZeroMemory(&key, sizeof(Agnostic_GetLikelyClass)); - - key.ftnHnd = CastHandle(ftnHnd); - key.baseHnd = CastHandle(baseHnd); - key.ilOffset = (DWORD) ilOffset; - - Agnostic_GetLikelyClassResult value; - ZeroMemory(&value, sizeof(Agnostic_GetLikelyClassResult)); - value.classHnd = CastHandle(result); - value.likelihood = *pLikelihood; - value.numberOfClasses = *pNumberOfClasses; - - GetLikelyClass->Add(key, value); - DEBUG_REC(dmpGetLikelyClass(key, value)); -} -void MethodContext::dmpGetLikelyClass(const Agnostic_GetLikelyClass& key, const Agnostic_GetLikelyClassResult& value) -{ - printf("GetLikelyClass key ftn-%016llX base-%016llX il-%u, class-%016llX likelihood-%u numberOfClasses-%u", - key.ftnHnd, key.baseHnd, key.ilOffset, value.classHnd, value.likelihood, value.numberOfClasses); -} -CORINFO_CLASS_HANDLE MethodContext::repGetLikelyClass(CORINFO_METHOD_HANDLE ftnHnd, CORINFO_CLASS_HANDLE baseHnd, UINT32 ilOffset, UINT32* pLikelihood, UINT32* pNumberOfClasses) -{ - Agnostic_GetLikelyClass key; - ZeroMemory(&key, sizeof(Agnostic_GetLikelyClass)); - key.ftnHnd = CastHandle(ftnHnd); - key.baseHnd = CastHandle(baseHnd); - key.ilOffset = (DWORD) ilOffset; - - Agnostic_GetLikelyClassResult value = GetLikelyClass->Get(key); - DEBUG_REP(dmpGetLikelyClass(key, value)); - - *pLikelihood = value.likelihood; - *pNumberOfClasses = value.numberOfClasses; - return (CORINFO_CLASS_HANDLE) value.classHnd; -} - void MethodContext::recMergeClasses(CORINFO_CLASS_HANDLE cls1, CORINFO_CLASS_HANDLE cls2, CORINFO_CLASS_HANDLE result) { if (MergeClasses == nullptr) diff --git a/src/coreclr/ToolBox/superpmi/superpmi-shared/methodcontext.h b/src/coreclr/ToolBox/superpmi/superpmi-shared/methodcontext.h index 69837068f23..1fe4c95fc05 100644 --- a/src/coreclr/ToolBox/superpmi/superpmi-shared/methodcontext.h +++ b/src/coreclr/ToolBox/superpmi/superpmi-shared/methodcontext.h @@ -701,10 +701,6 @@ public: void dmpGetPgoInstrumentationResults(DWORDLONG key, const Agnostic_GetPgoInstrumentationResults& value); HRESULT repGetPgoInstrumentationResults(CORINFO_METHOD_HANDLE ftnHnd, ICorJitInfo::PgoInstrumentationSchema** pSchema, UINT32* pCountSchemaItems, BYTE** pInstrumentationData); - void recGetLikelyClass(CORINFO_METHOD_HANDLE ftnHnd, CORINFO_CLASS_HANDLE baseHnd, UINT32 ilOffset, CORINFO_CLASS_HANDLE classHnd, UINT32* pLikelihood, UINT32* pNumberOfClasses); - void dmpGetLikelyClass(const Agnostic_GetLikelyClass& key, const Agnostic_GetLikelyClassResult& value); - CORINFO_CLASS_HANDLE repGetLikelyClass(CORINFO_METHOD_HANDLE ftnHnd, CORINFO_CLASS_HANDLE baseHnd, UINT32 ilOffset, UINT32* pLikelihood, UINT32* pNumberOfClasses); - void recMergeClasses(CORINFO_CLASS_HANDLE cls1, CORINFO_CLASS_HANDLE cls2, CORINFO_CLASS_HANDLE result); void dmpMergeClasses(DLDL key, DWORDLONG value); CORINFO_CLASS_HANDLE repMergeClasses(CORINFO_CLASS_HANDLE cls1, CORINFO_CLASS_HANDLE cls2); @@ -1002,7 +998,7 @@ enum mcPackets Packet_GetJitFlags = 154, // Added 2/3/2016 Packet_GetJitTimeLogFilename = 67, Packet_GetJustMyCodeHandle = 68, - Packet_GetLikelyClass = 182, // Added 9/27/2020 + Retired10 = 182, // Added 9/27/2020 // was Packet_GetLikelyClass Packet_GetLocationOfThisType = 69, Packet_IsJitIntrinsic = 192, Packet_GetMethodAttribs = 70, diff --git a/src/coreclr/ToolBox/superpmi/superpmi-shim-collector/icorjitinfo.cpp b/src/coreclr/ToolBox/superpmi/superpmi-shim-collector/icorjitinfo.cpp index 281533e4aff..9b799a18040 100644 --- a/src/coreclr/ToolBox/superpmi/superpmi-shim-collector/icorjitinfo.cpp +++ b/src/coreclr/ToolBox/superpmi/superpmi-shim-collector/icorjitinfo.cpp @@ -2084,21 +2084,6 @@ HRESULT interceptor_ICJI::getPgoInstrumentationResults(CORINFO_METHOD_HANDLE return temp; } -// Get the likely implementing class for a virtual call or interface call made by ftnHnd -// at the indicated IL offset. baseHnd is the interface class or base class for the method -// being called. -CORINFO_CLASS_HANDLE interceptor_ICJI::getLikelyClass(CORINFO_METHOD_HANDLE ftnHnd, - CORINFO_CLASS_HANDLE baseHnd, - uint32_t ilOffset, - uint32_t* pLikelihood, - uint32_t* pNumberOfClasses) -{ - mc->cr->AddCall("getLikelyClass"); - CORINFO_CLASS_HANDLE result = original_ICorJitInfo->getLikelyClass(ftnHnd, baseHnd, ilOffset, pLikelihood, pNumberOfClasses); - mc->recGetLikelyClass(ftnHnd, baseHnd, ilOffset, result, pLikelihood, pNumberOfClasses); - return result; -} - // Associates a native call site, identified by its offset in the native code stream, with // the signature information and method handle the JIT used to lay out the call site. If // the call site has no signature information (e.g. a helper call) or has no method handle diff --git a/src/coreclr/ToolBox/superpmi/superpmi-shim-counter/icorjitinfo.cpp b/src/coreclr/ToolBox/superpmi/superpmi-shim-counter/icorjitinfo.cpp index d5ee05be454..918d18893f9 100644 --- a/src/coreclr/ToolBox/superpmi/superpmi-shim-counter/icorjitinfo.cpp +++ b/src/coreclr/ToolBox/superpmi/superpmi-shim-counter/icorjitinfo.cpp @@ -1352,17 +1352,6 @@ JITINTERFACE_HRESULT interceptor_ICJI::allocPgoInstrumentationBySchema( return original_ICorJitInfo->allocPgoInstrumentationBySchema(ftnHnd, pSchema, countSchemaItems, pInstrumentationData); } -CORINFO_CLASS_HANDLE interceptor_ICJI::getLikelyClass( - CORINFO_METHOD_HANDLE ftnHnd, - CORINFO_CLASS_HANDLE baseHnd, - uint32_t ilOffset, - uint32_t* pLikelihood, - uint32_t* pNumberOfClasses) -{ - mcs->AddCall("getLikelyClass"); - return original_ICorJitInfo->getLikelyClass(ftnHnd, baseHnd, ilOffset, pLikelihood, pNumberOfClasses); -} - void interceptor_ICJI::recordCallSite( uint32_t instrOffset, CORINFO_SIG_INFO* callSig, diff --git a/src/coreclr/ToolBox/superpmi/superpmi-shim-simple/icorjitinfo.cpp b/src/coreclr/ToolBox/superpmi/superpmi-shim-simple/icorjitinfo.cpp index 3aed50b5b51..19cf1f8a71e 100644 --- a/src/coreclr/ToolBox/superpmi/superpmi-shim-simple/icorjitinfo.cpp +++ b/src/coreclr/ToolBox/superpmi/superpmi-shim-simple/icorjitinfo.cpp @@ -1185,16 +1185,6 @@ JITINTERFACE_HRESULT interceptor_ICJI::allocPgoInstrumentationBySchema( return original_ICorJitInfo->allocPgoInstrumentationBySchema(ftnHnd, pSchema, countSchemaItems, pInstrumentationData); } -CORINFO_CLASS_HANDLE interceptor_ICJI::getLikelyClass( - CORINFO_METHOD_HANDLE ftnHnd, - CORINFO_CLASS_HANDLE baseHnd, - uint32_t ilOffset, - uint32_t* pLikelihood, - uint32_t* pNumberOfClasses) -{ - return original_ICorJitInfo->getLikelyClass(ftnHnd, baseHnd, ilOffset, pLikelihood, pNumberOfClasses); -} - void interceptor_ICJI::recordCallSite( uint32_t instrOffset, CORINFO_SIG_INFO* callSig, diff --git a/src/coreclr/ToolBox/superpmi/superpmi/icorjitinfo.cpp b/src/coreclr/ToolBox/superpmi/superpmi/icorjitinfo.cpp index 4f86025dfc8..18dac3b1db3 100644 --- a/src/coreclr/ToolBox/superpmi/superpmi/icorjitinfo.cpp +++ b/src/coreclr/ToolBox/superpmi/superpmi/icorjitinfo.cpp @@ -1825,19 +1825,6 @@ HRESULT MyICJI::getPgoInstrumentationResults(CORINFO_METHOD_HANDLE ftnHnd, return jitInstance->mc->repGetPgoInstrumentationResults(ftnHnd, pSchema, pCountSchemaItems, pInstrumentationData); } -// Get the likely implementing class for a virtual call or interface call made by ftnHnd -// at the indicated IL offset. baseHnd is the interface class or base class for the method -// being called. -CORINFO_CLASS_HANDLE MyICJI::getLikelyClass(CORINFO_METHOD_HANDLE ftnHnd, - CORINFO_CLASS_HANDLE baseHnd, - uint32_t ilOffset, - uint32_t* pLikelihood, - uint32_t* pNumberOfClasses) -{ - jitInstance->mc->cr->AddCall("getLikelyClass"); - return jitInstance->mc->repGetLikelyClass(ftnHnd, baseHnd, ilOffset, pLikelihood, pNumberOfClasses); -} - // Associates a native call site, identified by its offset in the native code stream, with // the signature information and method handle the JIT used to lay out the call site. If // the call site has no signature information (e.g. a helper call) or has no method handle |