@@ -4015,15 +4015,12 @@ GenTree* Compiler::impIntrinsic(GenTree* newobjThis,
40154015 break;
40164016 }
40174017
4018- case NI_System_Type_get_IsClass:
4019- case NI_System_Type_get_IsPrimitive:
40204018 case NI_System_Type_get_IsValueType:
40214019 {
4022- // Optimize things like
4020+ // Optimize
40234021 //
4024- // ldtoken [Type]
40254022 // call Type.GetTypeFromHandle (which is replaced with CORINFO_HELP_TYPEHANDLE_TO_RUNTIMETYPE)
4026- // call Type.IsValueType (also IsClass and IsPrimitive)
4023+ // call Type.IsValueType
40274024 //
40284025 // to `true` or `false`
40294026 // e.g. `typeof(int).IsValueType` => `true`
@@ -4033,51 +4030,13 @@ GenTree* Compiler::impIntrinsic(GenTree* newobjThis,
40334030 if (call->gtCallMethHnd == eeFindHelper(CORINFO_HELP_TYPEHANDLE_TO_RUNTIMETYPE))
40344031 {
40354032 CORINFO_CLASS_HANDLE hClass = gtGetHelperArgClassHandle(call->gtCallArgs->GetNode());
4036- if (hClass == NO_CLASS_HANDLE || hClass == info.compCompHnd->getBuiltinClass(CLASSID___CANON) )
4033+ if (hClass != NO_CLASS_HANDLE)
40374034 {
4038- // Ignore System.__Canon
4039- break;
4040- }
4041-
4042- BOOL isValueType = eeIsValueClass(hClass);
4043- CorInfoType cit = info.compCompHnd->getTypeForPrimitiveValueClass(hClass);
4044- if (ni == NI_System_Type_get_IsPrimitive)
4045- {
4046- if (isValueType && (cit >= CORINFO_TYPE_BOOL) && (cit <= CORINFO_TYPE_DOUBLE))
4047- {
4048- // Enums are not primitive types
4049- BOOL isEnum = info.compCompHnd->getBuiltinClass(CLASSID_ENUM) ==
4050- info.compCompHnd->getParentType(hClass);
4051- retNode = gtNewIconNode(!isEnum ? 1 : 0);
4052- }
4053- else
4054- {
4055- retNode = gtNewIconNode(0);
4056- }
4057- }
4058- else if (ni == NI_System_Type_get_IsClass)
4059- {
4060- // Pointers are also classes (e.g. typeof(int*).IsClass is true)
4061- if (isValueType && (cit != CORINFO_TYPE_PTR))
4062- {
4063- retNode = gtNewIconNode(0);
4064- }
4065- else
4066- {
4067- BOOL isInterface = info.compCompHnd->getClassAttribs(hClass) & CORINFO_FLG_INTERFACE;
4068- retNode = gtNewIconNode(isInterface ? 0 : 1);
4069- }
4035+ retNode = gtNewIconNode((eeIsValueClass(hClass) &&
4036+ // pointers are not value types (e.g. typeof(int*).IsValueType is false)
4037+ info.compCompHnd->getTypeForPrimitiveValueClass(hClass) != CORINFO_TYPE_PTR) ? 1 : 0);
4038+ impPopStack(); // drop CORINFO_HELP_TYPEHANDLE_TO_RUNTIMETYPE call
40704039 }
4071- else if (ni == NI_System_Type_get_IsValueType)
4072- {
4073- retNode = gtNewIconNode((isValueType && (cit != CORINFO_TYPE_PTR)) ? 1 : 0);
4074- }
4075- else
4076- {
4077- assert(false);
4078- }
4079- // drop CORINFO_HELP_TYPEHANDLE_TO_RUNTIMETYPE call
4080- impPopStack();
40814040 }
40824041 }
40834042 break;
@@ -4380,14 +4339,6 @@ NamedIntrinsic Compiler::lookupNamedIntrinsic(CORINFO_METHOD_HANDLE method)
43804339 {
43814340 result = NI_System_Type_get_IsValueType;
43824341 }
4383- else if (strcmp(methodName, "get_IsClass") == 0)
4384- {
4385- result = NI_System_Type_get_IsClass;
4386- }
4387- else if (strcmp(methodName, "get_IsPrimitive") == 0)
4388- {
4389- result = NI_System_Type_get_IsPrimitive;
4390- }
43914342 }
43924343 }
43934344#if defined(_TARGET_XARCH_) // We currently only support BSWAP on x86
0 commit comments