diff --git a/src/coreclr/jit/assertionprop.cpp b/src/coreclr/jit/assertionprop.cpp index 75859cd8c2b234..531a4ef30cb5ed 100644 --- a/src/coreclr/jit/assertionprop.cpp +++ b/src/coreclr/jit/assertionprop.cpp @@ -1410,8 +1410,16 @@ bool Compiler::optIsTreeKnownIntValue(bool vnBased, GenTree* tree, ssize_t* pCon var_types vnType = vnStore->TypeOfVN(vn); if (vnType == TYP_INT) { - *pConstant = vnStore->ConstantValue(vn); - *pFlags = vnStore->IsVNHandle(vn) ? vnStore->GetHandleFlags(vn) : GTF_EMPTY; + if (vnStore->IsVNHandle(vn)) + { + *pConstant = vnStore->ConstantValue(vn); + *pFlags = vnStore->GetHandleFlags(vn); + } + else + { + *pConstant = vnStore->ConstantValue(vn); + *pFlags = GTF_EMPTY; + } return true; } #ifdef TARGET_64BIT @@ -4600,12 +4608,16 @@ GenTree* Compiler::optAssertionPropGlobal_RelOp(ASSERT_VALARG_TP assertions, } else { - printf("%d (gcref)\n", static_cast(vnStore->ConstantValue(vnCns))); + assert(vnStore->IsVNHandle(vnCns)); + printf("%p (gcref)\n", dspPtr(vnStore->ConstantValue(vnCns))); } } else if (op1->TypeIs(TYP_BYREF)) { - printf("%d (byref)\n", static_cast(vnStore->ConstantValue(vnCns))); + ssize_t constant = vnStore->IsVNHandle(vnCns) + ? vnStore->ConstantValue(vnCns) + : static_cast(vnStore->ConstantValue(vnCns)); + printf("%p (byref)\n", dspPtr(constant)); } else { @@ -4654,11 +4666,17 @@ GenTree* Compiler::optAssertionPropGlobal_RelOp(ASSERT_VALARG_TP assertions, } else if (op1->TypeIs(TYP_REF)) { - op1->BashToConst(static_cast(vnStore->ConstantValue(vnCns)), TYP_REF); + ssize_t constant = vnStore->IsVNHandle(vnCns) + ? vnStore->ConstantValue(vnCns) + : static_cast(vnStore->ConstantValue(vnCns)); + op1->BashToConst(constant, TYP_REF); } else if (op1->TypeIs(TYP_BYREF)) { - op1->BashToConst(static_cast(vnStore->ConstantValue(vnCns)), TYP_BYREF); + ssize_t constant = vnStore->IsVNHandle(vnCns) + ? vnStore->ConstantValue(vnCns) + : static_cast(vnStore->ConstantValue(vnCns)); + op1->BashToConst(constant, TYP_BYREF); } else { diff --git a/src/coreclr/jit/compiler.hpp b/src/coreclr/jit/compiler.hpp index 98f1ff991d710b..51e4326143e105 100644 --- a/src/coreclr/jit/compiler.hpp +++ b/src/coreclr/jit/compiler.hpp @@ -2095,7 +2095,7 @@ void GenTree::BashToConst(T value, var_types type /* = TYP_UNDEF */) assert(type != TYP_LONG); #endif assert(varTypeIsIntegral(type) || varTypeIsGC(type)); - if (genTypeSize(type) <= genTypeSize(TYP_INT)) + if (!varTypeIsGC(type) && (genTypeSize(type) <= genTypeSize(TYP_INT))) { assert(FitsIn(value)); } diff --git a/src/coreclr/jit/importer.cpp b/src/coreclr/jit/importer.cpp index 082d86cedd93f8..8222e4ef475fe6 100644 --- a/src/coreclr/jit/importer.cpp +++ b/src/coreclr/jit/importer.cpp @@ -3983,8 +3983,9 @@ GenTree* Compiler::impImportStaticReadOnlyField(CORINFO_FIELD_HANDLE field, CORI uint8_t buffer[bufferSize] = {0}; if (varTypeIsIntegral(fieldType) || varTypeIsFloating(fieldType) || (fieldType == TYP_REF)) { - assert(bufferSize >= genTypeSize(fieldType)); - if (info.compCompHnd->getStaticFieldContent(field, buffer, genTypeSize(fieldType))) + const int fieldValueSize = (fieldType == TYP_REF) ? (int)sizeof(ssize_t) : genTypeSize(fieldType); + assert(bufferSize >= fieldValueSize); + if (info.compCompHnd->getStaticFieldContent(field, buffer, fieldValueSize)) { GenTree* cnsValue = gtNewGenericCon(fieldType, buffer); if (cnsValue != nullptr) diff --git a/src/coreclr/tools/Common/JitInterface/CorInfoImpl.cs b/src/coreclr/tools/Common/JitInterface/CorInfoImpl.cs index 5638e885771ee5..6fb079fcdd717f 100644 --- a/src/coreclr/tools/Common/JitInterface/CorInfoImpl.cs +++ b/src/coreclr/tools/Common/JitInterface/CorInfoImpl.cs @@ -770,6 +770,7 @@ private object HandleToObject(void* handle) { Debug.Assert(handle != null); #if DEBUG + Debug.Assert((s_handleHighBitSet & (nint)handle) != 0); handle = (void*)(~s_handleHighBitSet & (nint)handle); #endif int index = ((int)handle - handleBase) / handleMultiplier; diff --git a/src/coreclr/tools/aot/ILCompiler.RyuJit/JitInterface/CorInfoImpl.RyuJit.cs b/src/coreclr/tools/aot/ILCompiler.RyuJit/JitInterface/CorInfoImpl.RyuJit.cs index 86a63a64bce39a..d41b7767b59331 100644 --- a/src/coreclr/tools/aot/ILCompiler.RyuJit/JitInterface/CorInfoImpl.RyuJit.cs +++ b/src/coreclr/tools/aot/ILCompiler.RyuJit/JitInterface/CorInfoImpl.RyuJit.cs @@ -2346,13 +2346,15 @@ private bool getStaticFieldContent(CORINFO_FIELD_STRUCT_* fieldHandle, byte* buf .GetPreinitializationInfo(owningType).GetFieldValue(field); int targetPtrSize = _compilation.TypeSystemContext.Target.PointerSize; + bool isObjectHandleBuffer = + (valueOffset == 0) && ((bufferSize == targetPtrSize) || (bufferSize == sizeof(nint))); if (value == null) { - if ((valueOffset == 0) && (bufferSize == targetPtrSize)) + if (isObjectHandleBuffer) { // Write "null" to buffer - new Span(buffer, targetPtrSize).Clear(); + new Span(buffer, bufferSize).Clear(); return true; } else @@ -2374,11 +2376,13 @@ private bool getStaticFieldContent(CORINFO_FIELD_STRUCT_* fieldHandle, byte* buf return false; case FrozenObjectNode: - if ((valueOffset == 0) && (bufferSize == targetPtrSize)) + if (isObjectHandleBuffer) { // save handle's value to buffer nint handle = ObjectToHandle(data); - new Span(&handle, targetPtrSize).CopyTo(new Span(buffer, targetPtrSize)); + Span destination = new Span(buffer, bufferSize); + destination.Clear(); + new ReadOnlySpan(&handle, Math.Min(sizeof(nint), bufferSize)).CopyTo(destination); return true; } return false; diff --git a/src/tests/JIT/Methodical/jitinterface/bug603649.cs b/src/tests/JIT/Methodical/jitinterface/bug603649.cs index 04fb49d2ee02a6..46600a1ca703b7 100644 --- a/src/tests/JIT/Methodical/jitinterface/bug603649.cs +++ b/src/tests/JIT/Methodical/jitinterface/bug603649.cs @@ -11,7 +11,6 @@ public class foo private static object s_o = typeof(string); [Fact] [OuterLoop] - [ActiveIssue("https://github.com/dotnet/runtime/issues/122013", typeof(TestLibrary.Utilities), nameof(TestLibrary.Utilities.IsNativeAot), nameof(TestLibrary.Utilities.Is32))] public static int TestEntryPoint() { bool f = typeof(string) == s_o as Type; diff --git a/src/tests/Regressions/coreclr/15647/interfacestatics.ilproj b/src/tests/Regressions/coreclr/15647/interfacestatics.ilproj index d4d95de5764ab1..e2c3ed6fb730e7 100644 --- a/src/tests/Regressions/coreclr/15647/interfacestatics.ilproj +++ b/src/tests/Regressions/coreclr/15647/interfacestatics.ilproj @@ -1,10 +1,7 @@ - + true - - partial - true