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:
Diffstat (limited to 'src/coreclr/jit/importer.cpp')
-rw-r--r--src/coreclr/jit/importer.cpp52
1 files changed, 17 insertions, 35 deletions
diff --git a/src/coreclr/jit/importer.cpp b/src/coreclr/jit/importer.cpp
index 65fb915f783..19e2c842393 100644
--- a/src/coreclr/jit/importer.cpp
+++ b/src/coreclr/jit/importer.cpp
@@ -2932,37 +2932,24 @@ GenTree* Compiler::impTypeIsAssignable(GenTree* typeTo, GenTree* typeFrom)
//
// to true/false
- if (typeTo->IsCall() && typeFrom->IsCall())
+ // make sure both arguments are `typeof()`
+ CORINFO_CLASS_HANDLE hClassTo = NO_CLASS_HANDLE;
+ CORINFO_CLASS_HANDLE hClassFrom = NO_CLASS_HANDLE;
+ if (gtIsTypeof(typeTo, &hClassTo) && gtIsTypeof(typeFrom, &hClassFrom))
{
- // make sure both arguments are `typeof()`
- CORINFO_METHOD_HANDLE hTypeof = eeFindHelper(CORINFO_HELP_TYPEHANDLE_TO_RUNTIMETYPE);
- if ((typeTo->AsCall()->gtCallMethHnd == hTypeof) && (typeFrom->AsCall()->gtCallMethHnd == hTypeof))
+ TypeCompareState castResult = info.compCompHnd->compareTypesForCast(hClassFrom, hClassTo);
+ if (castResult == TypeCompareState::May)
{
- assert((typeTo->AsCall()->gtArgs.CountArgs() == 1) && (typeFrom->AsCall()->gtArgs.CountArgs() == 1));
- CORINFO_CLASS_HANDLE hClassTo =
- gtGetHelperArgClassHandle(typeTo->AsCall()->gtArgs.GetArgByIndex(0)->GetEarlyNode());
- CORINFO_CLASS_HANDLE hClassFrom =
- gtGetHelperArgClassHandle(typeFrom->AsCall()->gtArgs.GetArgByIndex(0)->GetEarlyNode());
-
- if (hClassTo == NO_CLASS_HANDLE || hClassFrom == NO_CLASS_HANDLE)
- {
- return nullptr;
- }
-
- TypeCompareState castResult = info.compCompHnd->compareTypesForCast(hClassFrom, hClassTo);
- if (castResult == TypeCompareState::May)
- {
- // requires runtime check
- // e.g. __Canon, COMObjects, Nullable
- return nullptr;
- }
+ // requires runtime check
+ // e.g. __Canon, COMObjects, Nullable
+ return nullptr;
+ }
- GenTreeIntCon* retNode = gtNewIconNode((castResult == TypeCompareState::Must) ? 1 : 0);
- impPopStack(); // drop both CORINFO_HELP_TYPEHANDLE_TO_RUNTIMETYPE calls
- impPopStack();
+ GenTreeIntCon* retNode = gtNewIconNode((castResult == TypeCompareState::Must) ? 1 : 0);
+ impPopStack(); // drop both CORINFO_HELP_TYPEHANDLE_TO_RUNTIMETYPE calls
+ impPopStack();
- return retNode;
- }
+ return retNode;
}
return nullptr;
@@ -13391,15 +13378,10 @@ void Compiler::impInlineRecordArgInfo(InlineInfo* pInlineInfo,
return;
}
}
- else
+ else if (gtIsTypeof(curArgVal))
{
- if (curArgVal->IsHelperCall() && gtIsTypeHandleToRuntimeTypeHelper(curArgVal->AsCall()) &&
- (gtGetHelperArgClassHandle(curArgVal->AsCall()->gtArgs.GetArgByIndex(0)->GetEarlyNode()) !=
- NO_CLASS_HANDLE))
- {
- inlCurArgInfo->argIsInvariant = true;
- inlCurArgInfo->argHasSideEff = false;
- }
+ inlCurArgInfo->argIsInvariant = true;
+ inlCurArgInfo->argHasSideEff = false;
}
bool isExact = false;