Skip to content

Commit f24879f

Browse files
Expose an eeIsJitIntrinsic method for quickly determining if a method handle represents an intrinsic method (#51124)
* Updating the JIT/EE interface to expose `isJitIntrinsic` * Update JITEEVersionIdentifier * Update fgFindJumpTargets to use the much cheaper `eeIsJitIntrinsic` * Ensure IsJitIntrinsic exists in the LightWeightMap and fix a copy/paste error * Run ThunkGenerator * Don't resolve tokens for CEE_CONSTRAINED when making inlining observations
1 parent b886e4d commit f24879f

File tree

21 files changed

+344
-225
lines changed

21 files changed

+344
-225
lines changed

src/coreclr/ToolBox/superpmi/superpmi-shared/lwmlist.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,7 @@ LWM(GetJustMyCodeHandle, DWORDLONG, DLDL)
101101
LWM(GetLazyStringLiteralHelper, DWORDLONG, DWORD)
102102
LWM(GetLikelyClass, Agnostic_GetLikelyClass, Agnostic_GetLikelyClassResult)
103103
LWM(GetLocationOfThisType, DWORDLONG, Agnostic_CORINFO_LOOKUP_KIND)
104+
LWM(IsJitIntrinsic, DWORDLONG, DWORD)
104105
LWM(GetMethodAttribs, DWORDLONG, DWORD)
105106
LWM(GetClassModule, DWORDLONG, DWORDLONG)
106107
LWM(GetModuleAssembly, DWORDLONG, DWORDLONG)

src/coreclr/ToolBox/superpmi/superpmi-shared/methodcontext.cpp

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -771,6 +771,28 @@ DWORD MethodContext::repGetClassAttribs(CORINFO_CLASS_HANDLE classHandle)
771771
return value;
772772
}
773773

774+
void MethodContext::recIsJitIntrinsic(CORINFO_METHOD_HANDLE ftn, bool result)
775+
{
776+
if (IsJitIntrinsic == nullptr)
777+
IsJitIntrinsic = new LightWeightMap<DWORDLONG, DWORD>();
778+
779+
IsJitIntrinsic->Add(CastHandle(ftn), (DWORD)result);
780+
DEBUG_REC(dmpIsJitIntrinsic(CastHandle(ftn), (DWORD)result));
781+
}
782+
void MethodContext::dmpIsJitIntrinsic(DWORDLONG key, DWORD value)
783+
{
784+
printf("IsJitIntrinsic key ftn-%016llX, value res-%u", key, value);
785+
}
786+
bool MethodContext::repIsJitIntrinsic(CORINFO_METHOD_HANDLE ftn)
787+
{
788+
AssertCodeMsg((IsJitIntrinsic != nullptr) && (IsJitIntrinsic->GetIndex(CastHandle(ftn)) != -1), EXCEPTIONCODE_MC,
789+
"Didn't find %016llX", CastHandle(ftn));
790+
791+
bool result = (BOOL)IsJitIntrinsic->Get(CastHandle(ftn));
792+
DEBUG_REP(dmpIsJitIntrinsic(CastHandle(ftn), (DWORD)result));
793+
return result;
794+
}
795+
774796
void MethodContext::recGetMethodAttribs(CORINFO_METHOD_HANDLE methodHandle, DWORD attribs)
775797
{
776798
if (GetMethodAttribs == nullptr)

src/coreclr/ToolBox/superpmi/superpmi-shared/methodcontext.h

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,10 @@ class MethodContext
119119
void dmpGetClassAttribs(DWORDLONG key, DWORD value);
120120
DWORD repGetClassAttribs(CORINFO_CLASS_HANDLE classHandle);
121121

122+
void recIsJitIntrinsic(CORINFO_METHOD_HANDLE ftn, bool result);
123+
void dmpIsJitIntrinsic(DWORDLONG key, DWORD value);
124+
bool repIsJitIntrinsic(CORINFO_METHOD_HANDLE ftn);
125+
122126
void recGetMethodAttribs(CORINFO_METHOD_HANDLE methodHandle, DWORD attribs);
123127
void dmpGetMethodAttribs(DWORDLONG key, DWORD value);
124128
DWORD repGetMethodAttribs(CORINFO_METHOD_HANDLE methodHandle);
@@ -898,7 +902,7 @@ class MethodContext
898902
};
899903

900904
// ********************* Please keep this up-to-date to ease adding more ***************
901-
// Highest packet number: 191
905+
// Highest packet number: 192
902906
// *************************************************************************************
903907
enum mcPackets
904908
{
@@ -1000,6 +1004,7 @@ enum mcPackets
10001004
Packet_GetJustMyCodeHandle = 68,
10011005
Packet_GetLikelyClass = 182, // Added 9/27/2020
10021006
Packet_GetLocationOfThisType = 69,
1007+
Packet_IsJitIntrinsic = 192,
10031008
Packet_GetMethodAttribs = 70,
10041009
Packet_GetMethodClass = 71,
10051010
Packet_GetMethodModule = 181, // Added 11/20/2020

src/coreclr/ToolBox/superpmi/superpmi-shim-collector/icorjitinfo.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,17 @@
1717
// ICorMethodInfo
1818
//
1919
/**********************************************************************************/
20+
21+
// Quick check whether the method is a jit intrinsic. Returns the same value as getMethodAttribs(ftn) &
22+
// CORINFO_FLG_JIT_INTRINSIC, except faster.
23+
bool interceptor_ICJI::isJitIntrinsic(CORINFO_METHOD_HANDLE ftn)
24+
{
25+
mc->cr->AddCall("isJitIntrinsic");
26+
bool temp = original_ICorJitInfo->isJitIntrinsic(ftn);
27+
mc->recIsJitIntrinsic(ftn, temp);
28+
return temp;
29+
}
30+
2031
// return flags (defined above, CORINFO_FLG_PUBLIC ...)
2132
uint32_t interceptor_ICJI::getMethodAttribs(CORINFO_METHOD_HANDLE ftn /* IN */)
2233
{

src/coreclr/ToolBox/superpmi/superpmi-shim-counter/icorjitinfo.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,13 @@
1212
#include "spmiutil.h"
1313

1414

15+
bool interceptor_ICJI::isJitIntrinsic(
16+
CORINFO_METHOD_HANDLE ftn)
17+
{
18+
mcs->AddCall("isJitIntrinsic");
19+
return original_ICorJitInfo->isJitIntrinsic(ftn);
20+
}
21+
1522
uint32_t interceptor_ICJI::getMethodAttribs(
1623
CORINFO_METHOD_HANDLE ftn)
1724
{

src/coreclr/ToolBox/superpmi/superpmi-shim-simple/icorjitinfo.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,12 @@
1212
#include "spmiutil.h"
1313

1414

15+
bool interceptor_ICJI::isJitIntrinsic(
16+
CORINFO_METHOD_HANDLE ftn)
17+
{
18+
return original_ICorJitInfo->isJitIntrinsic(ftn);
19+
}
20+
1521
uint32_t interceptor_ICJI::getMethodAttribs(
1622
CORINFO_METHOD_HANDLE ftn)
1723
{

src/coreclr/ToolBox/superpmi/superpmi/icorjitinfo.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,14 @@ ICorJitInfo* InitICorJitInfo(JitInstance* jitInstance)
2323
//
2424
/**********************************************************************************/
2525

26+
// Quick check whether the method is a jit intrinsic. Returns the same value as getMethodAttribs(ftn) &
27+
// CORINFO_FLG_JIT_INTRINSIC, except faster.
28+
bool MyICJI::isJitIntrinsic(CORINFO_METHOD_HANDLE ftn)
29+
{
30+
jitInstance->mc->cr->AddCall("isJitIntrinsic");
31+
return jitInstance->mc->repIsJitIntrinsic(ftn);
32+
}
33+
2634
// return flags (defined above, CORINFO_FLG_PUBLIC ...)
2735
uint32_t MyICJI::getMethodAttribs(CORINFO_METHOD_HANDLE ftn /* IN */)
2836
{

src/coreclr/inc/corinfo.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1953,6 +1953,9 @@ class ICorStaticInfo
19531953
//
19541954
/**********************************************************************************/
19551955

1956+
// Quick check whether the method is a jit intrinsic. Returns the same value as getMethodAttribs(ftn) & CORINFO_FLG_JIT_INTRINSIC, except faster.
1957+
virtual bool isJitIntrinsic(CORINFO_METHOD_HANDLE ftn) = 0;
1958+
19561959
// return flags (a bitfield of CorInfoFlags values)
19571960
virtual uint32_t getMethodAttribs (
19581961
CORINFO_METHOD_HANDLE ftn /* IN */

src/coreclr/inc/icorjitinfoimpl_generated.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,9 @@
2121

2222
public:
2323

24+
bool isJitIntrinsic(
25+
CORINFO_METHOD_HANDLE ftn) override;
26+
2427
uint32_t getMethodAttribs(
2528
CORINFO_METHOD_HANDLE ftn) override;
2629

src/coreclr/inc/jiteeversionguid.h

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -43,11 +43,11 @@ typedef const GUID *LPCGUID;
4343
#define GUID_DEFINED
4444
#endif // !GUID_DEFINED
4545

46-
constexpr GUID JITEEVersionIdentifier = { /* 1776ab48-edfa-49be-a11f-ec216b28174c */
47-
0x1776ab48,
48-
0xedfa,
49-
0x49be,
50-
{0xa1, 0x1f, 0xec, 0x21, 0x6b, 0x28, 0x17, 0x4c}
46+
constexpr GUID JITEEVersionIdentifier = { /* a33f2f79-dd8d-49dd-b4c3-ac86f34f6a87 */
47+
0xa33f2f79,
48+
0xdd8d,
49+
0x49dd,
50+
{0xb4, 0xc3, 0xac, 0x86, 0xf3, 0x4f, 0x6a, 0x87}
5151
};
5252

5353
//////////////////////////////////////////////////////////////////////////////////////////////////////////

0 commit comments

Comments
 (0)