Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/dotnet/runtime.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Wrighton <davidwr@microsoft.com>2021-04-16 21:49:56 +0300
committerGitHub <noreply@github.com>2021-04-16 21:49:56 +0300
commit2810ae5ff692108291692dec5ac36ba698af887b (patch)
tree7d14875e50cf186036b2715342f58b4d073b93f9 /src/coreclr/ToolBox
parent33033b22eccf50550451387ac8927ad1b5f17768 (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')
-rw-r--r--src/coreclr/ToolBox/superpmi/superpmi-shared/agnostic.h14
-rw-r--r--src/coreclr/ToolBox/superpmi/superpmi-shared/lwmlist.h1
-rw-r--r--src/coreclr/ToolBox/superpmi/superpmi-shared/methodcontext.cpp42
-rw-r--r--src/coreclr/ToolBox/superpmi/superpmi-shared/methodcontext.h6
-rw-r--r--src/coreclr/ToolBox/superpmi/superpmi-shim-collector/icorjitinfo.cpp15
-rw-r--r--src/coreclr/ToolBox/superpmi/superpmi-shim-counter/icorjitinfo.cpp11
-rw-r--r--src/coreclr/ToolBox/superpmi/superpmi-shim-simple/icorjitinfo.cpp10
-rw-r--r--src/coreclr/ToolBox/superpmi/superpmi/icorjitinfo.cpp13
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