diff --git a/src/coreclr/jit/lclvars.cpp b/src/coreclr/jit/lclvars.cpp index 1cf64495ec0ecb..6de08838e5dc7b 100644 --- a/src/coreclr/jit/lclvars.cpp +++ b/src/coreclr/jit/lclvars.cpp @@ -275,7 +275,26 @@ void Compiler::lvaInitTypeRef() if ((corInfoTypeWithMod & CORINFO_TYPE_MOD_PINNED) != 0) { - if ((corInfoType == CORINFO_TYPE_CLASS) || (corInfoType == CORINFO_TYPE_BYREF)) + CORINFO_CLASS_HANDLE refClsHnd = NO_CLASS_HANDLE; + // don't run in crossgen to avoid invalid type info + if (corInfoType == CORINFO_TYPE_BYREF && !opts.IsReadyToRun()) + { + CORINFO_CLASS_HANDLE clsHnd = info.compCompHnd->getArgClass(&info.compMethodInfo->locals, localsSig); + + CORINFO_CLASS_HANDLE realClsHnd = NO_CLASS_HANDLE; + if (info.compCompHnd->getChildType(clsHnd, &realClsHnd) == CORINFO_TYPE_VALUECLASS) + { + refClsHnd = realClsHnd; + } + } + + // ignore pinned on ref structs + if ((refClsHnd != NO_CLASS_HANDLE) && + ((info.compCompHnd->getClassAttribs(refClsHnd) & CORINFO_FLG_BYREF_LIKE) != 0)) + { + JITDUMP("Ignoring pinned on local V%02u for byref-like type %s\n", varNum, eeGetClassName(refClsHnd)); + } + else if ((corInfoType == CORINFO_TYPE_CLASS) || (corInfoType == CORINFO_TYPE_BYREF)) { JITDUMP("Setting lvPinned for V%02u\n", varNum); varDsc->lvPinned = 1;